Docker 實戰筆記:部署 Compose 應用

前言

Docker Compose的前身是FigFig是一個由Orchard公司開發的多容器管理工具。這是一個基於DockerPython工具,容許用戶基於一個YAML文件定義多容器應用,從而可使用fig命令行工具進行應用的部署,還能實現對應用的生命週期進行管理。然後,Docker公司收購了Fig,並更爲爲Docker Compose,命令行工具fig改名爲docker-compose,自此成爲綁定在Docker引擎之上的外部工具。python

安裝Docker Compose

Linux上安裝Docker Compose可分爲兩步:git

  • 使用curl命令下載二進制文件
  • 使用chmod命令賦予權限
  • 驗證版本號github

    $ curl -L \
    curl -L https://github.com/docker/compose/releases/download/1.25.1-rc1/docker-compose-\
    `uname -s`-`uname -m` \
    -o /usr/local/bin/docker-compose
    $ chmod +x /usr/local/bin/docker-compose 
    $ docker-compose --version #查看版本
    docker-compose version 1.25.1-rc1, build d92e9bee

Compose 文件

Docker Compose使用YAML文件來定義多服務的應用,網絡和卷,文件存放的默認路徑是:./docker-compose.yml,可傳入-f參數指定具體文件,而且支持.yml.yaml擴展名。YAML文件是JSON的一個子集(JSONJavaScript的子集),所以也可使用JSON文件進行數據傳輸。web

YAML文件有如下語法規則:redis

  • 大小寫敏感
  • 使用縮進表示層級關係,相同縮進表示同級key(理解爲相同層級)
  • 縮進時不容許使用Tab鍵,只容許使用空格。
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊便可
  • # 表示註釋,從這個字符一直到行尾,都會被解析器忽略。

使用Docker Compose部署應用

  • 幫助文檔
$ docker-compose --help #查看幫助
  • 拉取源碼,查看項目結構docker

    $ git clone https://github.com/nigelpoulton/counter-app.git
    $ cd counter-app/
    $ tree -C #查看樹狀圖結構
    .
    ├── app.py
    ├── docker-compose.yml
    ├── Dockerfile
    ├── README.md
    └── requirements.txt
    用tree查看工做目錄結構,一目瞭然!

    簡要介紹這幾個文件:app.py是應用程序代碼(一個Python Flask應用)同時也是核心文件;docker-compose.ymlCompose文件,用於指導Docker如何部署應用;Dockerfile定義瞭如何構建應用服務的鏡像;requirements.txt列出了應用所需依賴的Python包。shell

  • 啓動Compose應用數組

    $ docker-compose up & #前臺啓動應用,&表示返回終端窗口

    默認狀況下,docker-compose up會查找名爲docker-compose.ymldocker-compose.yamlCompose文件。*若是Compose文件是其餘文件名,則須要經過-f參數來指定瀏覽器

    $ docker-compose -f prod-equus-bass.yml up #指定prod-equus-bass.yml文件名啓動應用

    若是須要在後臺啓動應用,須要傳入-d參數:網絡

    $ docker-compose up -f prod-equus-bass.yml up -d #指定文件名在後臺啓動應用

    查看啓動Compose應用的過程當中構建或者拉取的鏡像:

    請注意,第1行的鏡像名counter-app_web-fe 會將項目名稱counter-app和服務應用名稱web-fe鏈接,做爲新構建的鏡像名稱。

    $ docker image ls
    REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
    counter-app_web-fe           latest              19989da561d9        14 minutes ago      84.5MB
    redis                        alpine              a49ff3e0d85f        11 days ago         29.3MB
    python                       3.4-alpine          c06adcf62f6e        8 months ago        72.9MB

    查看Dockerfile文件信息:

    FROM python:3.4-alpine  #基礎鏡像
    ADD . /code             #將app.py文件複製到鏡像中
    WORKDIR /code           #設置工做目錄
    RUN pip install -r requirements.txt #安裝依賴
    CMD ["python", "app.py"] #設置默認啓動的應用

    查看Docker Container信息:

    顯示出兩個容器,都是以項目名稱counter-app爲前綴的容器名稱。此外,觀察容器名的數組後綴1表示容器實例序號——與容器擴縮容有關

    $ docker container ls 
    CONTAINER ID       IMAGE           COMMAND                  CREATED                 STATUS   
    c3a032dfd36b    redis:alpine  "docker-entrypoint.s…"   30 minutes ago          Up 30 minutes
    fa448d107b92   counter-app_web-fe   "python app.py" 30 minutes ago      Up 30 minutes
    PORTS                         NAMES
    6379/tcp                 counter-app_redis_1    #注意這裏的數字後綴1
    0.0.0.0:5000->5000/tcp   counter-app_web-fe_1

    查看網絡和卷:

    $ docker network ls #網絡
    79a6c4de07ff        bridge                    bridge              local
    e0de8f8c1f7b        counter-app_counter-net   bridge              local
    38598419a27a        host                      host                local
    c90f1a680fa6        none                      null                local
    $ docker volume ls #卷
    local               22ae5189527230e12431b9125d66b28e91d93eb96eaeac86078de217aa25665a
    local               counter-app_counter-vol
  • 應用部署測試

    應用部署成功後,在瀏覽器輸入ip:port形式查看應用的運行效果

    3

    因爲咱們使用的是在前臺啓動應用,使用&HTTP狀態碼和日誌返回到終端上,這時候能夠看到:

    2

