【Docker系列】5-Dockerfile镜像制作指南

157 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Dockerfile镜像制作

指令说明

FROM

定制的镜像都是基于 FROM 的镜像,这里的 java:8 就是定制需要的基础镜像。

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。
  • 避免容器不断变大。

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

格式:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

格式:

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

[--chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。

<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

ADD

ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 CMD 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

格式:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

制作Dockerfile文件

做一个springboot应用的镜像,支持动态启动不同的jar

  • 下载Java镜像
docker pull java:8
  • 基于java镜像自定义配置文件
# 创建文件
touch Dockerfile
#编辑文件
vi Dockerfile

Dockerfile内容如下

FROM java:8
VOLUME /tmp
ENV file=""
ADD $file /root/$file
ENTRYPOINT ["sh","-c","java -jar /root/$file"]

构建镜像

当前路径下已经有springboot.jar,该文件需要大家根据自己需要构建,访问端口为10000

[root@localhost docker-workspace]# ls
Dockerfile  springboot.jar

开始构建

docker build -t springboot .
# 注意最后的点,这里是用于复制文件到镜像的,运行后如下
[root@localhost docker-workspace]# docker build -t springboot .
Sending build context to Docker daemon  17.06MB
Step 1/5 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/5 : VOLUME /tmp
 ---> Using cache
 ---> be37ad33464f
Step 3/5 : ENV file=""
 ---> Using cache
 ---> c67ba0bd2840
Step 4/5 : ADD $file /root/$file
 ---> 84467b0f1d87
Step 5/5 : ENTRYPOINT ["sh","-c","java -jar /root/$file"]
 ---> Running in 3837a1e2b502
Removing intermediate container 3837a1e2b502
 ---> d8de76659d3b
Successfully built d8de76659d3b
Successfully tagged springboot:latest

查看镜像列表

[root@localhost docker-workspace]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
springboot    latest    d8de76659d3b   33 seconds ago   660MB
java          8         d23bdf5b1b1b   4 years ago      643MB

使用镜像运行容器

docker run -d --name springboot-demo -e file="springboot.jar" --net=host springboot
# 容器命为springboot-demo

容器启动成功,结果如下:

[root@localhost docker-workspace]# docker run -d --name springboot-demo -e file="springboot.jar" --net=host springboot
f7e5f1f9a17f31e6fba1d936003d0f69cae2902ce1be45864070ba4581f03f33

查看当前运行的容器

[root@localhost docker-workspace]# docker ps -l
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS     NAMES
f7e5f1f9a17f   springboot   "sh -c 'java -jar /r…"   3 minutes ago   Up 2 minutes             springboot-demo

查看log

# f7e5f1f9a17f 为容器id
[root@localhost docker-workspace]# docker logs -f -t --tail 500 f7e5f1f9a17f
2021-05-09T04:53:59.470370513Z 
2021-05-09T04:53:59.470442237Z   .   ____          _            __ _ _
2021-05-09T04:53:59.470451324Z  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
2021-05-09T04:53:59.470458728Z ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
2021-05-09T04:53:59.470465701Z  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
2021-05-09T04:53:59.470472163Z   '  |____| .__|_| |_|_| |_\__, | / / / /
2021-05-09T04:53:59.475308631Z  =========|_|==============|___/=/_/_/_/
2021-05-09T04:53:59.501032921Z  :: Spring Boot ::                (v2.4.5)
2021-05-09T04:53:59.501068067Z 
2021-05-09T04:53:59.948592287Z 2021-05-09 04:53:59.914  INFO 8 --- [           main] com.kojon.nettest.NetTestApplication     : Starting NetTestApplication v0.0.1-SNAPSHOT using Java 1.8.0_111 on localhost with PID 8 (/root/springboot.jar started by root in /)
2021-05-09T04:53:59.951346040Z 2021-05-09 04:53:59.950  INFO 8 --- [           main] com.kojon.nettest.NetTestApplication     : No active profile set, falling back to default profiles: default
2021-05-09T04:54:03.494179107Z 2021-05-09 04:54:03.492  INFO 8 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 10000 (http)
2021-05-09T04:54:03.531423706Z 2021-05-09 04:54:03.529  INFO 8 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-05-09T04:54:03.536183760Z 2021-05-09 04:54:03.530  INFO 8 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.45]
2021-05-09T04:54:03.671942290Z 2021-05-09 04:54:03.671  INFO 8 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-05-09T04:54:03.674836706Z 2021-05-09 04:54:03.671  INFO 8 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3297 ms
2021-05-09T04:54:04.377590249Z 2021-05-09 04:54:04.376  INFO 8 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2021-05-09T04:54:04.960405122Z 2021-05-09 04:54:04.959  INFO 8 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 10000 (http) with context path ''
2021-05-09T04:54:05.010223866Z 2021-05-09 04:54:05.008  INFO 8 --- [           main] com.kojon.nettest.NetTestApplication     : Started NetTestApplication in 6.795 seconds (JVM running for 8.502)
2021-05-09T04:54:09.487014954Z 2021-05-09 04:54:09.481  INFO 8 --- [io-10000-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-05-09T04:54:09.487056933Z 2021-05-09 04:54:09.482  INFO 8 --- [io-10000-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-05-09T04:54:09.487067583Z 2021-05-09 04:54:09.485  INFO 8 --- [io-10000-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 2 ms

访问SpringBoot

image-20210513170714137 本文完 转载请注明出处,欢迎点赞 收藏 谢谢!