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# 基础镜像使用javaFROM java:8ENV TZ=Asia/ShanghaiMAINTAINER 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.jarADD 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# 基础镜像使用javaFROM java:8ENV TZ=Asia/ShanghaiMAINTAINER 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.jarADD 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脚本就阔以一键部署了
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
至此结束,有异议的小伙伴们欢迎留言讨论,后续补充、
]]>