参考
https://docs.docker.com/compose/compose-file/02-model/
https://mp.weixin.qq.com/s/Qenn7cdaX76ZVmK-mLRwdQ
https://mp.weixin.qq.com/s/3PEE28VomBYo5O525BaSzQ
https://www.jianshu.com/p/2217cfed29d7
docker compose是单机版的容器编排工具
docker-compose 项目是docker官方的开源项目, 负责实现对docker容器集群的快速编排,来轻松高效的管理容器,定义运行多个容器。
docker-compose将所管理的容器分为三层, 分别是工程(project),服务(service)以及容器(containner)
docker-compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。
一个工程当中,可以包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
一个服务中可以包括多个容器实例
docker compose安装
方法1
yum install -y python2-pip
pip install docker-compose
方法2
yum -y install python36
pip3 install docker-compose
方法3
curl -SL https://github.com/docker/compose/releases/download/v2.17.0/docker-compose-linux-x86_64 -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose命令补全
yum install bash-completion
curl -L https://raw.githubusercontent.com/docker/compose/1.29.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
之后退出并重新登录即可
docker-compose命令
docker-compose [COMMAND] --help 或者docker-compose help [COMMAND]
格式
docker-compose [-f ...] [--profile ...] [options] [--] [COMMAND] [ARGS...]
Options参数选项
-f,--file file指定模板文件,默认是docker-compose.yml模板文件,可以多次指定
--profile 启动具有配置文件的服务
-p,--project-name name指定项目名称,默认使用所在目录名称作为项目名称
--x-networking 使用Docker的后端可插拔网络特性
--x-networking-driver driver指定网络的后端驱动,默认使用bridge
--verbose 输入更多的调试信息
-v,--version 输出版本信息
COMMAND参数详解
build Build or rebuild services (构建项目中的服务容器)
bundle Generate a Docker bundle from the Compose file (从Compose文件生成分布式应用程序包)
config Validate and view the Compose file (验证并查看Compose文件)
create Create services (为服务创建容器)
down Stop and remove containers, networks, images, and volumes (停止容器并删除由其创建的容器,网络,卷和图像up)
events Receive real time events from containers (为项目中的每个容器流式传输容器事件)
exec Execute a command in a running container (这相当于docker exec。使用此子命令,您可以在服务中运行任意命令。默认情况下,命令分配TTY,因此您可以使用命令docker-compose exec web sh来获取交互式提示。)
help Get help on a command (获得一个命令的帮助)
images List images ()
kill Kill containers (通过发送SIGKILL信号来强制停止服务容器)
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 yaml语法
docker-compose语法版本可以参考官方文档
https://docs.docker.com/compose/compose-file/
语法说明
version: "3" #docker-compose语法版本
services: #容器
servicename1: #服务名称,这个名称也是内部bridge网络可以使用的DNS name
build: ./目录 # 指定一个包含 Dockerfile 的目录
image: "镜像名称" #镜像名称
container_name: 容器名称
command: #可选,如果设置,则会覆盖默认镜像里面的CMD命令
environment: #可选,相当于 docker run里面的--env
- var: value
volumes: #可选,相当于docker run里面的 -v
- volumename:容器中目录:rw
healthcheck: #健康检查
test: 检测命令
interval: 30s
timeout: 10s
retries: 3
networks: #可选,相当于docker run里面的--network
- networkname
ports: #可选,相当于docker run里面的-p
- 8080:5000
links: #连接另一个服务
- servicename
depends_on: #依赖另一个服务
- servicename
restart: always #重启策略
devices:
- "/dev/kmsg:/dev/kmsg"
ulimits: #设置ulimit
nofile:
soft: "65535"
hard: "65535"
user: username:groupname #运行容器时的用户
configs:
- source: configname
target: 容器中文件
secrets:
- source: secretname
target: 容器中文件
deploy: #服务部署配置
replicas: 3
resources:
limits:
cpus: '0.5'
memory: '256M'
reservations:
cpus: '0.25'
memory: '128M'
servicename2: #服务名称,这个名称也是内部bridge网络可以使用的DNS name
build: ./目录 # 指定一个包含 Dockerfile 的目录
image: "镜像名称" #镜像名称
container_name: 容器名称
command: #可选,如果设置,则会覆盖默认镜像里面的CMD命令
environment: #可选,相当于 docker run里面的--env
- var: value
volumes: #可选,相当于docker run里面的 -v
- volumename:容器中目录:rw
networks: #可选,相当于docker run里面的--network
- networkname
ports: #可选,相当于docker run里面的-p
- 8080:5000
links: #连接另一个服务
- servicename
depends_on: #依赖另一个服务
- servicename
restart: always #重启策略
user: username:groupname #运行容器时的用户
configs:
- source: configname
target: 容器中文件
secrets:
- source: secretname
target: 容器中文件
deploy: #服务部署配置
replicas: 3
resources:
limits:
cpus: '0.5'
memory: '256M'
reservations:
cpus: '0.25'
memory: '128M'
volumes: #可选,相当于 docker volume create
volumename:
networks: #可选,相当于 docker network create
networkname:
driver: bridge
external: true
configs:
configname:
file: 宿主机文件
secrets:
secretname:
file: 宿主机文件
version: "3"
services:
servicename1:
build: ./目录
image: "镜像名称"
container_name: 容器名称
command:
environment:
- var: value
volumes:
- volumename:容器中目录
networks:
- networkname
ports:
- 8080:5000
links:
- servicename
depends_on:
- servicename
restart: always
user: username:groupname
configs:
- source: configname
target: 容器中文件
secrets:
- source: secretname
target: 容器中文件
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: '256M'
reservations:
cpus: '0.25'
memory: '128M'
servicename2:
build: ./目录
image: "镜像名称"
container_name: 容器名称
command:
environment:
- var: value
volumes:
- volumename:容器中目录
networks:
- networkname
ports:
- 8080:5000
links:
- servicename
depends_on:
- servicename
restart: always
user: username:groupname
configs:
- source: configname
target: 容器中文件
secrets:
- source: secretname
target: 容器中文件
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: '256M'
reservations:
cpus: '0.25'
memory: '128M'
volumes:
volumename:
networks:
networkname:
driver: bridge
configs:
configname:
file: 宿主机文件
secrets:
secretname:
file: 宿主机文件
docker compose示例
示例1
mkdir my_wordpress
cd my_wordpress/
vim docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
启动
docker-compose -f docker-compose.yml up
后台启动
docker-compose -f docker-compose.yml up -d
示例2
version: '3'
services:
web:
image: dockercloud/hello-world
ports:
- 8080
networks:
- front-tier
- back-tier
redis:
image: redis
links:
- web
networks:
- back-tier
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
- web
networks:
- front-tier
- back-tier
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
docker compose 官方文档示例
version: '3'
services:
frontend:
image: awesome/webapp
ports:
- "443:8043"
networks:
- front-tier
- back-tier
configs:
- httpd-config
secrets:
- server-certificate
backend:
image: awesome/database
volumes:
- db-data:/etc/data
networks:
- back-tier
volumes:
db-data:
driver: flocker
driver_opts:
size: "10GiB"
configs:
httpd-config:
external: true
secrets:
server-certificate:
external: true
networks:
# The presence of these objects is sufficient to define them
front-tier: {}
back-tier: {}
docker-compose更新服务
1.使用docker-compose up -d命令更新容器
如果已经修改了docker-compose.yml文件,并且希望更新其中的某个容器,可以直接使用docker-compose up -d命令。该命令会更新docker-compose.yml中修改过的服务,并根据修改的设置进行重新配置。例如:
docker-compose up -d service-name
其中 service-name是需要更新的服务名。
2.使用docker-compose stop和docker-compose rm命令重新启动容器
如果需要完全重启一个容器,并清除其中的所有数据,可以使用以下两个命令:
docker-compose stop service-name
docker-compose rm -f service-name
docker-compose up -d service-name
这会停止并删除名为 service-name 的容器,并根据docker-compose.yml重新启动它。这种方法比较适用于需要对容器进行某些比较复杂的更改,或者在更新过程中出现了一些问题
附
docker-compose 一组容器之间无法通过容器名称通信,可能是宿主机防火墙导致,关闭主机防火墙,恢复备份的iptables规则,然后docker-compose down && docker-compose up -d
iptables规则备份恢复
#保存iptables规则
iptables-save > iptables_bak
#恢复iptables规则
iptables-restore < iptables_bak
#查看iptables规则
iptables -t filter -nL
iptables -t nat -nL