概念介绍

Docker-Compose 项目是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。

Docker-Compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。

Docker-Compose 运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。

一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。

Docker-Compose的工程配置文件默认为 docker-compose.yml,当然也可以通过环境变量 COMPOSE_FILE-f 参数自定义配置文件。

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。Compose允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

安装docker-compose

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

命令选项:

  • -f --file: FILE指定Compose模板文件,默认为docker-compose.yml
  • -p --project-name: NAME 指定项目名称,默认使用当前所在目录为项目名
  • --verbose: 输出更多调试信息
  • -v,-version: 打印版本并退出
  • --log-level LEVEL: 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)

常用命令

启动 docker-compose:docker-compose up -d

列出所有容器:docker-compose ps

停止容器:docker-compose stop 停止正在运行的容器,可以通过 docker-compose start 再次启动

停止并删除容器:docker-compose down

查看日志:docker-compose logs

重启所有容器:docker-compose restart

暂停某个容器:docker-compose pause [SERVICE...]

进入某个容器:docker-compose exec [options] SERVICE COMMAND [ARGS...]

选项包括:

  • -d 分离模式,后台运行命令。
  • –privileged 获取特权。
  • –user USER 指定运行的用户。

docker-compose.yml

Compose 允许用户通过一个 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的 docker-compose.yml,可以使用 .yml.yaml 作为文件扩展名。

Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services部分。

注意:yml 语法的格式是非常重要的,缩进也要得当。

version: '3'
services: 
  mysql1:
    image: mysql
    container_name: mysql1
    environment: 
      - MYSQL_ROOT_PASSWORD=123456
    ports: 
     - 39111:3306

  mysql2:
    image: mysql
    container_name: mysql2
    environment: 
      - MYSQL_ROOT_PASSWORD=123456
    ports: 
       - 39112:3306

其中还有一些比较常用的属性

depends_on

在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题

version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

上述YAML文件定义的容器会先启动 redis 和 db 两个服务,最后才启动 web 服务。

volumes

挂载数据卷

volumes:
  - /opt/data:/var/lib/mysql

volumes_from

挂载数据卷容器

volumes_from:
  - service_name   
    - container_name

links

链接到其它服务中的容器。在 Redis 搭建主从架构时我便使用到了它。有兴趣的朋友看看我写过的一个 Redis 笔记

links:
  - db
  - db:database
  - redis

build

服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用up启动时执行构建任务,构建标签是 build,可以指定Dockerfile 所在文件夹的路径。

Compose 将会利用 Dockerfile 自动构建镜像,然后使用镜像启动服务容器。

build: /path/to/build/dir

 也可以是相对路径,只要上下文确定就可以读取到Dockerfile。

build: ./dir

 设定上下文根目录,然后以该目录为准指定Dockerfile。

build:
  context: ../
  dockerfile: path/of/Dockerfile

如果同时指定 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 值指定的名字。


Last modification:May 5, 2021
如果觉得我的文章对你有用,请随意赞赏