本文重点记录一下Docker部署SpringBoot应用时需要注意的地方。构建jar包及Docker基础知识不在范围内。
假如SpringBoot应用使用内置的tomcat,且配置文件中不修改端口,即默认的8080
1、构建启动
DockerFile文件名称是demoFile,内容如下:
FROM java:8 VOLUME /tmp COPY demo.jar demo.jar RUN bash -c "touch /demo.jar" EXPOSE 8080 ENTRYPOINT ["java", "-jar", "demo.jar", "--server.port=8080"]
目录结构如下:
构建镜像:
docker build -f demoFile -t demoimage .
生成并启动容器:
docker run -d -p xxxx:8080 --name demo demoimage
访问地址为:http://192.168.7.151:xxxx/user
2、替换jar包
现在的jar包在构建镜像的时候已经放入容器了,见DockerFile中语句:copy demo.jar demo.jar。
假如修改了jar包,要重新放到容器中该怎么办呢?使用如下命令:
docker cp demo.jar e304979b7b3c:/demo.jar
e304979b7b3c:指容器ID。直接覆盖替换掉,重启容器生效。容器启动或停止时都可以执行该命令。
3、关于端口:
1)生成并启动容器,必须指定外部、内部端口,错误示例如下:
[root@localhost demo]# docker run -d --name demo demoimage
2)DockerFile中server.port优先级高于SpringBoot中指定的端口,此例中EXPOSE端口无效,如下
2.1)SpringBoot中7777,不指定EXPOSE,不指定server.port,则生成并启动容器方式为:
docker run -d -p xxxx:7777 --name demo demoimage
2.2)SpringBoot中7777,EXPOSE中8080,不指定server.port,则生成并启动容器方式为:
docker run -d -p xxxx:7777 --name demo demoimage
2.3)SpringBoot中7777,不指定EXPOSE,server.port中8081,则生成并启动容器方式为:
docker run -d -p xxxx:8081 --name demo demoimage
2.4)SpringBoot中7777,EXPOSE中8080,server.port中8081,则生成并启动容器方式为:
docker run -d -p xxxx:8081 --name demo demoimage
2.5)Windows中SpringBoot中配置了端口7777,在cmd中启动运行:
D: emp>java -jar demo2.jar --server.port=8080,外部访问8080生效(优先级高)
3)同一个镜像可以生成并启动多个容器(指定的外部端口和容器名不能一样)
4、关于VOLUME
VOLUME /tmp:会自动(好像有问题?测试不行)在宿主机/var/lib/docker下创建一个tmp的目录,网上说是连接到容器的/tmp
对于这块不是很明白,做些记录,希望以后有时间可以研究一下:
1)在demoFile中不设置VOLUME /tmp,手动创建/var/lib/docker/tmp,可以成功创建镜像,并运行。
2)在demoFile中设置VOLUME /aaaa,删除宿主机的/var/lib/docker/tmp路径,不能创建镜像,且不会自动创建/var/lib/docker/aaaa。
3)在demoFile中设置VOLUME /aaaa,手动创建/var/lib/docker/tmp,可以成功创建镜像,并运行。不会自动创建/var/lib/docker/aaaa。
4)只要有/var/lib/docker/tmp路径,就可以创建、运行镜像。Spring Boot使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录。