Docker Compose 使用 YAML 文件(通常命名为docker-compose.yml)来定义多容器应用程序的外观。

yet another markup language

  1. version: "3.7"
  2. services:
  3. redis:
  4. image: redis:alpine
  5. volumes:
  6. - redis_data:/data
  7. restart: always
  8. mobycounter:
  9. depends_on:
  10. - redis
  11. image: russmckendrick/moby-counter
  12. ports:
  13. - "8080:80"
  14. restart: always
  15. volumes:
  16. redis_data:
  1. # 在包含docker-compose.yml的mobycounter文件夹下
  2. # 启动应用程序
  3. docker-compose up
  4. # 默认自动创建
  5. # mobycounter_redis_data(volume)
  6. # mobycounter_default(network)
  7. # mobycounter_redis_1 mobycounter_mobycounter_1(container)
  8. # mobycounter前缀取自包含yml文件的文件夹名称
  1. # docekr-compose版本 默认为1
  2. version: "3.7"
  3. # service section
  4. # 采用空格缩进 0 4 8 12...
  5. services:
  6. ----> container name:
  7. --------> container options
  8. ------------> sub options
  9. ----> container name:
  10. --------> container options
  11. ------------> sub options
  12. # 定义容器
  13. services:
  14. redis:
  15. image: redis:alpine
  16. volumes:
  17. - redis_data:/data
  18. restart: always
  19. mobycounter:
  20. depends_on:
  21. - redis
  22. image: russmckendrick/moby-counter
  23. ports:
  24. - "8080:80"
  25. restart: always
  26. # image告诉docker compose下载和使用哪个镜像
  27. # volumes --volume
  28. # depends_on 用于构建启动顺序 例如在容器A启动后启动B
  29. # ports --publish 接受一个端口列表
  30. # restart --restart

Docker Compose案例

Example voting application

该应用程序由五个容器、两个网络和一个卷组成

Docker Compose - 图1

  1. # vote 它是一个允许用户提交投票的Python应用程序
  2. vote:
  3. build: ./vote
  4. command: python app.py
  5. volumes:
  6. - ./vote:/app
  7. ports:
  8. - "5000:80"
  9. networks:
  10. - front-tier
  11. - back-tier
  12. # build告诉Docker Compose 使用 Dockerfile(位于./vote)构建一个容器
  13. # 容器启动后会将./vote文件夹挂载在容器中
  14. # command为容器启动时运行的命令
  15. # ports 主机映射到容器的端口
  16. # 为容器添加两个网络
  17. # front-tier网络包含需要将端口映射到主机的容器。
  18. # back-tier网络是为不需要暴露其端口的容器保留的,并充当一个私有的、隔离的网络。
  1. # 该容器显示投票结果
  2. # 包含一个node.js应用,该应用连接序连接到 PostgreSQL 数据库
  3. # 并显示在vote容器中投票的实时结果
  4. result:
  5. build: ./result
  6. command: nodemon server.js
  7. volumes:
  8. - ./result:/app
  9. ports:
  10. - "5001:80"
  11. - "5858:5858"
  12. networks:
  13. - front-tier
  14. - back-tier
  1. # 该worker容器运行一个.NET应用程序
  2. # 其唯一任务是连接到Redis并将每个投票转移PostgreSQL数据库(在db容器中运行)。
  3. worker:
  4. build:
  5. context: ./worker
  6. depends_on:
  7. - "redis"
  8. - "db"
  9. networks:
  10. - back-tier
  11. # build: context 和build类似
  12. # 前者可额外指定git url,其余相同(相对路径 绝对路径)
  13. # 该容器连接到back-tier,因为它并不需要与front-tier容器进行通信
  1. # 使用官方redis容器
  2. # 将投票结果存储在缓存中
  3. redis:
  4. image: redis:alpine
  5. container_name: redis
  6. ports: ["6379"]
  7. networks:
  8. - back-tier
  1. # PostgreSQL 容器
  2. db:
  3. image: postgres:9.4
  4. container_name: db
  5. volumes:
  6. - "db-data:/var/lib/postgresql/data"
  7. networks:
  8. - back-tier
  9. # 未公开容器 采用默认端口
  1. # 数据持久存储
  2. volumes:
  3. db-data:
  4. # 网络
  5. networks:
  6. front-tier:
  7. back-tier:
  1. docker-compose up
  2. # npm ERR! request to https://registry.npmjs.org/nodemon failed, reason: Hostname/IP doesn't match certificate's altnames
  3. # /etc/hosts添加 36.158.249.135 registry.npm.taobao.org

探索 Docker Compose 命令

  1. # 运行
  2. docker-compose up
  3. # 后台运行
  4. docker-compose up -d
  5. # 检查容器运行状态
  6. docker-compose ps
  7. # 验证docker-compose.yml -q --quiet 不显示yml副本 方便直接验证
  8. docker-compose config
  9. docker-compose config -q
  10. # pull, build, and create
  11. # 拉取yml中镜像
  12. docker-compose pull
  13. # 构建yml中镜像 Dockerfile
  14. docker-compose build
  15. # 创建容器但不会启动 build是否建立镜像
  16. # 可增加额外标志 --force-recreate --no-recreate --no-build --build
  17. docker-compose create
  18. # start, stop, restart, pause, and unpause
  19. # 与docker container类似 唯一的区别是它们会影响所有容器的更改
  20. docker-compose start
  21. docker-compose stop
  22. docker-compose restart
  23. docker-compose pause
  24. docker-compose unpause
  25. # 可以通过传递名称来定位单个服务
  26. docker-compose pause db
  27. docker-compose unpause db
  28. # top, logs, events, exec, and run
  29. # 展示Docker Compose启动的容器中运行进程的信息
  30. docker-compose top
  31. # 查看单个服务
  32. docker-compose top db
  33. # 每个正在运行的容器的日志流传输到屏幕
  34. docker-compose logs
  35. # 展示触发的事件
  36. docker-compose events
  37. # 开启额外进程 ping
  38. docker-compose exec worker ping -c 3 db
  39. # 使用包管理器composer来更新存储在卷上的项目的依赖项
  40. # composer容器 install指令 将data_volume挂载到/app下
  41. docker-compose run --volume data_volume:/app composer install
  42. # 弃用
  43. docker-compose scale worker=3
  44. # 启动多个容器
  45. docker-compose up -d --scale worker=3
  46. # 强行停止 可能会出错
  47. docker-compose kill
  48. # 删除所有状态为exit的容器
  49. docker-compose rm
  50. # 与up相反 停止并删除
  51. docker-compose down
  52. # 删除所有内容 包括容器 镜像 网络 卷等
  53. docker-compose down --rmi all --volumes