Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具,通过 Docker Compose 可以高效管理具有多个服务(容器)的应用。
文章参考:菜鸟教程
一、基本介绍
一般每个Docker容器只运行一个进程,如果应用包含多个服务,每个服务又至少需要运行一个容器,这样如果每次启停应用都需要启停多个容器,这样就导致维护效率低而且容易出错,这时可以使用 Docker-compose 工具,Docker-compose 通过 YML 文件配置应用程序需要的所有服务,然后使用一个命令就可以创建并启动所有服务,使用过程主要包括两个步骤:
-
使用 docker-compose.yml 编写定义多服务(多容器)应用的 YAML 文件
-
执行
docker-compose up
命令来启动并运行整个应用程序
Docker-compose工具需要单独安装,可以使用下载安装包安装或者利用pip安装,具体安装方法可以参考:
Docker compose安装文档
二、使用方法
Docker-compose中有两个个核心概念:
- 项目 (Project):由一个或一组关联的服务组成,Docker-compose面向项目进行管理
- 服务 (Service):由一个或一组关联的Docker应用容器组成
(一) docker-compose 命令
命令格式为:docker-compose [OPTIONS] [COMMAND] [ARGS...]
OPTIONS 包括:
- -h,–help:查看帮助信息
- -f,–file FILE:指定yaml模板文件,默认为 docker-compose.yml
- -p,–project-name NAME:指定项目名称,默认将所在目录名称作为项目名
- –verbose:输出详细信息
- -v,–version:打印版本信息
COMMAND 可大致分为服务依赖镜像管理和服务容器管理两类:
1.服务依赖镜像管理
拉取服务依赖的镜像:
docker-compose pull [options] [SERVICE...]
# OPTIONS:
# –ignore-pull-failures:忽略拉取镜像过程中的错误
# –parallel:多个镜像同时拉取
# –quiet:拉取镜像过程中不打印进度信息
构建项目中的服务镜像:
docker-compose build [OPTIONS] [SERVICE...]
# OPTIONS:
# --force-rm:总是删除镜像构建过程中产生的中间容器
# --no-rm:不删除构建过程中产生的中间容器
# --parallel:并行构镜像
# --pull:尝试拉取最新版本的镜像
推送服务依赖的镜像:
docker-compose push [options] [SERVICE...]
# OPTIONS:
# –ignore-push-failures:忽略推送镜像过程中的错误
验证并查看docker-compose.yml文件配置:
docker-compose config [options]
# OPTIONS:
# -q,--quiet:只验证配置,配置正确时不输出任何内容,配置错误时输出错误信息
# --services:打印服务名,一行一个
# --volumes:打印卷名,一行一个
2.服务容器管理
构建、创建、并启动运行服务容器:
docker-compose up [OPTIONS] [SERVICE...]
# OPTIONS:
# -d,--detach:后台运行
# --no-start:在创建服务镜像后并不运行
# --scale SERVICE=NUM:指定运行的服务数量,覆盖docker-compose.yml中设置的scale
停止服务,删除容器、网络、卷、镜像:
docker-compose down
列出服务容器:
docker-compose ps [options] [SERVICE...]
# OPTIONS:
# -q,--quiet:仅显示容器ID号
# -a,--all:显示所有容器,包括停止运行的容器
# --services:仅显示服务名称
为服务创建容器:
docker-compose create [options] [SERVICE...]
# OPTIONS:
# --force-recrete:重新创建容器,即使配置和镜像没有改变
# --no-recreate:如果容器已经存在,则不需要重新创建容器
# --no-build:不创建镜像,即使缺失
# --build:创建容器前生成镜像
启动/终止/暂停/恢复/重启 服务容器:
docker-compose start [SERVICE...]
docker-compose stop [SERVICE...]
docker-compose pause [SERVICE...]
docker-compose unpause [SERVICE...]
docker-compose restart [SERVICE...]
删除项目中的服务容器:
docker-compose rm [options] [SERVICE...]
# OPTIONS:
# -f,--force:强制直接删除,包括非停止状态的容器
# -s,--stop:在删除容器前停止其运行
# -v:删除容器所挂载的数据卷
强制终止服务容器:
docker-compose kill [options] [SERVICE...]
# OPTIONS:
# –s SIGNAL:终止容器时发给容器的信号,默认为SIGKILL
创建并启动指定的容器,然后执行一个命令:
docker-compose run [options] SERVICE [COMMAND] [ARGS...]
# OPTIONS:
# -d,--detach:后台运行
# --name NAME:为服务容器指定名字
# --entrypoint CMD:覆盖容器启动时的运行命令
在运行的容器中执行一个命令:
docker-compose exec [options] SERVICE COMMAND [ARGS...]
# OPTIONS:
# -d,--detach:后台运行
# -u,--user USER:以USER身份执行命令
# -T:禁止分配TTY,默认分配
# --privileged:给执行命令的进程赋予特权
# --index=INDEX:当服务拥有多个容器时,通过INDEX指定执行命令的容器
显示正在运行的进程:
dokcer-compose top [SERVICE...]
设置指定服务运行容器的个数,通过service=num
的参数来设置数量:
docker-compose scale SERVICE=NUM [SERVICE1=NUM1] ...
注意:大部分命令需要在 docker-compose.yml 目录下执行,不然需要用 -f 参数指定。
(二) docker-compose.yml
YAML是一种通用的数据串行化格式,主要注意以下几点:
- 大小写敏感,使用缩进表示层级关系
- 缩进不允许使用Tab,只允许空格,空格数不重要,只要相同层级的元素左对齐即可
- 数据类型包括:
对象:键值对的集合,格式为:key: value
,冒号后面要加一个空格
数组:一组按次序排列的值,-
开头的行表示构成一个数组,也可以单行表示key: [value1, value2, ...]
纯量:最基本的、不可再分的值,包括字符串、布尔值、整数、Null、浮点数、时间、日期等
docker-compose.yml是Compose用于自动化管理服务镜像和容器的配置文件,主要包括三个部分:
- version:版本信息
- services:服务信息
- networks:网络配置信息
下面以模板形式介绍docker-compose.yml的常用配置方法:
version: "1.0" # 声明版本
services:
<service_name1>: # 服务名称
image: <image_name1> # 镜像名称/ID,如果本地不存在Compose会拉取镜像
ports: # 端口映射
- <host_num>:<container_num>
build: <path> # 指定Dockerfile所在路径,Compose利用其构建镜像
depends_on: # 指定服务容器依赖,避免因为顺序导致启动失败的问题
- <service_name2> # Compose会先启动依赖的服务容器
- <service_name3>
volumes:
- <container_path> # 仅指定一个容器内路径,Compose会自动创建
- <container_path>:<host_path> # 数据卷映射(挂载),以便于服务和数据持久化
command: <command> # 覆盖容器启动时执行的命令
dns: # 指定DNS服务器
- <dns_server1>
- <dns_server2>
environment:
<var_name1>: <value1> # 以对象(键值对)的形式表示,也可以以序列(-)形式表示
<var_name2>: <value2>
networks: # 加入指定的网络
- <network_name1>
- <network_name2>
deploy: # 指定与部署和运行服务相关的配置
mode: replicated # 默认为replicated,此时需要指定容器数量;如果为global,则为只有一个容器,不用再指定数量
replicas: <num> # 指定容器数据量
restart_policy: # 配置容器重启条件
condition: on-failure
delay: <sec>
max_attempts: <num>
update_config: # 配置容器更新服务
parallelism: <num>
delay: <sec>
<service_name2>:
image: <image_name2>
build:
context: <context_path> # 指定上下文路径
dockerfile: <relative_path> # 在上下文路径基础上指定相对路径
args:
<arg_name>: <value> # 指定构建过程中环境变量,构建成功变量释放
links:
- <service_name1> # 指定相关联的服务
...
networks: # 定义网络配置
<network_name1>:
driver: bridge
config:
- ipv4_address: <address>
<network_name2>:
...
下面是Docker官网部署Wordpress的例子,配置文件名为 “stack.yml”:
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:
运行命令sudo docker-compose -f stack.yml up
,启动所有服务容器,然后访问:http://localhost:8080