Docker容器学习(四)之Docker Compose

dockerlogo

之前的文章中,我们使用docker run 命令来启动一个容器,而作为真正的线上业务环境,我们服务肯定不止一个,也就说明容器肯定不止一个,而如果还是手动的一个个来启动容器这未免会让人头皮发麻,幸好有Docker Compose,用于定义和运行多容器Docker应用程序的工具,有了它我们可以一次启动多个容器,这也非常适合与持续集成工具(Jenkins)来配合。

安装 Docker Compose

  • 根据官方安装最新版本
1
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • 安装脚本添加执行权限
1
chmod +x /usr/local/bin/docker-compose
  • 注意: 根据前面的步骤理论上是安装完成了,但是我们执行官方命令只是下载到了/usr/local/bin/这个目录,添加脚本执行权限之后docker-compose并不能生效,依据官方文档提示复制该文件到/usr/bin/目录下,并未该文件添加脚本执行权限
1
2
3
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

chmod +x /usr/bin/docker-compose
  • 此时我们执行docker-compose版本命令就能看到版本号打印
1
2
# docker-compose --version
docker-compose version 1.24.0, build 0aa59064
  • 命令补全工具
1
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
  • 版本
    Docker Compose版本对应

docker-compose.yml 命令

命令 含义 示例
build 构建或重新构建服务 build [options] [–build-arg key=val…] [SERVICE…](使用 docker-compose help build 查看详细使用)
help 查看docker-compose命令帮助文档 docker-compose help COMMAND(标识要看的命令)
up 构建、创建、重新创建、启动,连接服务的相关容器。所有连接的服务都会启动,除非它们已经运行(前提该目录下已经存在docker-compose.yml文件) docker-compose up(直接启动,该命令退出,所有容器停止) docker-compose up -d (后台运行所有容器)
kill 发送SIGKILL 信号停止指定服务的容器 docker-compose kill api-feign(注意该名称为docker-compose.yml中定义的服务名称)
start 启动指定服务已存在的容器 docker-compose start api-feign
stop 停止指定服务已存在的容器 docker-compose stop api-feign
logs 查看服务的日志输出 docker-compose logs –tail=”all” api-feign(查看api-feign 全部日志输出)
ps 列出所有容器 docker-compose ps (和docker ps -a 一样可以查看容器,显示信息不一样)
rm 删除指定服务的容器 docker-compose rm api-feign

编写docker-compose.yml 启动多服务

  • 服务器任意目录编写文件 docker-compose.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
    version: '3.4'
    services:
    configerver: # 指定一个服务名称
    image: mao/configserver:0.0.1-SNAPSHOT # 镜像名称
    ports:
    - 8666:8666 # 指定端口映射
    eureka:
    image: test1/eureka1:0.0.1-SNAPSHOT
    ports:
    - 8805:8805
    server-admin:
    image: mao/server-admin:0.0.1-SNAPSHOT
    ports:
    - 8806:8806
    api-feign:
    image: mao/api-feign:0.0.1-SNAPSHOT
    ports:
    - 8840:8840
    ribbon-consumer:
    image: mao/ribbon-consumer:0.0.1-SNAPSHOT
    ports:
    - 8830:8830
    ribbon-provider:
    image: mao/ribbon-provider:0.0.1-SNAPSHOT
    ports:
    - 8820:8820
  • 在docker-compose.yml目录下执行命令启动多个服务(安装好Docker Compose前提下)

1
2
# docker compose 构建镜像并使用镜像启动容器(-d 表示后台启动)
docker-compose up -d

docker-compose.yml启动对应的服务

  • 由上图我们发现各个服务都已经启动在各自的容器当中,但是访问服务的时候只有configserver(配置中心)能够访问,其他服务都不能访问,我们仔细想想就能知道,除了配置中心,其他服务的配置文件都要通过配置中心来获取,但是docker-compose启动是同时的,所以配置中心服务还没提供其他服务就已经启动了,这显然会让其他服务报错,所以在生产环境中我们必须要控制服务的启动顺序,也就是最先启动配置中心,然后启动注册中心,最后再启动其他服务。

Docker Compose控制服务启动顺序

  • Docker Compose控制服务启动顺序官方文档说明,本文使用wait-for-it方案,除了wait-for-it,还有dockerizewait-for 方案。
  • wait-for-it是一个bash脚本,执行该脚本将等待主机和TCP端口的可用性。它可用于同步相互依赖的服务的启动,例如链接的docker容器

    如何使用

  • 接下来我将介绍如何使用该脚本来控制我们服务启动顺序
  • 首先我们可以将脚本打包到我们的镜像中,修改Dockerfile文件

    1
    2
    3
    4
    5
    #Dockerfile中 
    ....
    COPY wait-for-it.sh /wait-for-it.sh #在本项目模块根目录下复制wait-for-it.sh 到镜像/目录下
    RUN chmod +x /wait-for-it.sh # 修改脚本权限
    ....
  • 再次使用docker-maven-plugin打包镜像

  • 重新编写docker-compose.yml文件,添加entrypoint执行我们前面打包如镜像的wait-for-it.sh脚本监控配置中心是否已经提供服务,注意ENTRYPOINT指令是不会被覆盖的,最终会执行监控./wait-for-it.sh configerver:8666配置中心是否提供服务来通过配置中心获取配置来启动其他服务
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
52
53
version: '3.7'
services:
configerver: # 指定一个服务名词
image: mao/configserver:0.0.1-SNAPSHOT # 镜像名称
ports:
- 8666:8666 # 指定端口映射
depends_on:
- eureka
eureka:
image: mao/eureka:0.0.1-SNAPSHOT
ports:
- 8805:8805
entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
server-admin:
image: mao/server-admin:0.0.1-SNAPSHOT
ports:
- 8806:8806
depends_on:
- eureka
- configerver
entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
api-feign:
image: mao/api-feign:0.0.1-SNAPSHOT
ports:
- 8840:8840
depends_on:
- eureka
- configerver
entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
ribbon-consumer:
image: mao/ribbon-consumer:0.0.1-SNAPSHOT
ports:
- 8830:8830
depends_on:
- eureka
- configerver
entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
ribbon-provider:
image: mao/ribbon-provider:0.0.1-SNAPSHOT
ports:
- 8820:8820
depends_on:
- eureka
- configerver
entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
gateway:
image: mao/gateway:0.0.1-SNAPSHOT
ports:
- 8081:8081
depends_on:
- eureka
- configerver
entrypoint: "./wait-for-it.sh configerver:8666 -- java -jar /app.jar"
  • 然后我们在服务器中执行docker-compose命令后台一键启动服务,不出意外服务就能够全部启动
1
docker-compose up -d

后台有顺序启动服务成功

最后

  • 本篇文章我们学习了如何使用Docker Compose来启动多个容器,而多个容器改如何管理呢?谷歌已经给了我们答案,那就是使用k8s,而k8s是什么呢,请看我的这一篇文章Kubeadm 部署 Kubernetes 1.14.2 集群

参考链接

-------------本文结束感谢阅读-------------
0%