Idea集成docker實現鏡像打包一鍵部署


1、Docker開啟遠程訪問

#修改該Docker服務文件
vi /lib/systemd/system/docker.service
#修改ExecStart這行
ExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock

將文件內的 ExecStart注釋。 新增如上行。

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

#重新加載配置文件
systemctl daemon-reload
#重啟服務
systemctl restart docker.service
#查看端口是否開啟
netstat -nlpt     #如果找不到netstat命令,可進行安裝。yum install net-tools
#直接curl看是否生效
curl http://127.0.0.1:2375/info

2、IDEA安裝Docker插件

打開Idea,從File->Settings->Plugins->Install JetBrains plugin進入插件安裝界面,

在搜索框中輸入docker,可以看到Docker integration,點擊右邊的Install按鈕進行安裝。

安裝后重啟Idea。

3、IDEA配置docker

配置docker,連接到遠程docker服務。

從File->Settings->Build,Execution,Deployment->Docker打開配置界面

連接成功后,在IDEA工具中即可 操作Docker:

4、docker-maven-plugin

傳統過程中,打包、部署、等。

而在持續集成過程中,項目工程一般使用 Maven 編譯打包,然后生成鏡像,通過鏡像上線,能夠大大提供上線效率,同時能夠快速動態擴容,快速回滾,着實很方便。docker-maven-plugin 插件就是為了幫助我們在Maven工程中,通過簡單的配置,自動生成鏡像並推送到倉庫中。

pom.xml

<properties>
     <docker.image.prefix>guoweixin</docker.image.prefix>
</properties>

 <build>
     <plugins>
         <plugin>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-maven-plugin</artifactId>
             <version>1.0.0</version>
         </plugin>
         
          <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>

                <configuration>
                    <!-- 鏡像名稱  guoweixin/exam-->
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                    <!--指定標簽-->
                    <imageTags>
                        <imageTag>latest</imageTag>
                    </imageTags>
                    <!-- 基礎鏡像jdk 1.8-->
                    <baseImage>java</baseImage>
                    <!-- 制作者提供本人信息 -->
                    <maintainer>guoweixin guoweixin@aliyun.com</maintainer>
                    <!--切換到/ROOT目錄 -->
                    <workdir>/ROOT</workdir>
                    <cmd>["java", "-version"]</cmd>
                    <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>

                    <!-- 指定 Dockerfile 路徑
                      <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
                   -->

                    <!--指定遠程 docker api地址-->
                    <dockerHost>http://192.168.20.135:2375</dockerHost>

                    <!-- 這里是復制 jar 包到 docker 容器指定目錄配置 -->
                    <resources>
                        <resource>
                            <targetPath>/ROOT</targetPath>
                            <!--用於指定需要復制的根目錄,${project.build.directory}表示target目錄-->
                            <directory>${project.build.directory}</directory>
                            <!--用於指定需要復制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。-->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>

            </plugin>
         
         
     </plugins>
</build>

Dockerfile

如上用docker-maven插件 自動生成如下文件:

FROM java
MAINTAINER guoweixin guoweixin@aliyun.com
WORKDIR /ROOT
ADD /ROOT/qfnj-0.0.1-SNAPSHOT.jar /ROOT/
ENTRYPOINT ["java", "-jar", "qfnj-0.0.1-SNAPSHOT.jar"]
CMD ["java", "-version"]

5、執行命令

對項目進行 打包。並構建鏡像 到Docker 上。

mvn clean package docker:build

6、IDEA 操作Docker

7、擴展配置

綁定Docker 命令到 Maven 各個階段

我們可以綁定 Docker 命令到 Maven 各個階段,

我們可以把 Docker 分為 build、tag、push,然后分別綁定 Maven 的 package、deploy 階段,

我們只需要執行mvn deploy就可以完成整個 build、tag、push操作了,當我們執行mvn build就只完成 build、tag 操作。

