docker compose 的使用

在微服务时代,使用微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例。如果每个微服务都要手动启停,那么效率之低、维护量之大可想而知。本节课将讨论如何使用 Docker Compose来轻松、高效地管理容器。

docker-compose的安装

通过curl的方式安装

1
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

也可以自行到github上面下载安装

``

给予权限

1
sudo chmod +x /usr/local/bin/docker-compose

查看是否安装成功

1
docker-compose version

docker-compose 管理容器的结构

docker-compose将所管理的容器分为3层:

  • 工程层
  • 服务层
  • 容器层

工程层

docker-compose运行目录下的所有文件( docker-compose.yml、 extends文件或环境变量文件等)组成一个工程(默认为 docker-compose.yml所在目录的目录名称)

服务层

一个工程可包含多个服务,每个服务中定义了容器运行的镜像、参数和依赖,一般一个Dockerfile文件所在的文件夹,为一个服务

容器层

一个服务可包括多个容器实例

docker-compose常用命令

image

指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。

示例:

1
image: java

build

指定Dockerfile文件的路径。可以是一个路径,例如:

1
build: ./dir

也可以是一个对象,用以指定Dockerfile和参数,例如:

1
build:   context: ./dir   dockerfile: Dockerfile-alternate   args:     buildno: 1

command

覆盖容器启动后默认执行的命令

示例:

1
command: bundle exec thin -p 3000

或:

1
command: [bundle, exec, thin, -p, 3000]

链接到其他服务中的容器。可以指定服务名称和链接的别名使用SERVICE:ALIAS 的形式,或者只指定服务名称,

示例:

1
web:   links:    - db    - db:database    - redis

表示链接到docker-compose.yml外部的容器,甚至并非Compose管理的容器,特别是对于那些提供共享容器或共同服务。格式跟links类似

示例:

1
external_links:  - redis_1  - project_db_1:mysql  - project_db_1:postgresql

ports

暴露端口信息。使用宿主端口:容器端口的格式,或者仅仅指定容器的端口(此时宿主机将会随机指定端口),类似于docker run -p

示例:

1
ports:  - "3000"  - "3000-3005"  - "8000:8000"  - "9090-9091:8080-8081"  - "49100:22"  - "127.0.0.1:8001:8001"  - "127.0.0.1:5000-5010:5000-5010"

environment

从文件中获取环境变量,可以为单独的文件路径或列表。如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则以envirment 为准

示例:

1
2
env_file: .env  
env_file: - ./common.env - ./apps/web.env - /opt/secrets.env

如果感兴趣的,可以参考docker-compose.yml文件官方文档:https://docs.docker.com/compose/compose-file/