1、Dockerfile
(1)Dockerfile概念
Dockerfile是一个文本文件,其中包含一条条的指令。
基于基础镜像,每条指令构建一层镜像,最终使用docker build构建一个新的镜像。
使用Dockerfile可以统一开发、测试和运维的环境,避免因为环境不同而产生的问题。
对于开发人员:可以为开发团队提供一个完全一致的开发环境。
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了。
对于运维人员:在部署时,可以实现应用的无缝移植。
(2)Dockerfile指令
Dockerfile支持一系列指令,一些用于构建镜像,另一些用于从镜像中运行容器。
关键字 | 作用 | 备注 |
FROM | 指定父镜像 | 基于那个镜像构建新镜像 |
MAINTAINER | 作者信息 | 镜像维护者信息 |
LABEL | 标签 | 可以使用Label代替Maintainer,用法更加灵活 |
RUN | 执行命令 | 构建镜像时运行的Shell命令。默认是/bin/sh格式: RUN command 或者 RUN ["command" , "param1","param2"] |
CMD | 容器启动命令 | 基于本镜像运行容器时执行的默认命令。如果有多个CMD指令,则最后一个生效。格式: CMD command param1 param2 或者 CMD ["command" , "param1","param2"] |
ENTRYPOINT | 入口 | 基于本镜像运行容器时执行。可单独使用,也可与CMD配合使用。如果有多个CMD指令,则ENTRYPOINT最后一个生效。 一般在制作执行就关闭的容器中使用 |
COPY | 复制文件 | 构建镜像的时候复制文件到本镜像中 |
ADD | 添加文件 | 构建镜像的时候添加文件到本镜像中。并不局限于当前构建上下文,也可以来源于远程服务 |
ENV | 环境变量 | 指定构建时候的环境变量,格式ENV name=value。可以在启动的容器的时候通过-e覆盖。 |
ARG | 构建参数 | 构建参数。只在构建镜像的时候使用。如果有ENV,那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定构建镜像中的挂载点,使容器中的一个目录具有持久化存储数据的功能。启动容器的时候使用 -v 绑定。格式 VOLUME ["目录"] |
EXPOSE | 暴露端口 | 定义容器运行的服务端口。 格式:EXPOSE 8080 或者 EXPOSE 8080/udp 启动容器时使用-p来绑定到宿主机的端口。 |
WORKDIR | 工作目录 | 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录。 指定容器内部的工作目录。如果没有创建则自动创建;如果指定 / 使用的是绝对地址;如果不是/开头就是在上一条workdir路径的相对路径 |
USER | 指定执行用户 | 指定构建时RUN、CMD、ENTRYPONT的执行用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令。基本上没用,因为很多时候应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候。当执行FROM完成之后,会执行ONBUILD的命令,但是不影响当前镜像,用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出 |
SHELL | 指定执行脚本的shell | 指定RUN、CMD、ENTRYPOINT执行命令时使用的shell |
(3)基础镜像的选择
Docker镜像是基于基础镜像来构建的,选择的基础镜像越高级,我们要做的底层工作就越少。比如,如果构建一个Java应用的镜像,选择一个openjdk的镜像作为基础镜像比选择一个alpine镜像作为基础镜像要简单地多。
(4)使用Dockerfile来自定义镜像
在项目的根目录(pom文件的同一级)下创建Dockerfile文件,说明如何构建镜像。
FROM java:8
EXPOSE 8080
ARG JAR_FILE
ADD target/${JAR_FILE} /app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
2、使用spring-boot-maven-plugin部署
(1)build-image命令
完成应用开发后,通常使用maven打包成jar文件,然后使用docker将jar文件构建成一个镜像(docker image),就可以在docker daemon中创建基于镜像的容器并提供服务了。
Spring Boot 2.4推出了自己的docker构建工具,整合在原有的spring-boot-maven-plugin中,只需要配置对应目标仓库和主机信息即可完成镜像构建。
这种方式支持下图中在开发机器没有安装Docker的情形下,通过192.168.0.10的Docker Remote API完成镜像构建并发布到192.168.0.20的镜像仓库。
另外,本插件提供了SpringBoot应用构建镜像的配置文件,无需自己编写Dockerfile镜像构建过程,从而直接自动构建应用的镜像。
(2)配置spring-boot-maven-plugin
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>climb-edu</artifactId>
<groupId>com.climbcloud.edu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>climb-edu-service</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>p12</nonFilteredFileExtension>
<nonFilteredFileExtension>jks</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<!-- 生成镜像名称 -->
<name>climbcloud/${project.artifactId}</name>
<!-- 执行完build后自动push -->
<publish>false</publish>
</image>
<!--配置构建宿主机信息,本机不用配置-->
<docker>
<host>http://192.168.0.106:2375</host>
<tlsVerify>false</tlsVerify>
</docker>
</configuration>
</plugin>
</plugins>
</build>
</project>
(3)生成镜像
1、在生成镜像之前,在父项目中使用Maven的install命令将所有项目都安装到本地仓库中,生成镜像时会从本地仓库或远程仓库中获取依赖。
2、使用mvn spring-boot:build-image命令构建镜像。
注意:镜像构建过程中很多依赖会从Github上下载约100M,网络不好的情况下会下载失败,多试几次就好了。
[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ climb-edu-service ---
[INFO] Building jar: C:\Java\vc_course_project\climb-edu\climb-edu-service\target\climb-edu-service.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.5.1:repackage (repackage) @ climb-edu-service ---
[INFO] Replacing main artifact with repackaged archive
[INFO]
[INFO] --- spring-boot-maven-plugin:2.5.1:repackage (default) @ climb-edu-service ---
[INFO] Replacing main artifact with repackaged archive
[INFO]
[INFO] <<< spring-boot-maven-plugin:2.5.1:build-image (default-cli) < package @ climb-edu-service <<<
[INFO]
[INFO] --- spring-boot-maven-plugin:2.5.1:build-image (default-cli) @ climb-edu-service ---
[INFO] Building image 'docker.io/climbcloud/climb-edu-service:latest'
[INFO]
[INFO] > Pulling builder image 'docker.io/paketobuildpacks/builder:base' 0%
[INFO] > Pulling builder image 'docker.io/paketobuildpacks/builder:base' 100%
[INFO] > Pulled builder image 'paketobuildpacks/builder@sha256:870e606466683750ac34ce45b33d4096ece06cf9489cc3b4c2f3fcd94da8a4d2'
[INFO] > Pulling run image 'docker.io/paketobuildpacks/run:base-cnb' 100%
[INFO] > Pulled run image 'paketobuildpacks/run@sha256:8d05ba1977ffef1e1499667d8e468fc60ebf1cc77d4df4c97aa10dd350c3b76f'
[INFO] > Executing lifecycle version v0.11.3
[INFO] > Using build cache volume 'pack-cache-ad2993bff3f1.build'
[INFO]
[INFO] > Running creator
[INFO] [creator] ===> DETECTING
[INFO] [creator] ===> ANALYZING
[INFO] [creator] ===> RESTORING
[INFO] [creator] ===> BUILDING
[INFO]
[INFO] Successfully built image 'docker.io/climbcloud/climb-edu-service:latest'
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
3、在Docker环境中可以查看生成的镜像。
docker images
4、启动SpringBoot应用:
创建容器:
docker create \
--name=climb-edu-service \
-p 8080:8080 \
-v /etc/localtime:/etc/localtime:ro \
--restart=always \
climbcloud/climb-edu-service:latest
启动容器:
docker start climb-edu-service
5、测试登录操作
如果容器不能被访问,查看可知SpringBoot对内存有要求,至少要分配3G给宿主机。