<executions>
    <!--當執行mvn package 時,執行: mvn clean package docker:build --> 
    <execution>
        <id>build-image</id>
        <phase>package</phase>
        <goals>
            <goal>build</goal>
        </goals>
    </execution>
	  <!--當執行mvn package 時,會對鏡像進行 標簽設定--> 	
     <execution>
         <id>tag-image</id>
         <phase>package</phase>
         <goals>
             <goal>tag</goal>
         </goals>
         <configuration>
             <image>${docker.image.prefix}/${project.artifactId}:latest</image>
             <newName>docker.io/${docker.image.prefix}/${project.artifactId}:${project.version}		    </newName>
         </configuration>
    </execution>
    <execution>
        <id>push-image</id>
        <phase>deploy</phase>
        <goals>
            <goal>push</goal>
        </goals>
        <configuration>
            <imageName>docker.io/${docker.image.prefix}/${project.artifactId}:${project.version}	   </imageName>
        </configuration>
    </execution>
    
</executions>

完整pom.xml如下:

<properties>
    <java.version>1.8</java.version>
    <!-- 鏡像 前綴姓名-->
    <docker.image.prefix>guoweixin</docker.image.prefix>
</properties>

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
      	.....................
</dependencies>

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>

                <configuration>
                    <!-- 鏡像名稱  guoweixin/exam-->
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                    <!--指定標簽-->
                    <imageTags>
                        <imageTag>latest</imageTag>
                    </imageTags>
                    <!-- 基礎鏡像jdk 1.8-->
                    <baseImage>java</baseImage>
                    <!-- 制作者提供本人信息 -->
                    <maintainer>guoweixin guoweixin@aliyun.com</maintainer>
                    <!--切換到/ROOT目錄 -->
                    <workdir>/ROOT</workdir>
                    <cmd>["java", "-version"]</cmd>
                    <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>

                    <!-- 指定 Dockerfile 路徑
                      <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
                   -->

                    <!--指定遠程 docker api地址
						此處未加CA加密認證。
					-->
                    <dockerHost>http://192.168.20.135:2375</dockerHost>

                    <!-- 這里是復制 jar 包到 docker 容器指定目錄配置 -->
                    <resources>
                        <resource>
                            <targetPath>/ROOT</targetPath>
                            <!--用於指定需要復制的根目錄,${project.build.directory}表示target目錄-->
                            <directory>${project.build.directory}</directory>
                            <!--用於指定需要復制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。-->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>

                <!--當執行mvn package 時,執行: mvn clean package docker:build -->
                <executions>
                    <execution>
                        <id>build-image</id>
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>

            </plugin>

        </plugins>
    </build>

總結:

當我們執行mvn package時,執行 build、tag 操作,

當執行mvn deploy時,執行build、tag、push 操作。

如果我們想跳過 docker 某個過程時,只需要:

  • -DskipDockerBuild 跳過 build 鏡像
  • -DskipDockerTag 跳過 tag 鏡像
  • -DskipDockerPush 跳過 push 鏡像
  • -DskipDocker 跳過整個階段

例如:我們想執行 package 時,跳過 tag 過程,那么就需要mvn package -DskipDockerTag

二、Idea整合Docker CA加密認證

前面提到的配置是允許所有人都可以訪問的,因為docker默認是root權限的,把2375端口暴露在外面,意味着別人隨時都可以提取到你服務器的root權限,是很容易被黑客黑的,因此,docker官方推薦使用加密的tcp連接,以Https的方式與客戶端建立連接

官方示例Demo

https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl

Docker認證命令配置

1 創建ca文件夾,存放CA私鑰和公鑰

mkdir -p /usr/local/ca
cd /usr/local/ca/

2 生成CA私鑰和公鑰

在Docker守護進程的主機上,生成CA私鑰和公鑰:

openssl genrsa -aes256 -out ca-key.pem 4096

3 依次輸入密碼、國家、省、市、組織名稱、郵箱等:

guoweixin cn nmg cf qfjy 315759265@qq.com

 openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

