本文收录在容器技术学习系列文章总目录
1,Docker Compose 概述
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具. 使用 Compose, 您可以使用 Compose 文件来配置应用程序的服务. 然后, 使用单个命令, 您可以从配置中创建并启动所有服务.
Compose 非常适合开发, 测试和登台环境以及 CI 工作流程.
(1) 官方文档
Docker 的网站 https://docs.docker.com/compose/ 上提供了完整的文档.
Compose 的代码存储库位于 GitHub 上 https://github.com/docker/compose .
(2) 使用 Compose 基本上是一个三步过程
定义您的应用程序环境, Dockerfile 以便可以在任何地方进行复制.
定义构成应用程序的服务, docker-compose.YAML 以便它们可以在隔离环境中一起运行.
最后, 运行 docker-compose up 和 Compose 将启动并运行整个应用程序.
(3) 一个 docker-compose.YAML 文件案例:
- 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 安装说明如下:
获取适用于 Mac 的 Docker Desktop
获取 Docker Toolbox(适用于旧系统)
2.4.2 在 Windows 系统上安装 Compose
Docker Desktop for Windows 和 Docker Toolbox 已经包含 Compose 和其他 Docker 应用程序, 因此大多数 Windows 用户不需要单独安装 Compose.Docker 安装说明如下:
获取适用于 Windows 的 Docker Desktop
获取 Docker Toolbox(适用于旧系统)
如果您直接在 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.YAML 项目目录中调用的文件
- [root@along composetest]# VIM docker-compose.YAML
- 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.YAML
- 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
来源: https://www.cnblogs.com/along21/p/10272308.html