本文收錄在容器技術學習系列文章總目錄html
Compose是一個用於定義和運行多容器Docker應用程序的工具。使用Compose,您可使用Compose文件來配置應用程序的服務。而後,使用單個命令,您能夠從配置中建立並啓動全部服務。python
Compose很是適合開發,測試和登臺環境以及CI工做流程。linux
(1)官方文檔git
(2)使用Compose基本上是一個三步過程github
(3)一個 docker-compose.yml 文件案例:web
version: '2' services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: redis
有關Compose文件的詳細信息,請參閱 Compose文件參考。redis
(4)Compose具備管理應用程序整個生命週期的命令:docker
(1)前提flask
Docker Compose 依靠Docker Engine 進行任何有意義的工做,所以請確保您已在本地或遠程安裝Docker Engine,具體取決於您的設置。vim
要以非root用戶身份運行Compose,請參閱以非root用戶身份管理Docker。
(2)安裝系統(主要講linux、pip安裝)
(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
可使用pypi安裝Compose pip。若是你安裝使用pip,咱們建議你使用 virtualenv,由於許多操做系統都有python系統包與docker-compose依賴項衝突。請參閱virtualenv教程以開始使用。
$ pip install docker-compose
若是你沒有使用virtualenv
$ sudo pip install docker-compose
注:須要6.0或更高版本的pip。
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
Docker Desktop for Mac和Docker Toolbox已經包含Compose和其餘Docker應用程序,所以Mac用戶無需單獨安裝Compose。Docker安裝說明以下:
Docker Desktop for Windows和Docker Toolbox已經包含Compose和其餘Docker應用程序,所以大多數Windows用戶不須要單獨安裝Compose。Docker安裝說明以下:
若是您直接在Microsoft Windows Server 2016上運行Docker守護程序和客戶端(使用適用於Windows Server 2016的Docker EE,則須要安裝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 ...
正常系統安裝卸載:
sudo rm /usr/local/bin/docker-compose
pip安裝卸載:
pip uninstall docker-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
建立一個名爲的文件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 詳解
建立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服務:
該redis服務使用從Docker Hub註冊表中提取的公共 Redis映像。
(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來中止應用程序。
[root@along composetest]# vim docker-compose.yml version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: "redis:alpine"
注:新volumes密鑰將主機上的項目目錄(當前目錄)/code安裝到容器內,容許您動態修改代碼,而無需重建映像。
(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)再在瀏覽器刷新,驗證成功
(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