什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
构建镜像 默认使用当前目录下的 dockerfile 文件
$ docker build -t nginx:v3 .
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
创建一个 springBoot 项目
加入 maven 插件
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <!-- 重新打包,否则报没有main方法 --> <goal>repackage</goal> </goals> </execution> </executions></plugin>
复制代码
简单示例
@RestController@SpringBootApplicationpublic class DockerApplication {
public static void main (String[] args) { SpringApplication.run(DockerApplication.class,args); }
@GetMapping("/") public String index(){ return "Hello docker. "+ System.currentTimeMillis(); }}
复制代码
创建 dockerfile 文件
# 基础镜像使用javaFROM java:8# 作者MAINTAINER rubble rubble@qq.com# VOLUME 指定了临时文件目录为/tmp。# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmpVOLUME /tmp# 将jar包添加到容器中并更名为app.jarADD paw-docker-1.0-SNAPSHOT.jar app.jar# 运行jar包 前面的add命令把jar复制过去,后面touch命令的作用是修改这个文件的访问时间和修改时间为当前时间。RUN bash -c 'touch /app.jar'# 指定加密算法urandomENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
复制代码
ENTRYPOINT
格式:ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 CMD 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
生成镜像
spring 项目打包后将 jar 包复制到 dockerfile 同目录下
docker build -t hello:1.0 .
首次运行会下载 java8 镜像
rubble@RubbledeMacBook-Pro docker % docker build -t hello:1.0 .[+] Building 2.0s (8/8) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 37B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/java:8 1.8s => [internal] load build context 0.0s => => transferring context: 51B 0.0s => [1/3] FROM docker.io/library/java:8@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d 0.0s => CACHED [2/3] ADD paw-docker-1.0-SNAPSHOT.jar app.jar 0.0s => CACHED [3/3] RUN bash -c 'touch /app.jar' 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:97b7ccbbd48180f71ebb2fbb8661b5c33526779baa2bbc0aa7d460857380aae1 0.0s => => naming to docker.io/library/hello:1.0 0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
复制代码
docker images 查看镜像
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello 1.0 97b7ccbbd481 31 minutes ago 678MBwurstmeister/kafka 2.12-2.5.0 3f924079abc7 8 weeks ago 500MBwurstmeister/kafka latest c3b059ede60e 8 weeks ago 507MB
复制代码
启动容器
docker run --name hello -p 8080:8080 hello:1.0
复制代码
本机浏览器访问 http://localhost:8080/
输出: Hello docker. 1628154691827
生成 docker 镜像后可以推送到阿里镜像仓库或者镜像私服 harbor,微服务集群使用时拉取镜像运行容器即可启动一个服务节点。
评论