Docker-compose容器编排记录

Docker-compose容器编排记录

Scroll Down

Docker-compose容器编排记录

水篇文,记录一下使用Docker-compose编排技术部署spring cloud服务

1. Docker-compose简介

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来进行编排管理。

docker01


  • 这里采用的构建部署方式为,通过Docker-Compose使用Dockerfile文件构建镜像,然后分批次启动部署各个微服务;
  • 下文将介绍一些基本的Dockerfile 文件简介

2. Dockerfile 简介

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

2.1 Dockerfile的基本结构

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

Dockerfile文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

3. Dockerfile一些常用的指令。

3.1FROM:指定基础镜像,必须为第一个命令

格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
示例:
  FROM mysql:5.6
注:
  tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

3.2 MAINTAINER: 维护者信息

格式:
    MAINTAINER <name>
示例:
    MAINTAINER Jasper Xu
    MAINTAINER sorex@163.com
    MAINTAINER Jasper Xu <sorex@163.com

3.3 RUN:构建镜像时执行的命令

RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
    RUN <command>
exec执行
格式:
    RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
注:
  RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

3.4 ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
    ADD hom* /mydir/          # 添加所有以"hom"开头的文件
    ADD hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/

3.5 COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

3.6 CMD:构建容器后调用,也就是在容器启动时才进行调用。

格式:
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]
注:
   CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

3.7 ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
注:
   ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

  1. 安装Docker-Compose就不赘述了,本文记录下 构建脚本,即拿即用
  2. 部署spring cloud 五个服务,分别为 eureka,gateway,sys_server, core_server, web_server
  3. docker-compose通过dockerfile文件构建各个服务镜像,然后分别部署

4. Eureka构建命令

# Docker image for springboot eureka run
# VERSION 1.0.0
# Author: icefire
# 基础镜像使用java
FROM java:8
ENV TZ=Asia/Shanghai
MAINTAINER icefire
# 指定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

#创建一个目录存放jar包
RUN mkdir -p /home/demo/eureka/config /home/demo/eureka/logs

# 将jar包添加到容器中并更名为eureka.jar
ADD demo_eureka-1.0-SNAPSHOT.jar /home/demo/eureka/eureka.jar

#添加进入docker容器后的目录
WORKDIR /home/demo/eureka/

#配置项目端口
CMD ["--server.port=8000"]

#对外暴露的端口号
EXPOSE 8000

#运行脚本,启动springboot项目
#ENTRYPOINT ["java","-classpath","/home/demo/eureka/lib/*","com.example.demo.EurekaApplication","-Dspring.config.location=/home/demo/eureka/config/application.yml 2>&1 &"]
ENTRYPOINT ["java","-jar","/home/demo/eureka/eureka.jar","-Dspring.config.location=/home/demo/eureka/config/application.yml 2>&1 &"]

5. Gateway构建命令

# Docker image for springboot gateway run
# VERSION 1.0.0
# Author: icefire
# 基础镜像使用java
FROM java:8
ENV TZ=Asia/Shanghai
MAINTAINER icefire
# 指定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

#创建一个目录存放jar包
RUN mkdir -p /home/demo/gateway/config /home/demo/gateway/logs

# 将jar包添加到容器中并更名为gateway.jar
ADD demo_gateway-1.0-SNAPSHOT.jar /home/demo/gateway/gateway.jar

#添加进入docker容器后的目录
WORKDIR /home/demo/gateway/

#配置项目端口
CMD ["--server.port=8002"]

#对外暴露的端口号
EXPOSE 8002

#运行脚本,启动springboot项目
#ENTRYPOINT ["java","-classpath","/home/demo/gateway/lib/*","com.example.demo.GatewayApplication","-Dspring.config.location=/home/demo/gateway/config/application.yml 2>&1 &"]
ENTRYPOINT ["java","-jar","/home/demo/gateway/gateway.jar","-Dspring.config.location=/home/demo/gateway/config/application.yml 2>&1 &"]

其余服务类似,不一一类举

6. Docker-compose 脚本

通过上述Dockerfile 文件构建脚本写好后,编写完Docker-compose脚本就阔以一键部署了

  • Docker-compose 脚本
version: '3'
services:
  demo-eureka:
    restart: always                 
    build:
      context: ./eureka         # 指定Dockerfile所在的路径
      dockerfile: Dockerfile        # 指定Dockerfile文件名称
    image: demo-eureka:v1.0.0             # 镜像名称:版本
    container_name: eureka      # 容器名称
    ports:
      - '8000:8000'                   # 容器端口与宿主机端口的映射
    hostname: eureka
    environment:
      TZ: Asia/Shanghai
    volumes:                    #挂载数据卷,同步主机与容器的配置文件
      - /home/demo/eureka/config:/home/demo/eureka/config
      - /home/demo/eureka/logs:/home/demo/eureka/logs
      - /home/demo/eureka/lib:/home/demo/eureka/lib
    networks:
      - demo_cloud
 
  demo-gateway:
    restart: always
    build:
      context: ./gateway
      dockerfile: Dockerfile
    image: demo-gateway:v1.0.0
    container_name: gateway
    ports:
      - '8002:8002'
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /home/demo/gateway/config:/home/demo/gateway/config
      - /home/demo/gateway/logs:/home/demo/gateway/logs
      - /home/demo/gateway/lib:/home/demo/gateway/lib
    networks:
      - demo_cloud
    depends_on:
      - demo-eureka
    links:         #建立连接
      - demo-eureka

  demo-sys:
    restart: always
    build:
      context: ./sys
      dockerfile: Dockerfile
    image: demo-sys:v1.0.0
    container_name: sys
    ports:
      - '8003:8003'
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /home/demo/sys/config:/home/demo/sys/config
      - /home/demo/sys/logs:/home/demo/sys/logs
      - /home/demo/sys/lib:/home/demo/sys/lib
    networks:
      - demo_cloud
    depends_on:
      - demo-eureka
    links:         #建立连接
      - demo-eureka

  demo-core:
    restart: always
    build:
      context: ./core
      dockerfile: Dockerfile
    image: demo-core:v1.0.0
    container_name: core
    ports:
      - '8006:8006'
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /home/demo/core/config:/home/demo/core/config
      - /home/demo/core/logs:/home/demo/core/logs
      - /home/demo/core/images:/home/demo/core/images
      - /home/demo/core/lib:/home/demo/core/lib
    networks:
      - demo_cloud
    depends_on:
      - demo-eureka
    links:         #建立连接
      - demo-eureka  

  demo-web:
    restart: always
    build:
      context: ./web_server
      dockerfile: Dockerfile
    image: demo-web:v1.0.0
    container_name: web
    ports:
      - '8001:8001'
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /home/demo/web_server/config:/home/demo/web/config
      - /home/demo/web_server/images:/home/demo/web/images
      - /home/demo/web_server/logs:/home/demo/web/logs
      - /home/demo/web_server/lib:/home/demo/web/lib
    networks:
      - demo_cloud
    depends_on:
      - demo-eureka
    links:         #建立连接
      - demo-eureka      

networks:
    demo_cloud:
      external: true

至此结束,有异议的小伙伴们欢迎留言讨论,后续补充、