一、前言

  在上一篇文章中已经对docker compose进行了介绍以及安装, 下面正式进入到docker compose配置文件与常用命令讲解的讲解。



二、docker-compose模板命令讲解

version:指定docker-compose.yml文件的版本

格式:
    version: "版本号"
示例:
    version: "3.0"

docker composedocker的兼容性如下 (可以向下兼容,即:docker版本在19.03.0+这个版本,可以使用docker compose3.8版本或者3.8以下的版本都是可以的,不过推荐写低两位,避免最新版本不兼容,即:3.0~3.6之间)

docker compose文件格式版本docker版本
3.819.03.0+
3.718.06.0+
3.618.02.0+
3.517.12.0+

services:多个应用容器的集合,一个服务就代表一个应用容器

version: "3.0"
services:
   定义服务

build:指定构建镜像时,Dockerfile 所在目录的路径 (可以是绝对路径,也可以是相对 docker-compose.yml 文件的路径)。docker-compose指令将会利用它自动构建这个镜像,然后使用这个镜像

/**
 * 方式一:使用的是相对路径,指的是Dockerfile文件在其
 *        docker-compose.yml当前目录下的dir目录中,
 *        文件名称必须叫Dockerfile
 * 
 * 这里的webapp指的是你的服务名,在docker-compose.yml文件中必须唯一      
 **/
version: "3.0"
services:
  webapp:
    build: ./dir



/**
 * 方式二:
 *   1、可以使用context指令指定Dockerfile所在目录的路径
 *   2、如果名称不叫Dockerfile,可以使用dockerfile指令
 *      指定其文件名             
 **/
version: "3.0"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: myfile

image:指定服务所使用的镜像,如果镜像在本地不存在,docker-compose指令将会尝试去拉取这个镜像。与build指令二选一

version: "3.0"
services:
  webapp:
    image: nginx:1.21.1

container_name:指定容器名称。如果不指定默认将会使用 项目名称_服务名称_序号这样的格式

version: "3.0"
services:
  webapp:
    image: nginx:1.21.1
    container_name: myNginx

ports:指定容器暴露的端口信息,使用 宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口 (宿主将会随机选择端口)都可以

version: "3.0"
services:
  webapp:
    image: nginx:1.21.1
    container_name: myNginx
    ports:
      - "80:80"

注:在暴露端口时,建议都采用引号包括起来的字符串格式,避免解析出错

volumes:数据卷所挂载路径设置。可以设置为 宿主机绝对路径:容器内目录的绝对路径 或者 数据卷名称:容器内目录的绝对路径,并且还可以设置访问模式 (默认为rw读写模式,ro表示只读)

/**
 * 方式一:使用宿主机绝对路径进行挂载    
 **/
version: "3.0"
services:
  webapp:
    image: mysql:5.6
    container_name: myMysql
    ports:
      - "3306:3306"
    volumes:
      - /root/data:/var/lib/mysql

/**
 * 方式二:使用数据卷名称进行挂载,必须在文件中对数据卷名称进行声明
 **/
version: "3.0"
services:
  webapp:
    image: mysql:5.6
    container_name: myMysql
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql 
      - mysql_logs:/logs

volumes:   #对上面使用到的数据卷名称进行声明
  mysql_data:   #数据卷名称前面会自带项目名称,(当前docker-compose.yml所在目录的名称),即项目名称_数据卷名称
    external: true  #如果不想加上项目名称,请设置external为true,这时就需要我们在启动服务之前,必须在外部使用命令去手动创建一个名叫mysql_data的数据卷 (创建命令: docker volume create mysql_data)
  mysql_logs:

environment:设置环境变量,可以使用数组或字典两种格式

version: "3.0"
services:
  webapp:
    image: mysql:5.6
    container_name: myMysql
    ports:
      - "3306:3306"
    environment:  #字典格式
      MYSQL_ROOT_PASSWORD: 123456
      SESSION_SECRET:  #只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
    或者
    environment:   #数组格式
      - MYSQL_ROOT_PASSWORD=123456
      - SESSION_SECRET  