現在已經有了CA,接下來創建一個服務器密鑰和證書簽名請求(CSR)。確保“公用名”與你用來連接到Docker的主機名匹配

4 生成server-key.pem:

openssl genrsa -out server-key.pem 4096

5 CA來簽署公鑰:

由於TLS連接可以通過IP地址和DNS名稱進行,所以在創建證書時需要指定IP地址。例如,允許使用10.10.10.20和127.0.0.1進行連接:

$Host換成你自己服務器外網的IP或者域名


openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
比如
openssl req -subj "/CN=192.168.20.135" -sha256 -new -key server-key.pem -out server.csr
或
openssl req -subj "/CN=www.javaqf.com" -sha256 -new -key server-key.pem -out server.csr
本地是局域網:
openssl req -subj "/CN=192.168.20.135" -sha256 -new -key server-key.pem -out server.csr

6 配置白名單:

1 允許指定ip可以連接到服務器的docker,可以配置ip,用逗號分隔開。

2 因為已經是ssl連接,所以我推薦配置0.0.0.0,也就是所有ip都可以連接(但只有擁有證書的才可以連接成功),這樣配置好之后公司其他人也可以使用。

如果填寫的是ip地址 命令如下  echo subjectAltName = IP:$HOST,IP:0.0.0.0 >> extfile.cnf
如果填寫的是域名   命令如下  echo subjectAltName = DNS:$HOST,IP:0.0.0.0 >> extfile.cnf

上面的$Host依舊是你服務器外網的IP或者域名,請自行替換。

 echo subjectAltName = IP:192.168.20.135,IP:0.0.0.0 >> extfile.cnf

7 執行命令

將Docker守護程序密鑰的擴展使用屬性設置為僅用於服務器身份驗證:

echo extendedKeyUsage = serverAuth >> extfile.cnf

8 生成簽名證書

openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out server-cert.pem -extfile extfile.cnf

9 生成客戶端的key.pem

 openssl genrsa -out key.pem 4096
 
 openssl req -subj '/CN=client' -new -key key.pem -out client.csr

10 要使密鑰適合客戶端身份驗證

創建擴展配置文件:

echo extendedKeyUsage = clientAuth >> extfile.cnf

echo extendedKeyUsage = clientAuth > extfile-client.cnf

11 現在,生成簽名證書:

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out cert.pem -extfile extfile-client.cnf

生成cert.pem,需要輸入前面設置的密碼,

12 刪除不需要的文件,兩個證書簽名請求

生成cert.pem和server-cert之后。您可以安全地刪除兩個證書簽名請求和擴展配置文件:

rm -v client.csr server.csr extfile.cnf extfile-client.cnf

13 可修改權限

要保護您的密鑰免受意外損壞,請刪除其寫入權限。要使它們只能被您讀取,更改文件模式

chmod -v 0400 ca-key.pem key.pem server-key.pem

證書可以是對外可讀的,刪除寫入權限以防止意外損壞

chmod -v 0444 ca.pem server-cert.pem cert.pem

14 歸集服務器證書

cp server-*.pem  /etc/docker/
cp ca.pem /etc/docker/

15 修改Docker配置

使Docker守護程序僅接受來自提供CA信任的證書的客戶端的連接

vim /lib/systemd/system/docker.![](https://img2020.cnblogs.com/blog/2191377/202101/2191377-20210105222020322-996960842.gif)
service

將
ExecStart=/usr/bin/dockerd
替換為:
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/usr/local/ca/ca.pem --tlscert=/usr/local/ca/server-cert.pem --tlskey=/usr/local/ca/server-key.pem -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

16 重新加載daemon並重啟docker

systemctl daemon-reload 

systemctl restart docker

17 開放2375端口

/sbin/iptables -I INPUT -p tcp --dport 2375 -j ACCEPT

18 重啟Docker

systemctl restart docker

IDEA操作Docker

1 保存相關客戶端的pem文件到本地

2 IDEA CA配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM