NingG +

Docker 系列:Docker Compose

0. 概要

Docker Compose,几个问题:

几个方面:

1. Compose 的作用

Compose(编排),介绍 Compose 之前,需要先分析一下 Docker 的使用过程:

  1. 镜像:构建镜像
    1. 涵盖内容:服务代码逻辑、环境变量等
    2. 构建方式:Dockerfile 文件,进行构建
  2. 容器:基于镜像,启动容器
    1. 涵盖内容:网络端口映射、磁盘数据挂载、环境变量设置等
    2. 启动方式:docker run 启动单个容器

如果涉及多个容器,而且,不同的容器基于不同的镜像,此时,就是容器编排对外提供服务,可以利用 Compose 进行实现。

Docker Compose 可以支持多种场景:

具体 docker-compose 在整个 Docker 生态中的位置,参考:

2. 如何使用 Compose

几个方面:

2.1. 本质剖析

Compose 通过 docker-compose.yml 文件,定义一个项目。其本质:

2.2. 安装 Compose

Compose 是独立的工具,需要单独安装:

其他环境,参考 Install Docker Compose 进行安装.

# 查看 compose 版本
$ docker-compose version
docker-compose version 1.21.1, build 5a3f1a3
docker-py version: 3.3.0
CPython version: 3.6.4
OpenSSL version: OpenSSL 1.0.2o  27 Mar 2018

2.3. 使用 Compose

使用 Compose 分为 2 个方面:

2.3.1. 定义服务 docker-compose.yml

先贴一个典型的 docker-compose.yml 文件

version: "3"
services:
 
  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
 
  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]
 
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - "5000:80"
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
 
  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
 
  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]
 
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
 
networks:
  frontend:
  backend:
 
volumes:
  db-data: 

另一个 docker-compose.yml 配置文件样例

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.5"
          memory: 50M
        reservations:
          cpus: "0.25"
          memory: 20M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

关于 docker-compose.yml 文件的写法:

2.3.2. 管理服务 docker-compose 命令

docker-compose 命令,可以管理应用的整个生命周期

docker-compose 命令的基本用法:

$ docker-compose
Define and run multi-container applications with Docker.
 
Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

几个常用命令:

# 启动
docker-compose up
  
# 查询
docker-compose ps
  
# 终止
docker-compose stop
  
# 终止容器,并删除容器,删除所有 volume(可选)
docker-compose down --volumes
  
# 差量更新(跟启动命令,完全一样)
docker-compose up
  
# 服务中,执行命令
docker-compose run web env

关于 docker-compose 命令:

3. 讨论

Docker Compose:

遗留问题:

4. 参考资料

Top