Docker Compose介绍

如果我们有一个APP是由多个容器组成,那我们在部署这个APP的时候就会非常的繁琐,我们要去维护多个Docker image,基于这些image我们还要创建多个container,要管理这些container会非常麻烦,比如启动停止删除等,需要分别一个个的操作,Compose就是来解决这个问题的,它所赋予的使命就是“批处理”,如果我们一个应用有十个容器,那我们利用compose,只需要执行一条命令就可以完成这些容器的启动停止等操作。

Docker Compose是一个工具,这个工具可以通过一个yml文件定义多个容器的Docker应用,通过一条命令就可以根据yml文件的定义去创建或者管理这些多个容器。

docker-compose.yml文件

compose的yml文件默认名称是Docker-compose.yml,我们可以根据需要更改名称。此文件有三大概念,Services、Networks、Volumes。

docker-compose的文件格式版本经历了三个版本,分别时version-1、2、3,我们现在基本使用3版本,但是1版本现在不要用,基本淘汰了,2版本定义虽然变化不大,但是2版本只能应用在单机,3版本就可以管理多机的场景(多个容器部署在不同的物理机器上)

Services

一个services代表一个container,这个container可以从dockerhub的image来创建,或者从本地的Dockerfile build出image然后创建

Service的启动类似与docker run命令,所以我们docker run命令可以指定的参数我们都可以通过compose文件指定出来,可以给其指定network和volume,所以可以给service指定network和volume的引用

yml配置语法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 固定声明文件版本
version: '3'

# 固定声明services
services:

# worker是表示这个services的名称
worker:

# (注意此两项只需要写一项)
# 声明要创建的容器的image,来源为DockerHub
image:mysql:5.7

# 声明要创建的容器的image,来源为此配置目录下的Dockerfile
build: ./worker

# 声明端口映射,将容器的端口映射到本地
ports:
- 8080:80

# 声明环境变量
environment:
WORDPRESS_DB_HOST: mysql

# 声明映射的volume
volumes:
- db-data:/var/lib/mysql/data

# 声明我们的容器会与那几个容器做link,实际应用不广泛,我们在link时都是直接指定network的bridge,多个容器链接在同一个bridges上,它们自然是互通的
links:
- redis
- mysql

# 生命容器使用的network
networks:
- back-tier

# 固定生命volumes
volumes:

# 与上述services中声明对应
db-data:

# 固定声明networks
networks:

# 与services中声明对应,这里详细具体定义
back-tier:

# 声明此命名空间使用的驱动
driver: bridge

以下是一个实际应用的示例,这个示例中我们一个APP应用了两个容器,并对它们做关联,具体的yml文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '3'

services:

wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge

mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge

volumes:
mysql-data:

networks:
my-bridge:
driver: bridge

docker-compose的具体使用

首先需要安装docker-compose,在Windows等版本的Docker安装中默认就会安装compose,但是Linux中不会,所以需要我们手动安装一下,安装步骤如下:

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

  2. chmod +x /usr/local/bin/docker-compose

安装完成,运行: docker-compose –version 就可以看到compose的具体信息

docker-compose 命令

具体使用我们可以通过:docker-compose –help 命令来查看帮助

  1. docker-compose up命令

前面我们讲了yml文件,定义好此文件后,我们可以通过此命令来创建容器了,一般我们就在yml文件所在的目录执行:dokker-compose up命令即可,但是我们之前说此yml文件的名称是可以自定义的,如果修改为其他名称就需要:docker-compose -f [文件名称] up 来创建我们的容器了,我们也可以添加 -d 参数来后台启动,即不打印日志

  1. docker-compose stop命令

停止我们通过 docker-compose up 命令一次启动的各个容器

  1. docker-compose start

重启我们之前通过 docker-compose up 命令一次启动的各个容器

  1. docker-compose down

停止并删除之前通过 docker-compose up 命令一次启动的各个容器,并且删除container,以及network,但是它并不会删除image和volume

  1. docker-compose ps

查看我们通过yml创建的所有容器

  1. docker-compose iamge

查看我们通过yml创建container,以及定义它的image

  1. docker-compose exec

docker-compose exec [yml文件service定义的容器名称] bash,等同于docker exec it [容器名称] /bin/bash

水平扩展和伏在均衡(scale)

有时候我们线上的服务机器数量较少,但遇到大并发机器处理不过来的时候,我们需要横向扩展机器,这时我们compose就遇到大用处了

通过:docker-compose up -scala [yml文件services中定义的容器名称]=[容器的总数量] -d 就可以迅速的扩展机器

注意:如过本身我们已经有2个容器,我们指定容器的总数量为5,那么它会新添加3个,一共5个,而不是新添加5个

扩展后我们通过:docker-compose ps,就可以查看到扩展后的容器

注意:如果我们在yml文件中指定了端口映射,那么如果一个机器上扩展的多个容器都映射到本机一个端口上,就会造成端口冲突,所以我们需要在yml文件中去除端口映射的代码,让它自己生成。这个时候我们只需要在添加一个负载均衡的容器,让它来监听各个容器内部的端口,一般都是我们在容器服务代码中指定好的端口,然后请求打在这个负载均衡的容器上,就完成了一个完美的横向扩展。(这里我们需要了解到,Spring Cloud Eurka它天生就是这个作用,我们启动服务自己就注册到了Eurka上,可以快速的横向扩展)

当我们使用此命令设置的容器的总数量小于实际在运行的容器总数量时,它会自动回收停止掉一些,完成闲时资源释放

注意:上述命令我们指定了要扩展数量的容器名称,如果我们的yml中定义了多个容器,我们只会扩展指定的容器的数量,不会扩展其中定义的其他容器

最后更新: 2020年06月03日 22:33

原始链接: https://jjw-story.github.io/2020/06/03/Docker-Compose/

× 请我吃糖~
打赏二维码