一、前言
Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,它通过一个单独的 YAML 文件来配置应用的服务,然后使用一条简单的命令即可创建、启动、停止和销毁这些服务。它简化了在单个主机上部署和管理多个 Docker 容器的过程,使用 Docker Compose,您可以定义一个包含多个服务的应用程序,每个服务可以由一个或多个容器组成。您可以指定容器的镜像、网络设置、卷挂载、环境变量等配置信息,以及容器之间的依赖关系
二、语法结构
version: "3" #指定 Docker Compose 文件的版本
networks: #定义网络模式
my_network:
driver: bridge
services: #定义应用程序中的服务
gitlab: #设置服务名称
container_name: container_name #设置容器名称
restart: always #定义重启策略
privileged: true #以特权模式运行即以root身份运行
image: xxx:latest #指定服务所使用的容器镜像
build: #自定义构建服务所使用的镜像
context: /xxx/xxx/dockerfile #指定dockerfile完整的文件目录
environment: #设置容器中的环境变量
TZ: 'Asia/Shanghai' #这里举例定义容器中的时区
ports: #定义容器端口与宿主机端口之间的映射关系
- '9000:9000'
- '8443:443'
- '1022:22'
volumes: #定义卷挂载,用于在容器和宿主机之间共享数据或配置文件
- /opt/gitlab/config:/etc/gitlab
- /opt/gitlab/data:/var/opt/gitlab
depends_on: #指定服务之间的依赖关系。Docker Compose 将按照依赖关系顺序启动服务
- server_name
- server_name1
networks: #定义服务所属的网络。可以指定自定义网络,也可以使用默认网络
- my_network
mysql:
container_name: container_name
restart: always
privileged: true
image: xxx:latest
command: [ #覆盖容器启动时默认的命令
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci'
]
三、参数详解
network
桥接模式(bridge):默认情况下,Docker 使用桥接网络来连接容器。在桥接网络中,每个容器都分配一个唯一的 IP 地址,并且容器可以相互通信
主机模式(host):在主机模式下,容器与宿主机共享网络栈,容器的网络配置直接映射到宿主机上,不再有额外的网络隔离
容器模式(container):在容器模式下,容器共享另一个容器的网络栈。这意味着容器使用另一个容器的网络命名空间,共享相同的网络配置
无网络模式(none):在无网络模式下,容器没有网络连接。这意味着容器不能与外部世界通信,也不能与其他容器通信
restart
no:默认行为,容器不会自动重新启动。如果容器退出,它将保持在退出状态,直到手动重启
always:如果容器退出(无论是正常退出还是异常退出),Docker 将自动重新启动容器。这意味着容器将一直运行,直到显式停止或删除
on-failure:如果容器因错误退出(即退出状态不为 0),Docker 将自动重新启动容器。这对于故障恢复很有用
unless-stopped:与 always
类似,但是如果显式停止容器,则不会自动重新启动。只有当 Docker 服务重启或者显式重新启动容器时,才会重新启动容器
volumes
命名卷(Named Volumes):命名卷是通过 Docker 来创建和管理的持久化存储卷,其生命周期独立于容器之外。这意味着即使容器停止或被删除,命名卷的数据也会保留下来
volumes:
my_data_volume:
绑定挂载(Bind Mounts):绑定挂载允许将宿主机文件系统中的目录或文件挂载到容器内部的特定路径上。这使得容器可以访问宿主机上的文件,并且容器的更改也会反映在宿主机上
volumes:
- /path/on/host:/path/in/container
临时卷(Temporary Volumes):临时卷是一种匿名卷,不具有持久性。它们是在容器启动时自动生成的,并且在容器停止时自动删除
volumes:
- /path/in/container