Docker Compose 是一种用于定义和运行多容器 Docker 应用程序的工具。其核心是 docker-compose.yml
模板文件,该文件以 YAML 格式编写,包含了定义服务、网络和卷等所需的指令。本文将详细介绍 Docker Compose 模板文件中的关键指令,并通过示例代码和运行结果帮助大家更好地理解其用法。
基本结构
默认的模板文件名称为 docker-compose.yml
。每个服务都必须通过 image
指令指定镜像,或使用 build
指令(需要 Dockerfile)来自动构建生成镜像。
常用指令详解
-
build
指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
示例:
version: '3' services: webapp: build: . # 或者 # build: # context: ./dir # dockerfile: Dockerfile-alternate # args: # buildno: 1
说明:
context
:指定 Dockerfile 所在文件夹的路径。dockerfile
:指定 Dockerfile 文件名。args
:指定构建镜像时的变量。
运行结果:
docker-compose up
将会在当前目录下查找 Dockerfile 并构建镜像,然后启动容器。
-
cap_add, cap_drop
指定容器的内核能力分配。
示例:
version: '3' services: webapp: image: nginx cap_add: ["NET_ADMIN"] cap_drop: ["SYS_PTRACE"]
说明:
cap_add
:添加内核能力。cap_drop
:移除内核能力。
-
command
覆盖容器启动后默认执行的命令。
示例:
version: '3' services: webapp: image: nginx command: ["nginx", "-g", "daemon off;"]
运行结果:
docker-compose up
将会启动 Nginx 容器,并执行指定的命令。
-
container_name
指定容器名称。
示例:
version: '3' services: webapp: image: nginx container_name: my_nginx
说明:
- 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。
-
depends_on
解决容器的依赖、启动先后的问题。
示例:
version: '3' services: db: image: redis web: image: nginx depends_on: - db
说明:
web
服务不会等待db
服务「完全启动」之后才启动。
运行结果:
docker-compose up
将会先启动
db
容器,再启动web
容器。 -
env_file
从文件中获取环境变量。
示例:
.env 文件:
MYSQL_ROOT_PASSWORD=example
docker-compose.yml 文件:
version: '3' services: db: image: mysql env_file: - .env
运行结果:
docker-compose up
将会使用
.env
文件中的环境变量启动 MySQL 容器。 -
environment
设置环境变量。
示例:
version: '3' services: webapp: image: nginx environment: - NGINX_HOST=example.com - NGINX_PORT=80
-
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
示例:
version: '3' services: webapp: image: nginx expose: - "8080"
-
ports
暴露端口信息。
示例:
version: '3' services: webapp: image: nginx ports: - "80:80" - "443:443"
说明:
- 使用宿主端口:容器端口 (HOST:CONTAINER) 格式。
- 注意数字格式问题,建议采用引号包括起来的字符串格式。
运行结果:
docker-compose up
将会把容器的 80 和 443 端口映射到宿主机的相同端口。
-
volumes
数据卷所挂载路径设置。
示例:
version: '3' services: webapp: image: nginx volumes: - ./data:/var/www/html
说明:
- 设置宿主机路径(HOST:CONTAINER)或加上访问模式(HOST:CONTAINER:ro)。
运行结果:
docker-compose up
将会把宿主机的
./data
目录挂载到容器的/var/www/html
目录。
其它常用指令
-
domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir 等指令,基本跟
docker run
中对应参数的功能一致。示例:
version: '3' services: webapp: image: nginx restart: always read_only: true stdin_open: true tty: true working_dir: /var/www/html
说明:
restart: always
:指定容器退出后的重启策略为始终重启。read_only: true
:以只读模式挂载容器的 root 文件系统。stdin_open: true
:打开标准输入,可以接受外部输入。tty: true
:模拟一个伪终端。
动态读取变量
Compose 模板文件支持动态读取主机的系统环境变量和当前目录下的 .env
文件中的变量。
示例:
docker-compose.yml 文件:
version: '3'
services:
db:
image: "mongo:${MONGO_VERSION}"
运行:
MONGO_VERSION=3.6 docker-compose up
将会启动一个 mongo:3.6
镜像的容器。
若当前目录存在 .env
文件,执行 docker-compose
命令时将从该文件中读取变量。
.env 文件:
# 支持 # 号注释
MONGO_VERSION=3.6
运行:
docker-compose up
将会启动一个 mongo:3.6
镜像的容器。
总结
本文详细介绍了 Docker Compose 模板文件中的关键指令,并通过示例代码和运行结果展示了其用法。希望本文能帮助大家更好地理解和使用 Docker Compose,从而更高效地管理和部署多容器 Docker 应用程序。
标签:容器,Compose,version,示例,image,compose,Docker,docker From: https://blog.csdn.net/m0_37643701/article/details/144957553