前端之路:緊跟潮流,docker簡單應用

Docker

what is docker ?

  • 根據官網描述,docker 是一個容器平臺,是標準化的軟件單元,使用了虛擬化技術(cgroup:提供容器隔離;UnionFS:保存鏡像並使容器變得短暫),基於Google推出的go語言實現的開源項目,代碼在 GitHub 上進行維護。

why use docker ?

  • 快速交付和部署html

    • 輕快:一次建立或配置,可在任意地方正常運行,秒級啓動,節約開發、測試、部署時間。
  • 高效虛擬化前端

    • 基於內核的虛擬化,不須要額外hypervisor支持,CPU/內存的低消耗,更高效。
  • 可移植、可擴展node

    • 物理機、虛擬機、公有云、私有云、我的電腦、服務器等平臺都可以運行
  • 對比傳統虛擬機linux

    特性 容器 虛擬機
    啓動 秒級 分鐘級
    硬盤使用 通常MB 通常GB
    性能 接近原生 弱於原生
    系統支持量 單機上千個容器 通常幾十個

    compare

  • 能夠總結出,docker能夠實現:nginx

    • 隔離應用依賴
    • 建立應用鏡像並進行復制
    • 建立易分發的即啓即用的應用
    • 容許實例簡單、快速擴展
    • 測試應用並隨後銷燬

可見docker的 野心 是建立 ===軟件程序可移植的輕量容器===,讓其能夠在任何安裝了docker的機器上運行,而不用關心底層操做系統。git

how to use docker ?

先了解一下幾個基本概念:github

鏡像:是一個只讀的模版,用來建立docker容器,容器在啓動的時候建立一層可寫層做爲最上層docker


容器:從鏡像建立的運行實例,能夠被啓動、開始、中止、刪除。容器間是相互隔離的,看上去是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序shell


倉庫:相似 git,集中存放鏡像文件的場所,分爲公開倉庫(Public)和私有倉庫(Private),最大的公開倉庫是 Docker Hub數據庫


註冊服務器:相似GitHub 這樣的託管服務,存放着多個倉庫


宿主機:docker所在的服務器


數據卷:可供一個或多個容器使用的特殊目錄,相似於 Linux 下對目錄或文件進行 mount,它繞過 UFS,能夠提供不少有用的特性:

  • 在容器之間共享和重用
  • 對數據卷的修改會立馬生效
  • 對數據卷的更新,不會影響鏡像
  • 卷會一直存在,直到沒有容器使用

網絡模式:用來實現容器的網絡通訊,大概包括五種:

  • bridge模式,--net=bridge(默認)
  • host模式,--net=host
  • none模式,--net=none
  • 其餘容器模式(即container模式),--net=container:NAME_or_ID
  • 用戶自定義:docker 1.9版本之後新增的特性

瞭解更多


