Docker Compose
的前身是Fig
,Fig
是一個由Orchard
公司開發的多容器管理工具。這是一個基於Docker
的Python
工具,容許用戶基於一個YAML
文件定義多容器應用,從而可使用fig
命令行工具進行應用的部署,還能實現對應用的生命週期進行管理。然後,Docker
公司收購了Fig
,並更爲爲Docker Compose
,命令行工具fig
改名爲docker-compose
,自此成爲綁定在Docker
引擎之上的外部工具。python
在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
Docker Compose
使用YAML
文件來定義多服務的應用,網絡和卷,文件存放的默認路徑是:./docker-compose.yml
,可傳入-f
參數指定具體文件,而且支持.yml
和.yaml
擴展名。YAML
文件是JSON
的一個子集(JSON
是JavaScript
的子集),所以也可使用JSON
文件進行數據傳輸。web
YAML
文件有如下語法規則:redis
key
(理解爲相同層級)#
表示註釋,從這個字符一直到行尾,都會被解析器忽略。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.yml
是Compose
文件,用於指導Docker
如何部署應用;Dockerfile
定義瞭如何構建應用服務的鏡像;requirements.txt
列出了應用所需依賴的Python
包。shell
啓動Compose
應用數組
$ docker-compose up & #前臺啓動應用,&表示返回終端窗口
默認狀況下,docker-compose up
會查找名爲docker-compose.yml
或docker-compose.yaml
的Compose
文件。*若是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
形式查看應用的運行效果
因爲咱們使用的是在前臺啓動應用,使用&
將HTTP
狀態碼和日誌返回到終端上,這時候能夠看到:
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
。
Dockerfile
和Docker Compose
文件的對比Dockerfile 文件和Docker Compose
文件最大的區別是:前者的代碼文件是複製到./code
目錄,然後者的代碼文件是直接掛載到捲上的,若是卷中有任何修改,這種變化會馬上反映到應用中。
查看卷掛載於Docker
主機上的什麼位置:
$ docker volume inspect counter-vol | grep Mount