env_file:从以.env结尾的文件中获取环境变量,可以为单独的文件路径或列表

version: "3.0"
services:
  webapp:
    image: mysql:5.6
    container_name: myMysql
    ports:
      - "3306:3306"
    env_file: ./mysql.env  #单独单独的文件路径
    或者
    env_file:  #列表格式
      - ./mysql.env

/**
 * 1、环境变量文件中的每一行必须符合字典格式,即变量名=值
 * 2、支持 # 开头的注释行。
 * mysql.env环境变量文件内容如下
 **/
MYSQL_ROOT_PASSWORD=123456

networks:配置容器连接的网络

version: "3.0"
services:
  webapp:
    image: nginx:1.21.1
    container_name: myNginx
    networks:
      - nginx_network  

networks:     #对上面使用到的网络名称进行声明
  nginx_network:  #网络名称前面会自带项目名称,(当前docker-compose.yml所在目录的名称),即项目名称_网络名称
    external: true  #如果不想加上项目名称,请设置external为true,这时就需要我们在启动服务之前,必须在外部使用命令去手动创建一个名叫nginx_network的网络(创建命令: docker network create -d bridge nginx_network)

depends_on:解决容器的依赖、启动先后的问题 (一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败)

下面示例就会先启动 redismysql 这两个服务,最后才启动 webapp 服务 (提示webapp 服务不会等待 redismysql 服务完全启动 之后才启动,而是会先启动依赖服务,再去启动webapp 服务,但是依赖服务最终会在webapp 服务完全启动之前 完全启动)

version: "3.0"
services:
  webapp:
    build: .
    container_name: myApp
    depends_on:    #设置webapp服务依赖于redis和mysql服务
      - redis
      - mysql  

  redis:
    image: redis:3.2
    container_name: myRedis
    
  mysql:
    image: mysql:5.6
    container_name: myMysql

command:覆盖容器启动后默认执行的命令,即:覆盖DockerFile中的CMD或第三方镜像的启动命令

version: "3.0"
services:
  webapp:
    image: redis:3.2 .
    container_name: myRedis
    ports:    
      - "6379:6379"
    command: "redis-server --appendonly yes"
    或者
    command: ["redis-server", "--appendonly", "yes"]

healthcheck:通过命令检查容器是否健康运行

version: "3.0"
services:
  webapp:
    image: nginx:1.21.1
    container_name: myNginx
    ports:
      - "80:80"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s  #时间间隔
      timeout: 10s     #超时时间
      retries: 3       #重试次数

labels:为容器添加元数据 (metadata)信息,例如:可以为容器添加辅助说明信息,支持数组或字典格式

version: "3.0"
services:
  webapp:
    image: nginx:1.21.1
    container_name: myNginx
    ports:
      - "80:80"
    labels:
      - "com.startupteam.description=webapp for a strtup team" #数组格式
    或者
    labels:
      com.startupteam.description: "webapp for a strtup team" #字典格式

restart:指定容器退出后的重启策略,在生产环境中推荐配置为 always 或者 unless-stopped

  • no: 在任何情况下都不会重启容器
  • always: 容器总是会重新启动
  • on-failure: 如果退出代码指示失败错误,则该策略会重新启动容器
  • unless-stopped: 总是重新启动容器,除非容器停止
version: "3.0"
services:
  webapp:
    image: nginx:1.21.1
    container_name: myNginx
    ports:
      - "80:80"
    restart: always

想要了解更多docker-compose模板命令请阅读官方文档


案例:编写一个综合的docker-compose.yaml,设置mysql服务依赖于nginx服务,并同处于名叫common_network的网络下

version: "3.0"
services:
  mysql:
    image: mysql:5.6
    container_name: myMysql
    ports:
      - "3306:3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - SESSION_SECRET
    depends_on:
      - nginx
    networks:
      - common_network
    volumes:
      - mysql_data:/var/lib/mysql 
      - mysql_logs:/logs
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s  #时间间隔
      timeout: 10s     #超时时间
      retries: 3       #重试次数

    
  nginx:
    image: nginx:1.21.1
    container_name: myNginx
    ports:
      - "80:80"
    restart: always
    networks:
      - common_network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s  #时间间隔
      timeout: 10s     #超时时间
      retries: 3       #重试次数


