Docker Compose 使用 YAML 文件(通常命名为docker-compose.yml)来定义多容器应用程序的外观。
yet another markup language
version: "3.7"
services:
redis:
image: redis:alpine
volumes:
- redis_data:/data
restart: always
mobycounter:
depends_on:
- redis
image: russmckendrick/moby-counter
ports:
- "8080:80"
restart: always
volumes:
redis_data:
# 在包含docker-compose.yml的mobycounter文件夹下
# 启动应用程序
docker-compose up
# 默认自动创建
# mobycounter_redis_data(volume)
# mobycounter_default(network)
# mobycounter_redis_1 mobycounter_mobycounter_1(container)
# mobycounter前缀取自包含yml文件的文件夹名称
# docekr-compose版本 默认为1
version: "3.7"
# service section
# 采用空格缩进 0 4 8 12...
services:
----> container name:
--------> container options
------------> sub options
----> container name:
--------> container options
------------> sub options
# 定义容器
services:
redis:
image: redis:alpine
volumes:
- redis_data:/data
restart: always
mobycounter:
depends_on:
- redis
image: russmckendrick/moby-counter
ports:
- "8080:80"
restart: always
# image告诉docker compose下载和使用哪个镜像
# volumes --volume
# depends_on 用于构建启动顺序 例如在容器A启动后启动B
# ports --publish 接受一个端口列表
# restart --restart
Docker Compose案例
Example voting application
该应用程序由五个容器、两个网络和一个卷组成
# vote 它是一个允许用户提交投票的Python应用程序
vote:
build: ./vote
command: python app.py
volumes:
- ./vote:/app
ports:
- "5000:80"
networks:
- front-tier
- back-tier
# build告诉Docker Compose 使用 Dockerfile(位于./vote)构建一个容器
# 容器启动后会将./vote文件夹挂载在容器中
# command为容器启动时运行的命令
# ports 主机映射到容器的端口
# 为容器添加两个网络
# front-tier网络包含需要将端口映射到主机的容器。
# back-tier网络是为不需要暴露其端口的容器保留的,并充当一个私有的、隔离的网络。
# 该容器显示投票结果
# 包含一个node.js应用,该应用连接序连接到 PostgreSQL 数据库
# 并显示在vote容器中投票的实时结果
result:
build: ./result
command: nodemon server.js
volumes:
- ./result:/app
ports:
- "5001:80"
- "5858:5858"
networks:
- front-tier
- back-tier
# 该worker容器运行一个.NET应用程序
# 其唯一任务是连接到Redis并将每个投票转移PostgreSQL数据库(在db容器中运行)。
worker:
build:
context: ./worker
depends_on:
- "redis"
- "db"
networks:
- back-tier
# build: context 和build类似
# 前者可额外指定git url,其余相同(相对路径 绝对路径)
# 该容器连接到back-tier,因为它并不需要与front-tier容器进行通信
# 使用官方redis容器
# 将投票结果存储在缓存中
redis:
image: redis:alpine
container_name: redis
ports: ["6379"]
networks:
- back-tier
# PostgreSQL 容器
db:
image: postgres:9.4
container_name: db
volumes:
- "db-data:/var/lib/postgresql/data"
networks:
- back-tier
# 未公开容器 采用默认端口
# 数据持久存储
volumes:
db-data:
# 网络
networks:
front-tier:
back-tier:
docker-compose up
# npm ERR! request to https://registry.npmjs.org/nodemon failed, reason: Hostname/IP doesn't match certificate's altnames
# /etc/hosts添加 36.158.249.135 registry.npm.taobao.org
探索 Docker Compose 命令
# 运行
docker-compose up
# 后台运行
docker-compose up -d
# 检查容器运行状态
docker-compose ps
# 验证docker-compose.yml -q --quiet 不显示yml副本 方便直接验证
docker-compose config
docker-compose config -q
# pull, build, and create
# 拉取yml中镜像
docker-compose pull
# 构建yml中镜像 Dockerfile
docker-compose build
# 创建容器但不会启动 build是否建立镜像
# 可增加额外标志 --force-recreate --no-recreate --no-build --build
docker-compose create
# start, stop, restart, pause, and unpause
# 与docker container类似 唯一的区别是它们会影响所有容器的更改
docker-compose start
docker-compose stop
docker-compose restart
docker-compose pause
docker-compose unpause
# 可以通过传递名称来定位单个服务
docker-compose pause db
docker-compose unpause db
# top, logs, events, exec, and run
# 展示Docker Compose启动的容器中运行进程的信息
docker-compose top
# 查看单个服务
docker-compose top db
# 每个正在运行的容器的日志流传输到屏幕
docker-compose logs
# 展示触发的事件
docker-compose events
# 开启额外进程 ping
docker-compose exec worker ping -c 3 db
# 使用包管理器composer来更新存储在卷上的项目的依赖项
# composer容器 install指令 将data_volume挂载到/app下
docker-compose run --volume data_volume:/app composer install
# 弃用
docker-compose scale worker=3
# 启动多个容器
docker-compose up -d --scale worker=3
# 强行停止 可能会出错
docker-compose kill
# 删除所有状态为exit的容器
docker-compose rm
# 与up相反 停止并删除
docker-compose down
# 删除所有内容 包括容器 镜像 网络 卷等
docker-compose down --rmi all --volumes