本文收錄在容器技術學習系列文章總目錄
1、Docker Compose 概述
Compose是一個用於定義和運行多容器Docker應用程序的工具。使用Compose,您可以使用Compose文件來配置應用程序的服務。然后,使用單個命令,您可以從配置中創建並啟動所有服務。
Compose非常適合開發,測試和登台環境以及CI工作流程。
(1)官方文檔
(2)使用Compose基本上是一個三步過程
- 定義您的應用程序環境,Dockerfile以便可以在任何地方進行復制。
- 定義構成應用程序的服務,docker-compose.yml以便它們可以在隔離環境中一起運行。
- 最后,運行docker-compose up和Compose將啟動並運行整個應用程序。
(3)一個 docker-compose.yml 文件案例:
version: '2' services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: redis
有關Compose文件的詳細信息,請參閱 Compose文件參考。
(4)Compose具有管理應用程序整個生命周期的命令:
- 啟動,停止和重建服務
- 查看正在運行的服務的狀態
- 流式傳輸運行服務的日志輸出
- 在服務上運行一次性命令
2、Docker Compose 安裝
2.1 安裝條件
(1)前提
Docker Compose 依靠Docker Engine 進行任何有意義的工作,因此請確保您已在本地或遠程安裝Docker Engine,具體取決於您的設置。
要以非root用戶身份運行Compose,請參閱以非root用戶身份管理Docker。
(2)安裝系統(主要講linux、pip安裝)
- Linux
- Mac
- Windows
- 備用安裝選項(使用pip安裝/安裝為容器)
2.2 在Linux系統上安裝Compose
(1)下載安裝
在gitlab https://github.com/docker/compose/releases 上查詢適合自己的版本
我這里下載的是1.23.2 版本
$ sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
(2)添加執行權限
$ chmod +x /usr/local/bin/docker-compose
(3)安裝完成,查詢版本
$ docker-compose --version docker-compose version 1.23.2, build 1110ad01
2.3 備用安裝選項(使用pip安裝/安裝為容器)
2.3.1 使用pip安裝
可以使用pypi安裝Compose pip。如果你安裝使用pip,我們建議你使用 virtualenv,因為許多操作系統都有python系統包與docker-compose依賴項沖突。請參閱virtualenv教程以開始使用。
$ pip install docker-compose
如果你沒有使用virtualenv
$ sudo pip install docker-compose
注:需要6.0或更高版本的pip。
2.3.2 安裝為容器
Compose也可以在一個容器內運行,來自一個小的bash腳本包裝器。要將compose安裝為容器,請運行此命令。如果此示例已過期,請務必將版本號替換為所需的版本號:
$ sudo curl -L --fail https://github.com/docker/compose/releases/download/{{site.compose_version}}/run.sh -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
2.4 其他系統安裝(略)
2.4.1 在macOS上安裝Compose
Docker Desktop for Mac和Docker Toolbox已經包含Compose和其他Docker應用程序,因此Mac用戶無需單獨安裝Compose。Docker安裝說明如下:
2.4.2 在Windows系統上安裝Compose
Docker Desktop for Windows和Docker Toolbox已經包含Compose和其他Docker應用程序,因此大多數Windows用戶不需要單獨安裝Compose。Docker安裝說明如下:
如果您直接在Microsoft Windows Server 2016上運行Docker守護程序和客戶端(使用適用於Windows Server 2016的Docker EE,則需要安裝Docker Compose。為此,請按照下列步驟操作
2.5 Docker Compose 升級
如果從Compose 1.2或更早版本升級,請在升級Compose后刪除或遷移現有容器。這是因為,從版本1.3開始,Compose使用Docker標簽來跟蹤容器,並且需要重新創建容器以添加標簽。
如果Compose檢測到沒有標簽創建的容器,它將拒絕運行,因此您最終不會使用兩組。如果要繼續使用現有容器(例如,因為它們具有要保留的數據卷),可以使用Compose 1.5.x使用以下命令遷移它們:
docker-compose migrate-to-labels
或者,如果您不擔心保留它們,可以將它們刪除。撰寫只是創建新的。
docker container rm -f -v myapp_web_1 myapp_db_1 ...
2.6 Docker Compose 卸載
正常系統安裝卸載:
sudo rm /usr/local/bin/docker-compose
pip安裝卸載:
pip uninstall docker-compose
3、一個完整的Docker Compose 運用演示
3.1 compose 准備
(1)創建compose 工作目錄
[root@along ~]# mkdir composetest [root@along ~]# cd composetest/
(2)創建一個app.py文件,后面在項目目錄中調用文件
[root@along composetest]# vim app.py import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
注:redis是應用程序網絡上redis容器的主機名。我們使用Redis的默認端口6379。
(3)創建requirements.txt 項目目錄中調用的另一個文件
[root@along composetest]# vim requirements.txt flask redis
3.2 創建Dockerfile,用於啟動一個簡單的容器
創建一個名為的文件Dockerfile
[root@along composetest]# vim Dockerfile FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"]
注:從Python 3.4映像開始構建映像。詳細的dockerfile用法詳見:Docker系列07—Dockerfile 詳解
- 將當前目錄添加.到/code映像中的路徑中。
- 將工作目錄設置為/code。
- 安裝Python依賴項。
- 將容器的默認命令設置為python app.py。
3.3 在Compose文件中定義服務
創建docker-compose.yml項目目錄中調用的文件
[root@along composetest]# vim docker-compose.yml version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
此Compose文件定義了兩個服務,web和redis。該web服務:
- 使用從Dockerfile當前目錄中構建的圖像。
- 將容器上的公開端口5000轉發到主機上的端口5000。我們使用Flask Web服務器的默認端口5000。
該redis服務使用從Docker Hub注冊表中提取的公共 Redis映像。
3.4 使用Compose構建並運行您的應用程序
(1)在項目目錄中,啟動應用程序 docker-compose up
[root@along composetest]# docker-compose up Recreating composetest_web_1 ... done Starting composetest_redis_1 ... done Attaching to composetest_redis_1, composetest_web_1 redis_1 | 1:C 15 Jan 2019 07:03:23.107 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo redis_1 | 1:C 15 Jan 2019 07:03:23.107 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started redis_1 | 1:C 15 Jan 2019 07:03:23.107 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf redis_1 | 1:M 15 Jan 2019 07:03:23.108 * Running mode=standalone, port=6379. redis_1 | 1:M 15 Jan 2019 07:03:23.108 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. redis_1 | 1:M 15 Jan 2019 07:03:23.108 # Server initialized redis_1 | 1:M 15 Jan 2019 07:03:23.108 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. redis_1 | 1:M 15 Jan 2019 07:03:23.108 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. redis_1 | 1:M 15 Jan 2019 07:03:23.108 * DB loaded from disk: 0.000 seconds redis_1 | 1:M 15 Jan 2019 07:03:23.108 * Ready to accept connections
(2)瀏覽器查詢http://192.168.130.102:5000/,驗證
(3)刷新頁面,數字應該增加
(4)另開一個終端,查看鏡像驗證
[root@along harbor]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE composetest_web latest ca6d50ca9694 About a minute ago 77.2MB redis alpine b42dc832c855 3 weeks ago 40.9MB python 3.4-alpine bb81744a76cf 3 weeks ago 65.8MB
(5)關閉服務
在新開的終端docker-compose down,或者在啟動應用程序的原始終端中按CTRL + C來停止應用程序。
3.5 修改compose 配置,添加存儲卷
[root@along composetest]# vim docker-compose.yml version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: "redis:alpine"
注:新volumes密鑰將主機上的項目目錄(當前目錄)/code安裝到容器內,允許您動態修改代碼,而無需重建映像。
3.6 測試存儲卷
(1)重新啟動compose
[root@along composetest]# docker-compose up Recreating composetest_web_1 ... done Starting composetest_redis_1 ... done Attaching to composetest_redis_1, composetest_web_1 redis_1 | 1:C 15 Jan 2019 07:03:23.107 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo redis_1 | 1:C 15 Jan 2019 07:03:23.107 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started redis_1 | 1:C 15 Jan 2019 07:03:23.107 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf redis_1 | 1:M 15 Jan 2019 07:03:23.108 * Running mode=standalone, port=6379. ... ...
(2)在宿主機的存儲卷上,修改代碼
[root@along composetest]# vim app.py return 'Hello World! I am along! I have been seen {} times.\n'.format(count)
將Hello World! 郵件更改為Hello World! I am along!
(3)再在瀏覽器刷新,驗證成功
3.7 docker-compose 其他命令
(1)在后台運行服務,-d(用於“分離”模式)
[root@along composetest]# docker-compose up -d Starting composetest_web_1 ... done Starting composetest_redis_1 ... done
(2)使用docker-compose ps以查看當前正在運行的內容
[root@along composetest]# docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------- composetest_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp composetest_web_1 python app.py Up 0.0.0.0:5000->5000/tcp
(3)docker-compose run命令允許您為服務運行一次性命令。例如,要查看web服務可用的環境變量 :
[root@along composetest]# docker-compose run web env PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=3848578f8fff TERM=xterm LANG=C.UTF-8 GPG_KEY=97FC712E4C024BBEA48A61ED3A5CA953F73C700D PYTHON_VERSION=3.4.9 PYTHON_PIP_VERSION=18.1 HOME=/root
(4)停止服務
[root@along composetest]# docker-compose stop Stopping composetest_web_1 ... done Stopping composetest_redis_1 ... done
(5)使用該down 命令完全刪除容器。加--volumes 參數還可以刪除Redis容器使用的數據卷
[root@along composetest]# docker-compose down --volumes Removing composetest_web_run_18e4bbaa4b33 ... done Removing composetest_web_1 ... done Removing composetest_redis_1 ... done Removing network composetest_default