volumes:    #对上面使用到的数据卷名称进行声明
  mysql_data: 
  mysql_logs:
networks:   #对上面使用到的网络名称进行声明  
  common_network: 


三、docker-compose指令讲解

提示

  1. 在执行docker-compose指令时,如果不指定配置文件,就需要在执行指令的目录下必须要有docker-compose.yml配置文件且文件名必须叫docker-compose.yml

  2. 如果执行docker-compose指令的目录下没有docker-compose.yml配置文件 或者 配置文件名不叫docker-compose.yml,需要在docker-compose后面添加-f 配置文件路径去指定配置文件,例如:docker-compose -f /root/myfile.yml up

  3. 如果通过 docker-compose -f file 的方式来指定docker-compose.yml配置文件,那么配置文件中那些使用相对路径的命令则会基于-f file中file的路径来进行对照

1、运行服务命令

/**
 * 1、以交互模式启动docker-compose.yml中定义的服务
 * 2、通过ctrl+c停止命令时,将会停止所有的服务
 * 3、service可选,如果不指定启动的服务名,默认启动所有服务
 **/
docker-compose up [service]

/**
 * 1、以后台方式启动docker-compose.yml中定义的服务
 * 2、一般推荐生产环境下使用该选项
 **/
docker-compose up -d [service]

2、停止并移除服务命令

/**
 * 1、停止并移除docker-compose.yml中定义的服务
 * 2、移除docker-compose up运行过程中自建的网络,自己手动使用命令创建的网络不会移除
 **/
docker-compose down

3、列出项目中所有正在运行的服务

docker-compose ps [service]

4、删除服务

/**
 * 移除docker-compose.yml中定义的服务
 * options:
 *   -f, --force 强制直接删除,包括非停止状态的容器
 *   -v 删除容器所挂载的数据卷
 **/
docker-compose rm [options] [service]

5、进入指定的服务内部

docker-compose exec service服务名称 /bin/bash 或 /bin/sh

6、启动、停止和重启服务

//启动服务
docker-compose start [service]

//停止服务
docker-compose stop [service]

//强制停止服务
docker-compose kill [service]

//重启服务
docker-compose restart [service]

7、查看服务内运行的进程

docker-compose top [service]

8、查看服务的日志

docker-compose logs [service]


Docker入门到实践系列文章列表:

Docker入门到实践 (一) docker简介与安装
Docker入门到实践 (二) docker常用命令讲解
Docker入门到实践 (三) Dockerfile解析与镜像制作
Docker入门到实践 (四) docker容器数据卷与数据卷容器
Docker入门到实践 (五) docker数据的备份、恢复与迁移
Docker入门到实践 (六) docker网络模式详解以及容器间的网络通信
Docker入门到实践 (七) docker常用软件的安装
Docker入门到实践 (八) 本地镜像推送到阿里云 和 下载镜像到本地
Docker入门到实践 (九) docker可视化界面portainer的安装与使用
Docker入门到实践 (十) IDEA集成Docker构建容器镜像,部署项目
Docker入门到实践 (十一) docker私有仓库的搭建与配置
Docker入门到实践 (十二) docker compose简介与安装
Docker入门到实践 (十三) docker compose配置文件与常用命令讲解
Docker入门到实践 (十四) docker企业级容器镜像仓库HarBor的搭建与配置




GitHub 加速计划 / compose / compose
33.27 K
5.15 K
下载
compose - Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,通过Compose文件格式简化应用部署过程。
最近提交(Master分支:2 个月前 )
501b5acd Add `jhrotko` to Core Maintainers. Signed-off-by: Laura Brehm <laurabrehm@hey.com> 16 天前
f51bc4cd Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> 16 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