Docker容器学习(四)之Docker Compose

dockerlogo

以前的文章中,咱们使用docker run 命令来启动一个容器,而做为真正的线上业务环境,咱们服务确定不止一个,也就说明容器确定不止一个,而若是仍是手动的一个个来启动容器这未免会让人头皮发麻,幸亏有Docker Compose,用于定义和运行多容器Docker应用程序的工具,有了它咱们能够一次启动多个容器,这也很是适合与持续集成工具(Jenkins)来配合。java

安装 Docker Compose

  • 根据官方安装最新版本
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
复制代码
  • 安装脚本添加执行权限
chmod +x /usr/local/bin/docker-compose
复制代码
  • 注意: 根据前面的步骤理论上是安装完成了,可是咱们执行官方命令只是下载到了/usr/local/bin/这个目录,添加脚本执行权限以后docker-compose并不能生效,依据官方文档提示复制该文件到/usr/bin/目录下,并未该文件添加脚本执行权限
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

chmod +x /usr/bin/docker-compose
复制代码
  • 此时咱们执行docker-compose版本命令就能看到版本号打印
# docker-compose --version
docker-compose version 1.24.0, build 0aa59064
复制代码
  • 命令补全工具
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 命令

docker-compose 命令

  • 和前面学习Docker容器命令同样,docker-compose也有很多命令
命令 含义 示例
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
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前提下)
# docker compose 构建镜像并使用镜像启动容器(-d 表示后台启动)
docker-compose up -d 
复制代码

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

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

Docker Compose控制服务启动顺序

如何使用

  • 接下来我将介绍如何使用该脚原本控制咱们服务启动顺序
  • 首先咱们能够将脚本打包到咱们的镜像中,修改Dockerfile文件
#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配置中心是否提供服务来经过配置中心获取配置来启动其余服务
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命令后台一键启动服务,不出意外服务就可以所有启动
docker-compose up -d
复制代码

后台有顺序启动服务成功

最后

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

参考连接

相关文章
相关标签/搜索