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来进行编排管理。
- 这里采用的构建部署方式为,通过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指令。
- 安装Docker-Compose就不赘述了,本文记录下 构建脚本,即拿即用
- 部署spring cloud 五个服务,分别为 eureka,gateway,sys_server, core_server, web_server
- 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
至此结束,有异议的小伙伴们欢迎留言讨论,后续补充、