本文收录在容器技术学习系列文章总目录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