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”則表示成功了