使用Docker Compose管理應用

若是想要對一個應用的生命週期進行管理,可使用如下命令:

$ docker-compose up #啓動應用
$ docker-compose restart #重啓應用
$ docker-compose stop #中止應用,不會刪除資源
$ docker-compose rm #刪除應用和網絡,只留下卷和鏡像
$ docker-compose down #刪除應用和網絡,只留下鏡像、卷、源碼
Stopping counter-app_redis_1  ...
Stopping counter-app_web-fe_1 ...
redis_1   | 1:signal-handler (1575369323) Received SIGTERM scheduling shutdown...
redis_1   | 1:signal-handler (1575369323) Received SIGTERM scheduling shutdown...
redis_1   | 1:signal-handler (1575369323) Received SIGTERM scheduling shutdown...
redis_1   | 1:M 03 Dec 2019 10:35:23.818 # User requested shutdown...
redis_1   | 1:M 03 Dec 2019 10:35:23.818 * Saving the final RDB snapshot before exiting.
redis_1   | 1:M 03 Dec 2019 10:35:23.818 # User requested shutdown...
redis_1   | 1:M 03 Dec 2019 10:35:23.818 * Saving the final RDB snapshot before exiting.
redis_1   | 1:M 03 Dec 2019 10:35:23.818 # User requested shutdown...
redis_1   | 1:M 03 Dec 2019 10:35:23.818 * Saving the final RDB snapshot before exiting.
redis_1   | 1:M 03 Dec 2019 10:35:23.820 * DB saved on disk
redis_1   | 1:M 03 Dec 2019 10:35:23.820 # Redis is now ready to exit, bye bye...
redis_1   | 1:M 03 Dec 2019 10:35:23.820 * DB saved on disk
redis_1   | 1:M 03 Dec 2019 10:35:23.820 # Redis is now ready to exit, bye bye...
redis_1   | 1:M 03 Dec 2019 10:35:23.820 * DB saved on disk
redis_1   | 1:M 03 Dec 2019 10:35:23.820 # Redis is now ready to exit, bye bye...
Stopping counter-app_web-fe_1 ... done
counter-app_web-fe_1 exited with code 0
counter-app_web-fe_1 exited with code 0
counter-app_redis_1 exited with code 0
Stopping counter-app_redis_1  ... done
counter-app_redis_1 exited with code 0
Removing counter-app_redis_1  ... done
Removing counter-app_web-fe_1 ... done
Removing network counter-app_counter-net
[1]   已完成               docker-compose up
[2]-  已完成               docker-compose up
[3]+  已完成               docker-compose up
$ docker-compose ps #查看應用日誌
Name   Command   State   Ports
------------------------------

須要特別注意的是,雖然部署應用被刪除了,可是counter-vol卷並無被刪除,由於卷是應用於數據的持久化存儲的。所以,卷的生命週期與相應的容器應該是徹底解耦的,刪除或啓動容器,並不會影響到卷。

$ docker volume ls #查看卷
local               22ae5189527230e12431b9125d66b28e91d93eb96eaeac86078de217aa25665a
local               counter-app_counter-vol
$ docker-compose ps #查看應用日誌
        Name                      Command               State           Ports
--------------------------------------------------------------------------------------
counter-app_redis_1    docker-entrypoint.sh redis ...   Up      6379/tcp
counter-app_web-fe_1   python app.py                    Up      0.0.0.0:5000->5000/tcp

若是再次啓動應用,會發現啓動速度變得更快了,這是由於已經存在,不須要再去拉取和構建新的鏡像。

若是想要查看應用內的進程,則須要:

$ docker-compose top #查看應用內進程
counter-app_redis_1
  UID      PID    PPID   C   STIME   TTY     TIME         CMD
------------------------------------------------------------------
guest-r+   1216   1165   0   18:42   ?     00:00:00   redis-server

counter-app_web-fe_1
UID    PID    PPID   C   STIME   TTY     TIME                    CMD
------------------------------------------------------------------------------------
root   1231   1181   0   18:42   ?     00:00:00   python app.py
root   1426   1231   0   18:42   ?     00:00:02   /usr/local/bin/python /code/app.py

注意,PID編號是在docker主機上,而不是容器(應用)內的進程ID

DockerfileDocker Compose文件的對比

Dockerfile 文件和Docker Compose文件最大的區別是:前者的代碼文件是複製到./code目錄,然後者的代碼文件是直接掛載到捲上的,若是卷中有任何修改,這種變化會馬上反映到應用中。

查看卷掛載於Docker主機上的什麼位置:

$ docker volume inspect counter-vol | grep Mount
相關文章
相關標籤/搜索