[Docker Compose定义运行多个Docker容器]
Posted 刘较瘦丫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Docker Compose定义运行多个Docker容器]相关的知识,希望对你有一定的参考价值。
[Docker Compose定义运行多个Docker容器]
Docker Compose
定义和运⾏多个 Docker 容器的应⽤(Defining and running multi-container Dockerapplications)
我们知道使⽤⼀个 Dockerfile 模板⽂件,可以让⽤户很⽅便的定义⼀个单独的应⽤容器。然⽽,在⽇常⼯作
中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现⼀个 Web 项⽬,除了 Web 服务容器本身,
往往还需要再加上后端的数据库服务容器,甚⾄还包括负载均衡容器等。
Compose 恰好满⾜了这样的需求。它允许⽤户通过⼀个单独的 docker-compose.yml 模板⽂件(YAML格
式)来定义⼀组相关联的应⽤容器为⼀个项⽬(project)。
docker-compose是容器编排工具,需要注意的是,docker-compose只是单机的容器编排工具。
容器编排:管理多个容器
Compose 中有两个重要的概念
服务 ( service )
⼀个应⽤的容器,实际上可以包括若⼲运⾏相同镜像的容器实例。
项目 ( project )
由⼀组关联的应⽤容器组成的⼀个完整业务单元,在 docker-compose.yml ⽂件中定义
Compose 的默认管理对象是项⽬,通过⼦命令对项⽬中的⼀组容器进⾏便捷地⽣命周期管理。
Compose 项⽬由 Python 编写,实现上调⽤了 Docker 服务提供的 API 来对容器进⾏管理。因此,只要所操作的平台⽀持 Docker API,就可以在其上利⽤ Compose 来进⾏编排管理。
安装docker-compose
1、下载
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2、修改权限
chmod +x /usr/local/bin/docker-compose
3、文件更名
mv /usr/local/bin/docker-compose /usr/local/bin/docker-compose-Linux-x86_64
4、创建软连接
ln -s /usr/local/bin/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
5、下载bash命令补全
curl -L https://raw.githubusercontent.com/docker/compose/1.25.5/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
6、测试docker-compose是否安装成功
docker-compose --version
显示如下结果,表示成功
# docker-compose version 1.24.0, build 0aa59064
卸载docker-compose
如果是⼆进制包⽅式安装的,删除⼆进制⽂件即可。
rm /usr/local/bin/docker-compose /usr/local/bin/docker-compose-Linux-x86_64
docker-compose的使用
模板⽂件是使⽤ Compose 的核⼼,涉及到的指令关键字也⽐较多。但⼤家不⽤担⼼,这⾥⾯⼤部分指令跟
docker run 相关参数的含义都是类似的。
默认的模板⽂件名称为 docker-compose.yml ,格式为 YAML 格式。
docker-compose.yaml模板
参考⽂档:https://github.com/yeasy/docker_practice/blob/master/compose/compose_file.md
version: "3.0"
services:
django:
image: django:v3
ports:
- "8000:8000"
container_name: django
networks:
- django
depends_on:
- mysql
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 123456
container_name: mysql
volumes:
- "/root/docker-compose/mysql/data:/var/lib/mysql"
networks:
- django
depends_on:
- redis
redis:
image: redis:latest
container_name: redis
networks:
- django
networks:
django:
image :指定启动的镜像名称或ID
指定为要启动的镜像名称或镜像 ID。如果镜像在本地不存在, Compose 将会尝试拉取这个镜像(公网下载)。
build :构建镜像启动
每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来⾃动构建⽣成镜像。
如果使⽤ build 指令,在 Dockerfile 中设置的选项(例如: CMD , EXPOSE , VOLUME , ENV 等) 将
会⾃动被获取,⽆需在 docker-compose.yml 中重复设置。
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
context : 指令指定 Dockerfile 所在⽂件夹的路径。
dockerfile :指令指定 Dockerfile ⽂件名。
arg :指令指定构建镜像时的变量。
ports :暴露端口信息
使⽤宿主端⼝:容器端⼝格式,或者仅仅指定容器的端⼝(宿主将会随机选择端⼝)都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
expose : 暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数
expose:
- "3000"
- "8000"
command : 覆盖容器启动后默认执行的命令
设置容器启动命令
command: echo "hello world"
container_name : 指定容器名称
默认将会使⽤ 项⽬名称_服务名称_序号 这样的格式。
container_name: docker-web-container
depends_on : 解决容器的依赖、启动先后的问题
version: \'3\'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
上面会先启动 redis db 再启动 web
注意: web 服务不会等待 redis db 「完全启动」之后才启动。
dns :自定义 DNS 服务器
可以是⼀个值,也可以是⼀个列表
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
environment : 设置环境变量
你可以使⽤数组或字典两种格式
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
只给定名称的变量会⾃动获取运⾏ Compose 主机上对应变量的值,可以⽤来防⽌泄露不必要的数据。
如果变量名称或者值中⽤到 true|false,yes|no 等表达 布尔 含义的词汇,最好放到引号⾥,避免 YAML
⾃动解析某些内容为对应的布尔语义。这些特定词汇,包括
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
networks : 配置容器连接的⽹络
version: "3"
services:
some-service:
networks: # 给启动的容器设置两个网桥
- some-network
- other-network
networks: # 设置两个网桥
some-network:
other-network:
network_mode : 设置网络模式
使⽤和 docker run 的 --network 参数⼀样的值。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
env_file :从文件中获取环境变量
从⽂件中获取环境变量,可以为单独的⽂件路径或列表。
如果通过 docker-compose -f FILE ⽅式来指定 Compose 模板⽂件,则 env_file 中变量的路径会基于模板
⽂件路径。
如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
环境变量⽂件中每⼀⾏必须符合格式,⽀持 # 开头的注释⾏。
# common.env: Set development environment
PROG_ENV=development
volumes :数据卷所挂载路径设置
和 -v 差不多,不过-v是宿主主机映射到容器,两边同步。
而volumes直接就是两边数据同步。
healthcheck : 通过命令检查容器是否健康运行
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"] # 执行的命令
interval: 1m30s # 间隔时间
timeout: 10s # 设置超时时间
retries: 3 # 设置允许失败次数
test: ["CMD", "ping", "-c1","-t1", "http://localhost"] # 执行的命令
# -c1 : 只 ping 一次
# -t1 :时间是一秒钟,超出1秒则超时
docker-compose参数
启动:docker-compose up # 启动docker-compose.yaml文件里面的容器
删除:docker-compose down # 删除docker-compose.yaml文件里面的容器
重启:docker-compose restart [容器的名称...] # 重新启动其中的一个容器
进入容器:docker-compose exec [参数] [SERVICE] [CMD] # 默认使用-T(类似 -it )
停止:docker-compose stop [SERVICE] # 停⽌已经处于运⾏状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器查看各个服务容器内运⾏的进程
删除容器:docker-compose rm [SERVICE] # 删除服务,停止之后才能删除
-f, --force 强制直接删除,包括⾮停⽌状态的容器。⼀般尽量不要使⽤该选项。
-v 删除容器所挂载的数据卷。
容器列表:docker-compose ps # 查看容器列表
启动:docker-compose start [SERVICE...] # 启动已经存在的服务容器
查看容器进程:docker-compose top # 查看各个服务容器内运⾏的进程
暂停运行:docker-compose pause # 暂停服务容器
恢复运行:docker-compose unpause # 回复暂停状态的服务容器
可视化工具
version: \'3.0\'
services:
portainer:
image: portainer/portainer-ce
ports:
- "8001:8000"
- "9001:9000"
container_name: portainer
networks:
- "portainer"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/root/docker-compose/portainer_data:/data"
healthcheck:
test: ["CMD", "ping", "-c1", "-t1", "portainer"]
interval: 30s
timeout: 10s
retries: 3
networks:
portainer:
以上是关于[Docker Compose定义运行多个Docker容器]的主要内容,如果未能解决你的问题,请参考以下文章