【Docker Compose】12. 模板指令与指令

812 阅读8分钟

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 ...