赞
踩
现在我们的系统大多以微服务架构居多,在以Spring Cloud微服务技术栈中,一个应用系统一般会包含多个应用微服务。在启动应用前,需要先启动网关、注册中心、配置中心、数据库,甚至当系统还引入了各种中间件,如Redis、RabbitMQ、ELK日志系统、Grafana监控…等服务。
在部署微服务应用时,需要先将开发的Spring Boot服务打包成Docker镜像,导入Docker中再启动部署,中间件、数据库等服务也需要从Docker的远程仓库中拉取对应版本的镜像进行部署,往往繁琐却需要花费大量时间,我们可以利用Docker官方提供的容器编排工具Docker Compose来减轻工作量。
利用各种工具,来让容器部署、管理、弹性伸缩、网络管理等功能都能够自动化进行,这就是容器编排。
我们常常听说的Kubernetes,是一个强大的容器编排工具,除此之外,Docker Swarm、Docker Compose也是比较常用的编排工具。
Docker Compose和Docker Swarm都是Docker官方容器编排工具的项目,两者的作用不同,Docker Compose是一个用于定义和运行多容器 Docker 应用程序的工具,主要用在单机上创建容器,而Docker Swarm是用来管理Docker集群的平台,可以用在多个服务器上创建容器服务。而K8s本身的定位和Docker Swarm一样,是由谷歌研发的一款容器运维平台。目前已成为主流的容器编排工具。
了解Docker compose之前,需要先了解Dockerfile。我们的Spring Boot服务,在编译完还只是一个jar包,需要借助Dockerfile将jar包构建成docker镜像,才能将服务部署到Docker容器上。
Dockerfile是一个用来构建镜像的文本文件,文件的内容包含了一条条用于构建镜像时所需要的指令和说明。要注意的是,每一条指令都将会构建一层镜像。Dockerfile指令其实并不多,但日常基本掌握常用的指令也足够使用了。
指定基础的镜像,一般为文件的第一条指令,但其实前面还可以使用ARG
作为第一条指令。
# 格式:
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
# 用法
FROM centos
FROM openjdk:8-jre
FROM node:12.18.4-alpine@sha256:757574c5a2...
参数说明:
[--platform=<platform>]
为可选参数,可用于指定image的平台,如linux/amd64、 linux/arm64或windows/amd64,一般为默认即可<image>
为镜像名,后面的:tag
是用于指定镜像的版本号,@digest
为内容可寻址标识符(详细可以去官网查看),一般我们用的比较多的还是只有tag,如果两者都不指定的话,获取的为latest版本[AS <name>]
为命名当前构建的阶段,因为Dockerfile中可以使用多个FROM来创建多镜像,所以使用AS <name>
可以在后面的COPY指令上,使用--from=<name>
来引用前面构建的镜像,如复制前面镜像生成的文件等该指令用于指定传递给构建 运行时的一个变量,可以设置默认值,在使用docker build
命令构建容器时,用--build-arg <varname>=<value>
可以传递参数。
# 格式 ARG <name>[=<default value>] # 用法 ARG CODE_VERSION=laster ARG testArg=123 # 传参用法 FROM centos:7 ARG parameter=123 RUN echo $parameter docker build --build-arg parameter=234 -t test:1.0 # 注意 ARG可以用在FROM之前,是位于FROM构建阶段之外,因此在FROM之后的任何指令中都不能使用。 ARG CENTOS_VERSION=laster FROM centos:${CENTOS_VERSION}
该指令用于为容器设置环境变量,在构建过程中以及启动的容器中都会存在。
# 格式
ENV <key>=<value> ...
# 注意
可设置多个,也可以使用另一种语法ENV <key> <value>,官网推荐使用前者,后者可能会在未来的版本删除
ENV变量会覆盖ARG变量
# 用法
ENV APP_VERSION=1.1.0
ENV WEB_HOME /opt/webapps
该指令用于从路径复制文件或目录到容器中。
# 格式
COPY <src>... <dest>
COPY "<src>",... "<dest>"
# 用法
COPY test.jar /opt/web/
该指令用于将文件、目录或者远程文件复制到镜像中,tar类型的压缩包文件会自动解压。
# 格式
ADD <src>... <dest>
ADD "<src>",... "<dest>"
# 用法
ADD test.txt /tmp/test
该指令为后续指令设置工作目录,如果不存在,则会自动创建目录。
# 格式
WORKDIR /path/to/workdir
# 用法
WORKDIR /build
该指令用于指定镜像的元数据标签信息。
# 格式
LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 用法
LABEL version="1.0"
LABEL description="This text illustrates"
该指令用于设定构建镜像后,容器启动时执行的命令。
# 格式
CMD ["executable","param1","param2"](执行形式,这是首选形式)
CMD ["param1","param2"](作为ENTRYPOINT 的默认参数)
CMD command param1 param2(shell形式)
# 用法 支持两种写法
CMD sleep 40; java -jar secondkill-order.jar
CMD ["java", "-jar", "secondkill-order.jar"]
该指令用于指定构建该镜像时执行的命令,RUN和CMD的区别主要是CMD在容器启动时才会执行,而RUN是在容器构建的过程中执行。
# 格式
RUN <command>(shell形式)
RUN ["executable", "param1", "param2"](执行形式)
# 用法 支持两种写法
RUN yum install -y net-tools
RUN ["/bin/bash", "-c", "echo hello"]
该指令用于指定容器运行时侦听指定的端口,可以指定监听的协议,如果不指定,则默认为TCP。
# 格式
EXPOSE <port> [<port>/<protocol>...]
# 用法
EXPOSE 80/udp
EXPOSE 80 443
该指令用于创建一个具有指定名称的挂载点,可以将该目录映射到容器外部。
# 格式
VOLUME ["/data"]
# 用法
VOLUME /myvol
这里只稍微整理了一些比较常用的dockerfile命令,如果想了解更多指令的详细介绍,建议直接阅读官网的文档。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。