本篇博客記錄如何用idea裏的docker插件去部署springboot項目到docker容器裏
相關Linux的準備工作
1、配置docker遠程連接端口
編輯服務器上的docker.service文件
vi /usr/lib/systemd/system/docker.service
找到如下圖所示的地方,添加以下東西(版本需爲centos7以上):
-H tcp://0.0.0.0:2375
如果版本是centos7以下的則直接在這一行的最後添加即可,centos7以下版本添加後的全部代碼爲:
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
2、保存修改退出,重啓docker
systemctl daemon-reload
service docker restart
3、測試遠程連接是否正常
curl http://localhost:2375/version
如果出現以下內容則能正常連接:
4、開放端口
需要將2375端口進行開放才能被遠程連接,如果是阿里雲主機的話,可以直接登錄阿里雲去進行開放:
如果是虛擬機的話,可以用以下命令進行開放:
firewall-cmd --zone=public --add-port=2375/tcp --permanent
然後用瀏覽器訪問Linux主機的IP:2375/version,測試端口是否開放成功
5、在docker裏裝MySQL數據庫(如果已經裝過則不用)
#拉取MySQL鏡像
docker pull mysql:5.7
#使用鏡像開啓服務(PASSWORD後面是root用戶的密碼)
docker run -d -p 3308:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
然後看MySQL是否已啓動:
如果已啓動,則可以用工具去連接,注意端口用3308,因爲MySQL的3306端口映射成了3308
6、在docker裏裝redis(如果已經裝過則不用)
#拉取redis鏡像
docker pull redis
#啓動redis
#redis-server --appendonly yes:在容器執行redis-server啓動命令,並打開redis持久化配置
#requirepass "123456":配置redis連接密碼
docker run --name redis -p 6379:6379 -d --restart=always redis redis-server --appendonly yes --requirepass "123456"
然後看redis是否已啓動:
如果已啓動,則可以用工具去連接,端口用6379
相關idea的操作
1、下載docker插件
在File-》Setting-》Plugins-》Browse Repositones進行下載:
2、使用docker插件連接到Linux上的docker容器
在File-》Settings-》Build, Execution, Deployment-》Docker裏用Linux主機的IP:2375進行連接:
連接成功後可以看到docker裏所有的鏡像以及容器:
3、在項目中添加一個docker文件夾並創建Dockerfile文件
Dockerfile文件的內容如下:
#這是基礎鏡像
FROM java:8
VOLUME /tmp
#複製jar包到鏡像中,並且將名字改成app.jar
ADD springboot_project.jar app.jar
#在容器啓動的時候運行命令,來啓動我們的項目(這其實就是一段Linux命令)
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
建議先登錄Linux用命令拉取java:8基礎鏡像,這樣以免到後面build鏡像的時候才拉取,造成用時很長
4、在pom.xml裏添加docker相關配置
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<!--綁定mvn package命令,當執行package這個maven命令打包項目的同時
會把target目錄下的jar包給copy到docker目錄去-->
<executions>
<execution>
<phase>package</phase>
<configuration>
<tasks>
<copy todir="src/main/docker" file="target/${project.artifactId}.${project.packaging}"></copy>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
5、添加一個docker配置
具體配置如下:
部分解釋如下:
1.Name:這個根據自己的項目進行命名
2.Server:這個就是遠程的服務器上的docker
3.Dockerfile:這個就是自己項目的Dockerfile文件
4.Image Tag:不能重複根據自己項目來定義
5.Container name:創建你自己生成容器的名字
6.Bindports:綁定服務器對外提供的端口和自己項目的端口(阿里雲的端口需要在後臺自行管理打開)
格式爲[宿主機端口]:[容器內部端口]
7.Bind mounts:靜態資源存放路徑的映射,根據自己的項目自行映射
格式爲[宿主機目錄]:[容器內部目錄]
8.Command line options:這是docker內部的機制當某個容器需要其他運行容器的時候需要在這裏配置
語法:--link 運行容器的名稱: 自己定義的名稱(多個的容器的話需要使用空格分隔)
6、將項目打成jar包
打包成功後,項目的target目錄跟docker目錄下都有一個jar包
7、運行docker來build鏡像
運行之前配置好的Dockerfile,打包鏡像,並將鏡像部署到遠程docker運行:
8、用瀏覽器訪問項目看效果
用瀏覽器訪問Linux主機IP+端口+項目名,效果如下:
部署期間遇到的問題
項目部署成功後訪問登錄頁面,調用後端接口生成的圖片驗證碼顯示不出來,看日誌在報空指針異常,如下圖:
產生原因:我開始用的jdk基礎鏡像是openjdk:8-jdk-alpine,這個版本的jdk相比於我們平時用的jdk是不完整的,有些包是沒有的,所以導致空指針異常的出現
解決方案:將基礎鏡像換成java:8