文章目錄
一、前言
在上一篇文章中已經介紹了Docker私有倉庫的搭建與配置, 下面正式進入到IDEA集成Docker構建容器鏡像,部署項目的講解。
二、開啓docker的tcp遠程訪問
由於使用IDEA來構建容器鏡像,部署項目對於 Linux服務器上的docker宿主機來說是一種遠程操作,而遠程操作docker默認是關閉的,就需要我們開啓遠程訪問
//1、編輯docker.service
vim /usr/lib/systemd/system/docker.service
//2、修改ExecStart屬性,把-H fd:// 替換成 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改成
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock
//3、刷新配置,重啓服務
systemctl daemon-reload
systemctl restart docker
打開瀏覽器,在地址欄中輸入http://Linux的ip地址:2375/version
,出現如下圖片中的相關信息,則表示成功開啓docker的tcp遠程訪問
三、通過docker的maven插件構建鏡像
方式一:不使用Dockerfile來構建鏡像
1、在pom.xml中添加如下配置,更多相關配置信息請查看:配置詳解
<build>
<!-- 打包後的文件名稱 -->
<finalName>app</finalName>
<plugins>
<!-- Maven 插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 項目基於maven pom多模塊的開發的,需要設置goal-repackage屬性爲true,否則打包後依賴文件沒有一起打包,導致鏡像內沒有可以運行的程序文件 -->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
<!--使用docker-maven-plugin插件,官網:https://github.com/spotify/docker‐maven‐plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--將插件綁定在某個phase執行-->
<executions>
<execution>
<id>build-image</id>
<!--將插件綁定在package這個phase上。也就是說,用戶只需執行mvn package,就會自動執行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的鏡像名-->
<imageName>${project.artifactId}</imageName>
<!--指定標籤,可添加多個imageTag,爲同一個鏡像指定多個標籤-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 用於指定基礎鏡像,類似於Dockerfile中的FROM指令 -->
<baseImage>java:8u111</baseImage>
<!--
類似於Dockerfile的ENTRYPOINT指令,
由於tomcat的session id的生成主要通過java.security.SecureRandom生成隨機數來實現,導致啓動過程很慢
通過-Djava.security.egd=file:/dev/./urandom參數可以加快隨機數產生過程
-->
<entryPoint>["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!-- 這裏是複製 jar 包到 docker 容器指定目錄配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--指定需要複製項目jar包的所在路徑,${project.build.directory}表示target目錄 -->
<directory>${project.build.directory}</directory>
<!-- 用於指定需要複製的文件。${project.build.finalName}.jar指的是打包後的jar包文件 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!--指定遠程 docker api地址-->
<dockerHost>http://192.168.198.124:2375</dockerHost>
<!-- 如需重複構建相同標籤名稱的鏡像,可將forceTags設爲true,這樣就會覆蓋構建相同標籤的鏡像。 -->
<forceTags>true</forceTags>
</configuration>
</plugin>
</plugins>
</build>
以上配置會自動生成如下的Dockerfile文件
# Base images 基礎鏡像
FROM java:8u111
#ADD app.jar文件將拷貝到容器根目錄下,拷貝過去會自動解壓
ADD app.jar /
#ENTRYPOINT 應用啓動命令 參數設定
#由於tomcat的session id的生成主要通過java.security.SecureRandom生成隨機數來實現,導致啓動過程很慢
#通過-Djava.security.egd=file:/dev/./urandom參數可以加快隨機數產生過程
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
2、在windows的命令提示符下 或者IDEA集成的Terminal窗口,進入到工程所在的目錄,輸入以下命令,進行打包、構建和上傳鏡像
/**
* mvn clean package:表示打包項目
* docker:build:表示構建docker鏡像
**/
mvn clean package docker:build
/**
* 如果在pom.xml中添加了如下配置,則在執行mvn package,就會自動執行mvn docker:build
* 即可以省略docker:build,命令爲 mvn clean package
**/
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
/**
* 如果需要把鏡像上傳到私有倉庫或者阿里雲倉庫中,則需要進行以下兩步操作
**/
//1、修改<imageName>標籤,上傳到私有倉庫,則配置如下
<imageName>Linux的ip地址:5000/${project.artifactId}</imageName>
//上傳到阿里雲倉庫,則配置如下
<imageName>registry.cn-地域名稱.aliyuncs.com/你的命名空間名稱/${project.artifactId}</imageName>
//2、在命令行後面添加 -DpushImage:表示推送鏡像到倉庫中
mvn clean package docker:build -DpushImage
或者
mvn clean package -DpushImage (需要在pom.xml中配置<executions>的相關信息)
3、運行鏡像,產生容器實例。注意: 第二個7001端口 (即:容器端口),是你項目的application.yml / application.properties 配置文件中server.port指定的端口
4、訪問項目
方式二:通過Dockerfile實現細膩化的鏡像構建
由於在很多場景下,我們希望使用Dockerfile進行更精確、有可讀性地構建容器鏡像,接下來就讓我們來了解一下,如何通過Dockerfile進行鏡像的構建
1、首先,在項目的 src/main 路徑下,創建一個docker目錄,並在docker目錄下新建一個Dockerfile文件,其內容如下所示:
# Base images 基礎鏡像
FROM java:8u111
#MAINTAINER 維護者信息
MAINTAINER wubin<1035644768@qq.com>
#VOLUME:掛載目錄
VOLUME /temp
#ADD 將app.jar文件將拷貝到容器中,默認拷貝到根路徑下
#也可以直接寫成ADD app.jar /app.jar 或者 ADD app.jar /
ADD app.jar app.jar
RUN bash -c "touch /app.jar"
#EXPOSE 容器暴露端口
EXPOSE 7001
#ENTRYPOINT 應用啓動命令 參數設定
#由於tomcat的session id的生成主要通過java.security.SecureRandom生成隨機數來實現,導致啓動過程很慢
#通過-Djava.security.egd=file:/dev/./urandom參數可以加快隨機數產生過程
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
2、修改pom.xml,不再指定<baseImage>
和<entrypoint>
標籤,而是使用<dockerDirectory>
指定Dockerfile所在的路徑
<build>
<!-- 打包後的文件名稱 -->
<finalName>app</finalName>
<plugins>
<!-- Maven 插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 項目基於maven pom多模塊的開發的,需要設置goal-repackage屬性爲true,否則打包後文件依賴文件沒有一起打包,然後鏡像內沒有可以運行的程序文件,顯示錯誤no main manifest attribute, in /app.jar -->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
<!--使用docker-maven-plugin插件,官網:https://github.com/spotify/docker‐maven‐plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--將插件綁定在某個phase執行-->
<executions>
<execution>
<id>build-image</id>
<!--將插件綁定在package這個phase上。也就是說,用戶只需執行mvn package,就會自動執行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的鏡像名-->
<imageName>${project.artifactId}</imageName>
<!--指定標籤,可添加多個imageTag,爲同一個鏡像指定多個標籤-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 指定 Dockerfile 路徑-->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<!-- 這裏是複製 jar 包到 docker 容器指定目錄配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--指定需要複製項目jar包的所在路徑,${project.build.directory}表示target目錄 -->
<directory>${project.build.directory}</directory>
<!-- 用於指定需要複製的文件。${project.build.finalName}.jar指的是打包後的jar包文件 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!--指定遠程 docker api地址-->
<dockerHost>http://192.168.198.124:2375</dockerHost>
<!-- 如需重複構建相同標籤名稱的鏡像,可將forceTags設爲true,這樣就會覆蓋構建相同標籤的鏡像。 -->
<forceTags>true</forceTags>
</configuration>
</plugin>
</plugins>
</build>
3、執行相關命令,與方式一:不使用Dockerfile來構建鏡像的步驟2一樣,這裏不再重複
四、通過IDEA的Docker插件構建鏡像
1、安裝Docker插件
1.1、在頂部工具欄中找到File → Settings
1.2、找到Plugins,點擊 “Browse repositories”按鈕
1.3、在搜索框輸入Docker,選擇Docker插件,點擊 “Install”按鈕進行安裝,然後點擊 “Close”按鈕
3.2、可以看到Docker插件已經被我們安裝上了,然後點擊"Apply"按鈕,再點擊"OK"按鈕,最後重啓IDEA即可生效
2、配置Docker服務
2.1、在頂部工具欄中找到File → Settings,進入到Settings設置頁面中,找到Build,Execution,Deployment → Docker,點擊"+",添加一個docker連接
2.2、在Engine API URL中輸入你的docker服務地址,格式爲:tcp://Linux(即: docker宿主機) 的ip地址:2375,配置好後,idea會自動檢測,然後在左下方輸出"connection successful",然後點擊"Apply"按鈕,再點擊"OK"按鈕
2.3、選擇IDEA的Docker窗口,點擊"綠色運行按鈕",連接Linux服務器上的docker,連接成功之後,會顯示Containers和Images,即:docker中已有的容器和鏡像
3、通過Docker插件構建鏡像
1、首先,在項目的 src/main 路徑下,創建一個docker目錄,並在docker目錄下新建一個Dockerfile文件,其內容如下所示:
# Base images 基礎鏡像
FROM java:8u111
#MAINTAINER 維護者信息
MAINTAINER wubin<1035644768@qq.com>
#VOLUME:掛載目錄
VOLUME /temp
#ADD 將microservicecloud-eureka-7001-1.0-SNAPSHOT.jar文件將拷貝到容器中,默認拷貝到根路徑下
#注意:microservicecloud-eureka-7001-1.0-SNAPSHOT.jar的名稱前的microservicecloud-eureka-7001對應<artifactId>標籤中的內容,1.0-SNAPSHOT對應<version>標籤中的內容
ADD microservicecloud-eureka-7001-1.0-SNAPSHOT.jar app.jar
RUN bash -c "touch /app.jar"
#EXPOSE 容器暴露端口
EXPOSE 7001
#ENTRYPOINT 應用啓動命令 參數設定
#由於tomcat的session id的生成主要通過java.security.SecureRandom生成隨機數來實現,導致啓動過程很慢
#通過-Djava.security.egd=file:/dev/./urandom參數可以加快隨機數產生過程
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
2、創建Dockerfile啓動項
2.1、選擇Edit Configurations…
2.2、點擊"+",找到Docker,選擇Dockerfile
2.3、配置Dockerfile啓動項的相關信息
注意: 容器端口,是你項目的application.yml / application.properties 配置文件中server.port指定的端口
3、在pom.xml文件中添加SpringBoot的maven插件,如果不添加,運行容器時,會報錯,錯誤信息爲:no main manifest attribute, in /xxx.jar
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 項目基於maven pom多模塊的開發的,需要設置goal-repackage屬性爲true,否則打包後文件依賴文件沒有一起打包,然後鏡像內沒有可以運行的程序文件 -->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
4、執行mvn clean install命令,打包項目並安裝到本地的maven倉庫中
5、在本地maven倉庫中找到剛纔安裝好的microservicecloud-eureka-7001-1.0-SNAPSHOT.jar,拷貝到項目的 src/main/docker 目錄下,並運行Docker啓動項,Docker插件會自動幫我們構建項目鏡像,並啓動容器實例
因爲我們在Dockerfile文件中配置了ADD microservicecloud-eureka-7001-1.0-SNAPSHOT.jar app.jar
,而Dockerfile文件是放在項目的 src/main/docker
目錄下,所以它會在當前目錄(即:docker目錄)下
尋找microservicecloud-eureka-7001-1.0-SNAPSHOT.jar
6、訪問項目
改進:前面說了,我們需要把項目的jar包拷貝到docker目錄下,然後再運行,有什麼辦法能夠不拷貝項目的jar包到docker目錄下,直接運行呢?解決方案如下:
1、刪除之前的docker目錄,在項目的根目錄下
,新建一個Dockerfile文件,內容如下:
注意:需要將之前的ADD microservicecloud-eureka-7001-1.0-SNAPSHOT.jar app.jar
修改爲 ADD /target/microservicecloud-eureka-7001-1.0-SNAPSHOT.jar app.jar
,讓它去讀取target目錄下的項目jar包
# Base images 基礎鏡像
FROM java:8u111
#MAINTAINER 維護者信息
MAINTAINER wubin<1035644768@qq.com>
#VOLUME:掛載目錄
VOLUME /temp
#ADD 將microservicecloud-eureka-7001-1.0-SNAPSHOT.jar文件將拷貝到容器中,默認拷貝到根路徑下
ADD /target/microservicecloud-eureka-7001-1.0-SNAPSHOT.jar app.jar
RUN bash -c "touch /app.jar"
#EXPOSE 容器暴露端口
EXPOSE 7001
#ENTRYPOINT 應用啓動命令 參數設定
#由於tomcat的session id的生成主要通過java.security.SecureRandom生成隨機數來實現,導致啓動過程很慢
#通過-Djava.security.egd=file:/dev/./urandom參數可以加快隨機數產生過程
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
2、修改Docker啓動項,重新指定Dockerfile文件的所在路徑
3、刪除之前運行的項目容器實例 和 項目鏡像
4、執行mvn clean package命令,把項目的jar包安裝到當前項目的target目錄下,最後運行Docker啓動項
小提示:我們也可以通過IDEA的Docker插件,進行如下操作:
1、運行鏡像,創建容器實例
2、拉取鏡像
Docker入門到實踐系列文章列表:
Docker入門到實踐 (一) docker簡介與安裝
Docker入門到實踐 (二) docker常用命令講解
Docker入門到實踐 (三) Dockerfile解析與鏡像製作
Docker入門到實踐 (四) docker容器數據卷與數據卷容器
Docker入門到實踐 (五) docker數據的備份、恢復與遷移
Docker入門到實踐 (六) docker常用軟件安裝
Docker入門到實踐 (七) 本地鏡像推送到阿里雲 和 下載鏡像到本地
Docker入門到實踐 (八) Docker私有倉庫的搭建與配置
Docker入門到實踐 (九) IDEA集成Docker構建容器鏡像,部署項目
如果有遇到不懂或者有問題時,可以掃描下方二維碼,歡迎進羣交流與分享,希望能夠跟大家交流學習!