Compose模板指令
用来书写在 docker-compose.yml
文件中指令称之为模板指令,作用对象是Compose中的Services。
1. Image
作用:
指定为镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取这个镜像。
示例:
version: "3.2"
services:
tomcat:
image: tomcat:8.0-jre8
2. build
作用:
该命令和image有异曲同工之妙,如果使用image,一般是先编辑Dockerfile,然后再将Dockerfile手动构建成镜像到本地库,最后再使用image引入本地库中的镜像。
使用了build,编辑完Dockfile之后就不需要手动构建成镜像了,Compose帮助我们参照Dockerfile自动构建镜像到本地库,再引入本地库中的镜像。
示例:
version: "3.2"
services:
postilhub:
build:
# 上下文目录(相对路径)
context: ./postilhub
# Dockerfile文件名(默认为Dockerfile)
dockerfile: Dockerfile
# 镜像打包后运行的容器名
container_name: postilhub
# 映射容器内9000端口
ports:
- "9000:9000"
# 该服务依赖于tomcat服务
depends_on: "tomcat"
tomcat:
image: tomcat:8.0-jre8
3. ports
作用:
暴露端口信息。
同时指定宿主机端口和容器端口(HOST : CONTAINER格式),或者仅仅指定容器的端口(宿主将会随机选择端口)。
相当于 -p
。
当使用HOST:CONTAINER格式来映射接口时,如果你使用的容器端口小于60并且没放到引号里,可能会得到错误结果,因为YAML会自动解析xx:yy这种数字格式为60进制。为避免出现这种问题,建议数字串都采用引号包起来的字符串格式.
示例:
version: "3.2"
services:
tomcat01:
image: tomcat:8.0-jre8
ports:
- "8080:8080"
tomcat02:
image: tomcat:8.0-jre8
ports:
- "8081:8080"
- "5672:5672"
4. volumes
作用:
设置数据卷挂载路径," : "前可以设置为宿主机路径(HOT : CONTAINER)或者数据卷名称(VOLUME : CONTAINER),并且最后还可以设置访问模式(HOST : CONTAINER : ro),该指令中所有路径支持相对路径。
相当于 -v
。
示例:
version: "3.2"
services:
tomcat:
image: tomcat:8.0-jre8
volumes:
- /app/postilhub:/usr/local/tomcat/webapps
上面是使用宿主机路径来映射的,如果使用数据卷名称映射,如下
version: "3.2"
services:
tomcat:
image: tomcat:8.0-jre8
volumes:
- postilhub:/usr/local/tomcat/webapps
# 声明
volumes:
postilhub:
数据卷名称shampooApp必须要单独声明,但是数据卷名称和我们指定的数据卷名称并不一样,Compose首先会看 docker_compose.yml
文件在哪个路径中,比如在 /home
目录中,那么Compose就会 docker_compose.yml
所在目录名和自定义数据卷名称组合起来:shampoo_postilhub。
如果想不加目录名,可以添加如下配置:
version: "3.2"
services:
tomcat:
image: tomcat:8.0-jre8
volumes:
- postilhub:/usr/local/tomcat/webapps
# 声明数据卷
volumes:
postilhub:
# 是否使用自定义数据卷名
external:
true
但是这种设置Compose就不会给我们自动创建数据卷了,我们需要使用如下命令,手动创建数据卷,再去启动Project。
docker volume create postilhub
5. network
作用:
配置容器连接网桥,不配置默认就是bridge网桥。
相当于 --network
。
示例:
version: "3.2"
services:
tomcat01:
image: tomcat:8.0-jre8
# 指定tomcat01服务使用postilhub网桥
networks:
- postilhub
tomcat02:
image: tomcat:8.0-jre8
# 指定tomcat02服务使用postilhub网桥
networks:
- postilhub
# 声明网桥
networks:
postilhub:
该网桥创建时,网桥名也是docker_compose.yml
所在目录名和自定义网桥名称的组合。
如果想不加目录名,可以添加如下配置:
version: "3.2"
services:
tomcat01:
image: tomcat:8.0-jre8
# 指定tomcat01服务使用postilhub网桥
networks:
- postilhub
tomcat02:
image: tomcat:8.0-jre8
# 指定tomcat02服务使用postilhub网桥
networks:
- postilhub
# 声明网桥
networks:
postilhub:
# 是否使用自定义数据卷名
external:
true
但是这种设置Compose就不会给我们自动创建网桥了,我们需要使用如下命令,手动创建网桥,再去启动Project。
docker network create -d bridge postilhub
6. container_name
作用:
指定容器名称。
相当于 --name
。
示例:
version: "3.2"
services:
tomcat01:
container_name: tomcat01
image: tomcat:8.0-jre8
tomcat02:
container_name: tomcat02
image: tomcat:8.0-jre8
# 声明网桥
networks:
postilhub:
7. environment
作用:
设置环境变量。你可以使用数组或字典两种格式。
相当于 -e
。
示例:
version: "3.2"
services:
mysql:
container_name: mysql
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=123456
上面使用数组表示,也可以使用字典表示:
version: "3.2"
services:
mysql:
container_name: mysql
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
8. command
作用:
覆盖容器启动后默认执行的命令。
示例:
version: "3.2"
services:
redis:
image: redis:5.0.10
command: "redis-server --appendonly yes"
等价于:
docker run redis:5.0.10 redis-server --appendonly yes
9. env_file
作用:
从文件中获取环境变量,可以为单独的文件路径或文件路径列表。
示例:
按照之前 environment
命令的配置
version: "3.2"
services:
mysql:
container_name: mysql
image: mysql:8.0
# environment:
# - MYSQL_ROOT_PASSWORD=123456
env_file:
- ./mysql.env
这些密码都属于敏感信息,不应该放在 docker-compose.yml
中明文配置。
在 docker-compose.yml
目录中创建环境变量配置文件 mysql.env
。
Docker Compose中创建的配置文件必须以 env 结尾,文件中必须遵循 key=value 的格式,同时支持 # 注释。
MYSQL_ROOT_PASSWORD=123456
10. depneds_on
作用:
解决容器的依赖、启动先后的问题。
示例:
version: "3.2"
services:
postilhub:
image: postilhub:01
depneds_on:
- mysql
- redis
mysql:
image: mysql:8.0
redis:
image: redis:5.0.10
以上配置表示postilhub服务依赖于mysql和redis服务,postilhub会在mysql和redis项目启动到一定程度后再启动(不是在mysql和redis服务完全启动时才启动)。
depends_on配置的是服务名,不是容器名(container_name)。
依赖可以有级联效应,比如A依赖于B,B依赖于C,那么A也依赖于C。
11. healthcheck
作用:
心跳检测,通过命令检查容器是否健康运行。
示例:
version: "3.2"
services:
postilhub:
image: postilhub:1.0
# 对postilhub服务做心跳检测
healthcheck:
# 向当前Docker引擎发curl请求
test: [ "CMD", "curl", "-f", "http://localhost" ]
# 规定响应时间
interval: 1m30s
# 超时时间
timeout: 10s
# 重试次数
retries: 3
如果部署的是远程Docker,需要将localhost改为远程Docker的IP。
12. sysctls
作用:
配置容器内核参数。
示例:
并不是必须配置,有些服务启动受容器内操作系统参数限制可能会无法启动,必须通过修改容器中参数才能启动(例如ES)。
version: "3.2"
services:
postilhub:
image: postilhub:1.0
# 对运行postilhub服务的容器做系统内核配置
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
13. ulimits
作用:
指定容器运行的进程数。
示例:
并不是必须配置,根据某些特殊服务进行配置。
version: "3.2"
services:
postilhub:
image: postilhub:1.0
# 对运行postilhub服务的容器做进程数配置
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
Compose指令
docker-compose.yml
文件编辑完毕后运行的指令,作用对象是Compose中的Project,也就是说Project中的所有Services都会受到影响。
1. up
作用: 启动Project的所有Service。
示例:
启动所有Service。
docker-compose up
该命令还可以启动若干个Service,必须传入Service名
docker-compose up 服务名1 服务名2 ...
默认情况,docker-compose up
启动的容器都在前台,如果想要后台启动(Ctrl + C 停止所有容器)
docker-compose up -d
2. down
作用: 停止Project的所有Service,同时移除由模板文件自动创建的网桥(external创建的外部网桥不会被移除),但是不会移除数据卷。
示例:
停止所有Service。
docker-compose down
3. exec
作用: 进入Project中某个Service所在的容器。
示例:
docker-compose exec 服务名
4. ps
作用: 列出Project中目前的所有容器。
示例:
docker-compose ps
5. restart
作用: 重启Project中的所有Service。
示例:
docker-compose restart
该命令还可以重启若干个Service,必须传入Service名
docker-compose restart 服务名1 服务名2 ...
6. rm
作用: 删除Project中的所有Service。
示例:
docker-compose rm
该命令还可以删除若干个Service,必须传入Service名
docker-compose rm 服务名1 服务名2 ...
如果需要强制删除
docker-compose rm -f 服务名1 服务名2 ...
如果需要连带数据卷一起删除
docker-compose rm -v 服务名1 服务名2 ...
7. stop
作用: 关闭Project中的所有Service,仅仅是关闭,不会删除Service或者网桥。
示例:
docker-compose stop
该命令还可以关闭若干个Service,必须传入Service名
docker-compose stop 服务名1 服务名2 ...
8. top
作用: 查看Project中各个Service容器内运行的进程。
示例:
docker-compose top
该命令还可以查看若干个Service容器,必须传入Service名
docker-compose top 服务名1 服务名2 ...
9. pause
作用: 暂停Project中所有Service,使用ps会查看到该Service的State是pause而不是up或者down。
示例:
docker-compose pause
该命令还可以暂停若干个Service,必须传入Service名
docker-compose pause 服务名1 服务名2 ...
10. unpause
作用: 恢复暂停Project中所有Service。
示例:
docker-compose unpause
该命令还可以暂停恢复若干个Service,必须传入Service名
docker-compose unpause 服务名1 服务名2 ...
11. logs
作用: 查看Project中所有Service的日志。
示例:
docker-compose logs
该命令还可以查看若干个Service的日志,必须传入Service名
docker-compose logs 服务名1 服务名2 ...