Dockerfile:易於自動化的命令,包含建立鏡像所需的所有指令,基於dockerfile中的指令,咱們可使用 $ docker build 命令來建立鏡像,經過減小鏡像和容器的建立過程來簡化部署。語法命令:

  • INSTRUCTION argument 指令不區分大小寫,但命名約定爲所有大寫
  • FROM
    • 格式爲 FROM <image>FROM <image>:<tag>
    • 第一條指令必須爲 FROM 指令。而且,若是在同一個Dockerfile中建立多個鏡像時,可使用多個 FROM 指令(每一個鏡像一次)
  • MAINTAINER
    • 格式爲 MAINTAINER <name>,指定維護者信息
  • RUN
    • 格式爲 RUN <command>RUN ["executable", "param1", "param2"]
    • 前者將在 shell 終端中運行命令,即 /bin/sh -c;後者則使用 exec 執行。指定使用其它終端能夠經過第二種方式實現,例如 RUN ["/bin/bash", "-c", "echo hello"]
    • 每條 RUN 指令將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像。當命令較長時可使用 \ 來換行
  • CMD
    • CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式
    • CMD command param1 param2/bin/sh 中執行,提供給須要交互的應用
    • CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數
    • 指定啓動容器時執行的命令,每一個 Dockerfile 只能有一條 CMD 命令。若是指定了多條命令,只有最後一條會被執行
    • 若是用戶啓動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令
  • EXPOSE
    • 格式爲 EXPOSE <port> [<port>...]
    • 告訴 Docker 服務端容器暴露的端口號,供互聯繫統使用。在啓動容器時須要經過 -P,Docker 主機會自動分配一個端口轉發到指定的端口
  • ENV
    • 格式爲 ENV <key> <value>。 指定一個環境變量,會被後續 RUN 指令使用,並在容器運行時保持。
  • ADD
    • 格式爲 ADD <src> <dest>
    • 該命令將複製指定的 <src> 到容器中的 <dest>。 其中 <src> 能夠是Dockerfile所在目錄的一個相對路徑;也能夠是一個 URL;還能夠是一個 tar 文件(自動解壓爲目錄)
  • COPY
    • 格式爲 COPY <src> <dest>
    • 複製本地主機的 <src>(爲 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>。當使用本地目錄爲源目錄時,推薦使用 COPY,能用 COPY 的狀況下不用 ADD
  • ENTRYPOINT
    • ENTRYPOINT ["executable", "param1", "param2"]
    • ENTRYPOINT command param1 param2(shell中執行)
    • 配置容器啓動後執行的命令,而且不可被 docker run 提供的參數覆蓋
    • 每一個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效
  • VOLUME
    • 格式爲 VOLUME ["/data"]
    • 建立一個能夠從本地主機或其餘容器掛載的掛載點,通常用來存放數據庫和須要保持的數據等
  • USER
    • 格式爲 USER daemon
    • 指定運行容器時的用戶名或 UID,後續的 RUN 也會使用指定用戶
    • 當服務不須要管理員權限時,能夠經過該命令指定運行用戶。而且能夠在以前建立所須要的用戶,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時獲取管理員權限可使用 gosu,而不推薦 sudo
  • WORKDIR
    • 格式爲 WORKDIR /path/to/workdir

    • 爲後續的 RUN、CMD、ENTRYPOINT 指令配置工做目錄

    • 可使用多個 WORKDIR 指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑。例如:

    • WORKDIR /a

    • WORKDIR b

    • WORKDIR c

      則最終路徑爲 /a/b/c

  • ONBUILD
    • 格式爲 ONBUILD [INSTRUCTION]

    • 配置當所建立的鏡像做爲其它新建立鏡像的基礎鏡像時,所執行的操做指令

    • 例如,Dockerfile 使用以下的內容建立了鏡像 image-A

      [...]
        ONBUILD ADD . /app/src
        ONBUILD RUN /usr/local/bin/node-build --dir /app/src
        [...]
      複製代碼

      若是基於 image-A 建立新的鏡像時,新的Dockerfile中使用 FROM image-A指定基礎鏡像時,會自動執行 ONBUILD 指令內容,等價於在後面添加了兩條指令:

      FROM image-A
      
        #Automatically run the following
        ADD . /app/src
        RUN /usr/local/bin/node-build --dir /app/src
      複製代碼

      使用 ONBUILD 指令的鏡像,推薦在標籤中註明,例如 ruby:1.9-onbuild

編寫完成 Dockerfile 以後,能夠經過 $ docker build 命令來建立鏡像

  • 基本的格式爲 $ docker build [選項] 路徑,該命令將讀取指定路徑下(包括子目錄)的 Dockerfile,並將該路徑下全部內容發送給 Docker 服務端,由服務端來建立鏡像。所以通常建議放置 Dockerfile 的目錄爲空目錄。也能夠經過 .dockerignore 文件(每一行添加一條匹配模式)來讓 Docker 忽略路徑下的目錄和文件
  • 例如:$ docker build -t ${dockerImageName} --force-rm -f ./Dockerfile .

=========================================================

以上是一些基本概念,如今ubuntu下開始安裝docker並啓動一個nginx容器(其實大多數場景下nginx不必跑在容器裏,這裏只是舉個例子)

=========================================================

$ cat /etc/issue
Ubuntu 16.04.6 LTS \n \l
複製代碼
  1. 經過shell命令安裝:

    1. $ curl -sSL https://get.docker.com/ | sh
    2. 更多平臺及安裝方式
  2. 檢驗安裝,顯示版本信息,說明已成功安裝:

    $ docker -v
    Docker version 18.09.5, build e8ff056
    複製代碼

    ps:$ docker info可查看更多信息

  3. 下面開始建立一個容器:

     $ docker run❶ \
     -d❷ \
     --name=demo❸ \
     -u root❹ \
     -p 8002:80❺ \
     -v /var/demo:/var/demo❻ \
     nginx:latest❼
    複製代碼

    該命令表示:基於nginx:latest這個鏡像,建立一個名稱爲demo的容器,並把容器內部的80端口與宿主機上的8002端口作映射,使得經過宿主機8002端口的流量轉發到容器內部的80端口上

    ❶:run 新建並啓動容器,更多選項,其標準過程:

    • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載(docker pull xxx)
    • 利用鏡像建立並啓動一個容器
    • 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
    • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
    • 從地址池配置一個 ip 地址給容器
    • 執行用戶指定的應用程序
    • 執行完畢後容器被終止

    ❷:-d Daemonized模式,以守護態形式在後臺運行容器


    ❸:--name=demo 爲容器起一個名字


    ❹:-u 指定容器的用戶


    ❺:-p 端口映射,規則是 -p 宿主機端口:容器端口,可屢次使用映射多個端口


    ❻:-v 掛載數據卷,規則是 -v 宿主機目錄:容器目錄,可屢次使用掛載多個數據卷


    ❼:鏡像名,該容器所用的鏡像名,可經過 $ docker images 查看本地鏡像

  4. 查看正在運行的容器:

    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
    c24cfee8226a        nginx:latest        "nginx -g 'daemon of…"   6 minutes ago       Up 6 minutes        0.0.0.0:8002->80/tcp          demo
    複製代碼

    ps:$ docker ps -a查看全部容器(包括正在運行的、已中止的)

    如今訪問宿主機的8002端口(安全組開通),便可看到nginx的歡迎頁面:

    nginx:welcom

  5. 進入容器:

    執行 $ docker exec -it demo bash ,demo也能夠換成容器的id即:$ docker exec -it c24cfee8226a bash

    shell

    在容器內可執行 $ netstat -lntp 查看端口使用狀況:

    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
     tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1/nginx: master pro
    複製代碼

    若發現netstat not found,先執行 $ apt update && apt install net-tools

    執行 $ exit 退出容器

    ps經常使用命令:

    • $ docker inspect demo 能夠查看該容器更多信息
    • $ docker stop 容器名/id 終止容器
    • $ docker rm 容器名/id 刪除未運行的容器
    • $ docker rmi 鏡像名/id 刪除未佔用(無容器正在運行)的鏡像
    • $ docker rmi $(docker images -f "dangling=true" -q) 批量刪除爲 none(無容器正在運行)的鏡像

【參考】:

  1. www.kancloud.cn/kancloud/do…
  2. leilux.github.io/lou/docker_…
  3. docs.docker.com
  4. blog.csdn.net/ithaibianti…

===🧐🧐 文中不足,歡迎指正 🤪🤪===

最後:下一次講一下,基於docker,搭建ci(jenkins)構建部署前端項目

相關文章
相關標籤/搜索