Docker Compose 命令及使用
简介
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,帮助定义和运行多个 Docker 容器的应用,其前身是开源项目 Fig。
DockerFile 可以让用户很方便的定义一个单独的应用容器,然而在日常工作中们经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务器容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求,它允许通过一个单独的 docker-compose.yml 模板文件,来定义一组相关联的应用容器为一个项目。
Compose 中有两个重要的概念
- 服务(service),一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目(project),由一组关联的应用容器组成的一个完整业务单元,再 docker-compose.yml 文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以再其上利用 Compose 来进行编排管理。
安装与卸载
安装的话,可以安装 Docker Desktop ,它包含了 Docker 以及 Compose 和 K8s,也可以单独安装,但建议先了解清楚官方对 Compose 的一些安装限制。官方地址
linux 安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
命令
命令 | 描述 |
---|---|
version | 版本目前4以下的都可以写,如3.9,3.8等,最好保持和docker版本相同 |
services | 可以里面描述你的所有服务,以及依赖关系等 |
image | 指定为镜像名称或镜像ID,如果镜像在本地不存在,Compose将会尝试拉取这个镜像 |
ports | 指定与宿主机与容器映射的端口,是一个数组,每个数组的元素建议用字符形式,如 "80:80" |
volumes | 挂载路径设置,类型为数组,可以挂载多个。 |
networks | 配置容器连接的网络 docker network ls 查看网络列表,docker network inspect <container id>可以查看对应网络的配置 |
environment | 设置环境变量。你可以使用数组或字典两种方式 |
env_file | 从文件中获取环境变量,可以为单独的文件路径或列表,文件内必须是字典方式编写 |
command | 覆盖容器启动后默认执行的命令 |
depends_on | 解决容器的依赖、启动先后的问题,填写的值为 服务名,会等依赖的服务启动一定程度才启动自己 |
healthcheck | 通过命令检查容器是否监控运行 |
sysctls | 配置容器内核参数,如ES等都需要修改内核的环境参数 |
ulimits | 指定容器的 ulimits 限制值,如ES、Clickhouse会有修改需求 |
build | 用来将指定Dockerfile打包成对应镜像,然后再运行该镜像 |
这些命令其实就类似于我们在Docker中启动一个容器的命令。
Compose文件编写
示例1
# 版本
version: "3.2"
services:
# 服务名称
tomcat:
# 指定容器的名称 相当于 --name
container_name: tomcat_1
# 使用哪个镜像 相当于 docket run image
image: tomcat:8.0-jre8
# 指定宿主机与容器端口的映射 相当于 -p
ports:
- "8080:8080"
# 宿主机与容器的数据共享 挂载目录 相当于 -v
volumes:
# 方式1:指定绝对明确(绝对路径)的挂载目录
- /home/server:/user
# 方式2:声明了自定创建卷名的变量
- tomcatwebapps:/user
# 代表当前服务处于那个网络,作用是网络隔离用,会把相网络名称相同的容器的网段统一。相当于 --network
networks:
- group1
mysql:
image: mysql:5.7.32
container_name: mysql
ports:
- "3306:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
environment:
-MYSQL_ROOT_PASSWORD=root
networks:
group1
# 描述 挂在卷里的变量
volumes:
# 指定变量 tomcatwebapps,如果不写 external,默认会是 docker-compose.yml 所在当前文件夹的名称(会自动创建)
tomcatwebapps:
# 使用自定义卷毛
external:
# true 确定使用指定卷名,注意:一旦使用外部自定义卷名,启动服务之前必须手动创建 docker volume create 卷名
false
mysqldata:
mysqlconf:
# 定义服务用到的网络
networks:
# 定义上面的服务用到的网络的名称,默认是驱动属于 bridge,自定义的网络名称 group1,在实际中会变为 项目名(或所在文件目录名)
group1:
# 使用外部指定的网络,为 true 就标识网络必须存在
external:
# docker network create -d bridge 网络名称
true
示例2
# 指定版本,版本的关系和Docker 引擎有关
# https://docs.docker.com/compose/compose-file/compose-file-v3/#profiles 版本关系及说明
version: '3.7'
# 指定服务
services:
# 服务名称 唯一
monitor-web-server-service:
# 构建镜像的项目路径
build:
# 指定上下文路径,默认是微服务项目的根目录
context: ./monitor-web/monitor-web-server/
# 指定
dockerfile: monitor-web-server-service
# 指定镜像名称
image: monitor-web-server-service
# .env的环境变量
env_file:
- ./.env
# 网络配置
networks:
- internal_access
- external_access # db access
monitor-web-socket-service:
build: ./monitor-web/monitor-web-socket/monitor-web-socket-service
image: boboweike/monitor-web-socket-service
env_file:
- ./.env
# 依赖的项目,启动的时候根据依赖关系定义启动顺序
depends_on:
- monitor-web-server-service
networks:
- internal_access
- external_access # db access
monitor-gateway:
build: ./monitor-gateway
image: boboweike/monitor-gateway
# 设置内部和外部端口
ports:
- 80:80
env_file:
- ./.env
# 依赖的项目,启动的时候根据依赖关系定义启动顺序
depends_on:
- monitor-web-server-service
- monitor-web-server-service
networks:
- internal_access
- external_access
# 心跳检查
healthcheck:
# 访问 monitor-gateway 网关的命令
test: [ "CMD","curl","-f","http://localhost:80" ]
# 间隔时间
interval: 1m30s
# 超时时间
timeout: 10s
# 重试次数
retries: 3
mysql:
image: mysql:5.7.32
container_name: mysql
ports:
- "3306:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
env_file:
- ./mysql.env
networks:
- external_access
# 修改内核参数,也可以是数组的方式
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
# 指定容器的 ulimits 限制值,例如 ,
ulimits:
# 指定最大进程数为 65535
nproc: 65535
# 指定文件句柄数为
nofile:
# 软限制 200000(软限制,应用可以随时修改,不能超过硬限制)
soft: 20000
# 硬限制(系统硬限制,只能root用户提高)
hard: 40000
myaccount-service:
build:
context: ./frontend
dockerfile: myaccount/Dockerfile
image: boboweike/myaccount-spa
networks:
- internal_access
networks:
internal_access:
internal: true
external_access:
Compose 指令
对于Compose来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到影响。
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令选项
- -f -> --file FILE 指定使用的Compose模板把文件,默认为 docker-compose.yml,可以多次指定。
- -p -> --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名
- --x-networking 使用Docker可插拔网络后端特性
- --verbose 输出更多调试信息。
- -v -> --version 打印版本并退出。
命令使用说明
up
docker-compose up [options] [SERVICE...]
- 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
- 连接的服务都将会被自动启动,除非已经处于运行状态
- 大部分的时候都可以直接通过该命令来启动一个项目。
- 默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
- 当通过 Ctrl-c 停止命令时,所有容器将会停止
- 如果使用 docker-compose up -d,将会再后台启动并运行所有的容器,一般推荐生产环境下使用该选项。
- 默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。
down
docker-compose down
此命令将会停止 up 命令所启动的容器,并移除网络
exec
docker-compose exec 服务名
进入指定的容器
ps
docker-compose ps [options] [SERVICE...]
列出项目中目前的所有容器。
- -q ,可以以打印容器的ID信息
restart
docker-compose restart [options] [service...]
重启项目中的服务,选项 -t 指定重启前停止容的超时时间(默认10s)
rm
docker-compose rm [options] [service...]
删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
- -f 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
- -v 删除容器所挂载的数据卷。
start
docker-compose start [service...]
启动已经存在的服务容器
stop
docker-compose stop [options] [service...]
停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器
- -t 停止容器的超时时间(默认为10s)
top
docker-compose top
查看各个服务容器内运行的进程。
pause,unpause
docker-compose pause [service...]
暂停处于运行中的服务。
docker-compose unpause [service...]
恢复处于暂停状态中的服务。
logs
docker-compose logs [service...]
查看某个服务的日志