Docker Compose
本篇介绍 Docker Compose 的概念与三步使用流程、Compose 的安装、
docker-compose.yml文件的结构与常用指令,并通过一个 Python Web + Redis 的实战示例贯穿构建、启动、后台运行、停止与查看环境变量等常用命令。
一、Docker Compose 简介
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,可以通过一个 YAML 文件来配置应用程序的服务,然后使用一条命令从配置中创建并启动所有服务。
使用 Compose 基本上是一个三步过程:
- 定义应用程序的环境,编写
Dockerfile,以便应用可以在任何地方复制运行。 - 定义构成应用程序的服务,编写
docker-compose.yml,以便各服务可以在隔离的环境中一起运行。 - 运行
docker-compose up,Compose 启动并运行整个应用程序。
docker-compose.yml 模板
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
二、安装 Docker Compose
2.1 下载二进制文件
运行以下命令下载 Docker Compose 的当前稳定版本(以 1.24.0 为例):
curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
如需安装其他版本,将命令中的 1.24.0 替换为所需的 Compose 版本即可。
2.2 赋予可执行权限
chmod +x /usr/local/bin/docker-compose
或者设置软链接:
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
2.3 验证安装
docker-compose -version
docker-compose version 1.24.0, build 0aa59064
三、docker-compose.yml 结构说明
docker-compose.yml 通过 YAML 语法描述服务,常用顶层与服务级指令如下:
| 指令 | 层级 | 说明 |
|---|---|---|
version |
顶层 | 指定 Compose 文件格式版本,如 '3' |
services |
顶层 | 定义应用的各个服务 |
volumes |
顶层 | 声明可供服务挂载的数据卷 |
networks |
顶层 | 声明服务使用的网络 |
image |
服务级 | 指定服务所使用的镜像 |
build |
服务级 | 指定构建上下文(包含 Dockerfile 的目录路径),Compose 会基于此构建镜像 |
ports |
服务级 | 暴露端口,格式为 "宿主机端口:容器端口" |
volumes |
服务级 | 挂载数据卷或绑定宿主机目录 |
environment |
服务级 | 设置容器环境变量 |
depends_on |
服务级 | 设置服务依赖与启动顺序 |
networks |
服务级 | 指定服务加入的网络 |
links |
服务级 | 连接到其他服务(较旧写法,新版本推荐使用网络) |
四、实战:在 Compose 上运行 Python Web 应用
下面构建一个运行在 Docker Compose 上的 Python Web 应用程序。开始前请确保已安装 Docker 和 Docker Compose。
4.1 创建项目目录
mkdir /composetest
cd /composetest
4.2 编写 app.py
在目录中创建 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)
4.3 编写 requirements.txt
创建 requirements.txt,声明 Python 依赖:
flask
redis
4.4 编写 Dockerfile
编写用于构建镜像的 Dockerfile,该镜像包含 Python 应用所需的全部依赖(包括 Python 本身):
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
指令解析:
| 指令 | 说明 |
|---|---|
FROM |
从 Python 3.4 镜像开始构建 |
ADD |
将当前目录 . 添加到镜像中的 /code 路径 |
WORKDIR |
将工作目录设置为 /code |
RUN |
安装 Python 依赖项 |
CMD |
将容器的默认命令设置为 python app.py |
4.5 编写 docker-compose.yml
创建 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 镜像。
4.6 使用 Compose 构建并运行
在项目目录下执行:
docker-compose up
Creating network "test_default" with the default driver
Building web
Step 1/5 : FROM python:3.4-alpine
3.4-alpine: Pulling from library/python
8e402f1a9c57: Pull complete
cda9ba2397ef: Pull complete
aafecf9bbbfd: Pull complete
bc2e7e266629: Pull complete
e1977129b756: Pull complete
Digest: sha256:c210b660e2ea553a7afa23b41a6ed112f85dbce25cbcb567c75dfe05342a4c4b
Status: Downloaded newer image for python:3.4-alpine
---> c06adcf62f6e
Step 2/5 : ADD . /code
---> 3db85f1ea02e
Step 3/5 : WORKDIR /code
---> Running in 2b89a8fdd46c
Removing intermediate container 2b89a8fdd46c
---> b7810a62cb13
Step 4/5 : RUN pip install -r requirements.txt
---> Running in 3bea2169e30e
DEPRECATION: Python 3.4 support has been deprecated. pip 19.1 will be the last one supporting it. Please upgrade your Python as Python 3.4 won't be maintained after March 2019 (cf PEP 429).
Collecting flask (from -r requirements.txt (line 1))
......
构建完成后,在浏览器输入 http://<服务器IP>:5000,即可看到 Web 界面。
五、Compose 常用命令
5.1 后台运行与停止
使用 -d 参数让容器在后台运行:
docker-compose up -d
Starting test_web_1 ... done
Starting test_redis_1 ... done
停止运行中的容器:
docker-compose stop
Stopping test_web_1 ... done
Stopping test_redis_1 ... done
5.2 查看服务环境变量
使用 run 可以一次性运行某个服务中的命令,例如查看 web 服务的环境变量:
docker-compose run web env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=8e3d7bb7ac53
TERM=xterm
LANG=C.UTF-8
GPG_KEY=97FC712E4C024BBEA48A61ED3A5CA953F73C700D
PYTHON_VERSION=3.4.10
PYTHON_PIP_VERSION=19.0.3
HOME=/root
5.3 更多命令
可通过以下命令查看完整帮助:
docker-compose --help
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
--verbose Show more output
--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the
name specified in the client certificate
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
--compatibility If set, Compose will attempt to convert keys
in v3 files to their non-Swarm equivalent
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
常用命令速查:
| 命令 | 作用 |
|---|---|
docker-compose up |
创建并启动容器(前台运行) |
docker-compose up -d |
创建并启动容器(后台运行) |
docker-compose down |
停止并删除容器、网络、镜像和数据卷 |
docker-compose ps |
列出 Compose 管理的容器 |
docker-compose logs |
查看容器输出 |
docker-compose stop |
停止服务 |
docker-compose start |
启动服务 |
docker-compose restart |
重启服务 |
docker-compose build |
构建或重新构建服务镜像 |
docker-compose exec <service> <cmd> |
在运行中的服务容器里执行命令 |
docker-compose run <service> <cmd> |
一次性运行服务中的命令 |
docker-compose scale <service>=n |
设置某服务的容器数量 |
docker-compose rm |
删除已停止的容器 |
此处评论已关闭