docker · 2020-06-29 0

docker-compose的使用

一、安装

1. docker compose 1.x

docker compose 1.x 是相对独立的命令,命令行方式如:docker-compose --version

curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
root@localhost:~# docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6

2. docker compose 2.x

docker compose v2 被规划为 Docker CLI 的一部分,命令行方式如 docker compose version

虽然 docker compose v2 版本已经推出,但是 docker 官方表示不会放弃对 1.x 版本的支持

root@localhost:~# docker info
Client: Docker Engine - Community
 Version:    24.0.7
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.11.2
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.21.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose
root@localhost:~# docker compose version
Docker Compose version v2.21.0

3.compose file format 版本与 docker 版本关系

https://docs.docker.com/compose/compose-file/compose-file-v3/

Compose file format Docker Engine release
Compose specification 19.03.0+
3.8 19.03.0+
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+

1.12 之后,Docker 提供了 HEALTHCHECK 指令,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态

当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy

二、docker-compose命令

docker-compose 的使用非常类似于 docker 命令的使用,但是需要注意的是大部分的 compose 命令都需要到docker-compose.yml 文件所在的目录下才能执行

  • docker-compose up -d [service_name] 在后台启动容器并使它们保持运行。
  • docker-compose exec service_name bash 登录到service_name容器中
  • docker-compose ps [service_name]查看compose服务状态
  • docker-compose start [service_name] 启动compose服务
  • docker-compose stop [service_name] 停止compose服务
  • docker-compose restart [service_name] 重启compose服务
  • docker-compose rm [service_name]删除停止的compose服务
  • docker-compose logs [service_name] 查看日志
  • docker-compose logs -f [service_name] 查看实时日志

三、docker-compose.yml文件

bridge 模式

docker-compose.yml

version: '2'
services:
  mysql:
    # 镜像
    image: mysql:8.0
    # 自定义容器名称
    container_name: mysql_container
    # 自定义主机名
    hostname: mysql_hostname
    # 启动端口映射 (外部:内部)
    ports:
    - 3306:3306
    # 设置环境变量
    environment:
    - MYSQL_ROOT_PASSWORD=123456
    # 将主机名和ip写入容器中的hosts文件
    extra_hosts:
    - www.abc.com:127.0.0.1
    # 当前容器启动前,必须等待以下服务启动完毕之后才能启动
    depends_on:
    - nginx
  nginx:
    hostname: nginx_test
    image: nginx:1.19.0
    ports:
    - 80:80

没有自定义网络名,实际使用的网络是:<当前路径名_default>

网络定义后缀

version: '2'
networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: 10.0.3.0/24
services:
  mysql:
    # 镜像
    image: mysql:8.0
    # 自定义容器名称
    container_name: mysql_container
    # 自定义主机名
    hostname: mysql_hostname
    # 启动端口映射 (外部:内部)
    ports:
    - 3306:3306
    # 设置环境变量
    environment:
    - MYSQL_ROOT_PASSWORD=123456
    # 将主机名和ip写入容器中的hosts文件
    extra_hosts:
    - www.abc.com:127.0.0.1
    # 当前容器启动前,必须等待以下服务启动完毕之后才能启动
    depends_on:
    - nginx
    networks:
      mynet:
        ipv4_address: 10.0.3.101
  nginx:
    hostname: nginx_test
    image: nginx:1.19.0
    ports:
    - 80:80
    networks:
      mynet:
        ipv4_address: 10.0.3.102

定义网络名为 mynet,那么最终生产的网络名为:<当前路径名_mynet>

version: '2'
networks:
  baseNet:
    external:
      name: path_mynet
services:
  mysql:
    # 镜像
    image: mysql:8.0
    # 自定义容器名称
    container_name: mysql_container
    # 自定义主机名
    hostname: mysql_hostname
    # 启动端口映射 (外部:内部)
    ports:
    - 3306:3306
    # 设置环境变量
    environment:
    - MYSQL_ROOT_PASSWORD=123456
    # 将主机名和ip写入容器中的hosts文件
    extra_hosts:
    - www.abc.com:127.0.0.1
    # 当前容器启动前,必须等待以下服务启动完毕之后才能启动
    depends_on:
    - nginx
    networks:
      - path_mynet
  nginx:
    hostname: nginx_test
    image: nginx:1.19.0
    ports:
    - 80:80
    networks:
      - path_mynet

external 使用已经存在的网络

host 模式

version: '2'
services:
  nginx:
    hostname: nginx_test
    image: nginx:1.19.0
    restart: always
    network_mode: host