本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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
本文完
转载请注明出处,欢迎点赞 收藏 谢谢!