docker部署springboot项目
1、项目结构
pom文件中加入:docker-maven-plugin
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.11</version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
2、创建Dockerfile文件
在src/main/docker文件夹下创建用于生成镜像的文件
文件内容:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD kzng-thymeleaf.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
文件解释:
FROM为使用哪个镜像
VOLUME为挂载路径
ADD为复制文件到镜像中
RUN为初始化时运行的命令
ENV为设置环境变量
ENTRYPOINT为启动时运行的命令
VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。该步骤是可选的,如果涉及到文件系统的应用就很有必要了。/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录
项目的 jar 文件作为 “app.jar” 添加到容器的
ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/urandom” 作为 Entropy Source
3、docker部署springboot项目
- 在服务器创建mydocker文件夹,并且将上面写好的Dockerfile文件和打包好的springboot项目放到该文件夹下
- 构建项目镜像
执行docker build命令,docker就会根据Dockerfile-kzng里你定义好的命令构建新的镜像
在该mydocker目录下,命名为kzng_app(注意后边有个点)
docker build -f Dockerfile-kzng -t kzng-app .
其中-f代表选择的镜像文件Dockerfile-kzng,-t代表要构建的镜像的tag,.代表当前目录,也就是Dockerfile-kzng文件所在的目录。
查看镜像是否创建成功 docker images
注:容器时间和宿主时间会不一致
查看容器的时间:
docker exec [containerId] date
创建容器时注意与宿主机时间保持一致(-v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime)
docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -d -p 5050:5050 kzng-app
此方法只修改了容器时间,但启动的服务仍然还是差8小时 ,最好的方法直接在Dockfile文件中修改时间、时区
4、启动项目
docker run -d -p 80:8888 kzng-app
-d参数是让容器后台运行
-p 是做端口映射,此时将服务器中的80端口映射到容器中的80(项目中端口配置的是80)端口 建议应用系统设置一致
当出现:docker: Error response from daemon: driver failed programming external connectivity on endpoint epic_kowalevski时重启docker(systemctl restart docker)
5、结尾
当docker运行部署好后,若只能在服务器端访问,而不能在其它客户端机器上访问时,即(Linux 下 Docker 端口映射到宿主机后 外部无法访问对应宿主机端口)
需要进行如下配置:
解决办法:
# vi /etc/sysctl.conf
或者
# vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
# systemctl restart network
查看是否修改成功
# sysctl net.ipv4.ip_forward
如果返回为“net.ipv4.ip_forward = 1”则表示成功了