Docker Compose 使用 YAML 文件(通常命名为docker-compose.yml)来定义多容器应用程序的外观。
yet another markup language
version: "3.7"services:redis:image: redis:alpinevolumes:- redis_data:/datarestart: alwaysmobycounter:depends_on:- redisimage: russmckendrick/moby-counterports:- "8080:80"restart: alwaysvolumes: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版本 默认为1version: "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:alpinevolumes:- redis_data:/datarestart: alwaysmobycounter:depends_on:- redisimage: russmckendrick/moby-counterports:- "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: ./votecommand: python app.pyvolumes:- ./vote:/appports:- "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: ./resultcommand: nodemon server.jsvolumes:- ./result:/appports:- "5001:80"- "5858:5858"networks:- front-tier- back-tier
# 该worker容器运行一个.NET应用程序# 其唯一任务是连接到Redis并将每个投票转移PostgreSQL数据库(在db容器中运行)。worker:build:context: ./workerdepends_on:- "redis"- "db"networks:- back-tier# build: context 和build类似# 前者可额外指定git url,其余相同(相对路径 绝对路径)# 该容器连接到back-tier,因为它并不需要与front-tier容器进行通信
# 使用官方redis容器# 将投票结果存储在缓存中redis:image: redis:alpinecontainer_name: redisports: ["6379"]networks:- back-tier
# PostgreSQL 容器db:image: postgres:9.4container_name: dbvolumes:- "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 configdocker-compose config -q# pull, build, and create# 拉取yml中镜像docker-compose pull# 构建yml中镜像 Dockerfiledocker-compose build# 创建容器但不会启动 build是否建立镜像# 可增加额外标志 --force-recreate --no-recreate --no-build --builddocker-compose create# start, stop, restart, pause, and unpause# 与docker container类似 唯一的区别是它们会影响所有容器的更改docker-compose startdocker-compose stopdocker-compose restartdocker-compose pausedocker-compose unpause# 可以通过传递名称来定位单个服务docker-compose pause dbdocker-compose unpause db# top, logs, events, exec, and run# 展示Docker Compose启动的容器中运行进程的信息docker-compose top# 查看单个服务docker-compose top db# 每个正在运行的容器的日志流传输到屏幕docker-compose logs# 展示触发的事件docker-compose events# 开启额外进程 pingdocker-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
