Docker入門到實踐 (九) IDEA集成Docker構建容器鏡像,部署項目


一、前言

  在上一篇文章中已經介紹了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構建容器鏡像,部署項目




                   如果有遇到不懂或者有問題時,可以掃描下方二維碼,歡迎進羣交流與分享,希望能夠跟大家交流學習!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章