1. 程式人生 > 實用技巧 >記一次idea+Dockerfile+docker部署

記一次idea+Dockerfile+docker部署

軟體版本:idea:2019.3,docker:19.03.9,伺服器:centos7.8

1.centos7伺服器配置 在伺服器上編輯docker檔案 vi /usr/lib/systemd/system/docker.service 修改以ExecStart開頭的行 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 如果是centos7以下的直接新增-H tcp://0.0.0.0:2375 修改後儲存檔案,然後重啟docker systemctl daemon-reload systemctl restart docker curl
http://localhost:2375/version
然後開埠或者關閉防火牆,二選其一即可 firewall-cmd --zone=public --add-port=2375/tcp --permanent firewall-reload 關閉防火牆 chkconfig iptables off 2.idea安裝docker外掛 新增docker tcp socket填寫Engine API URL: tcp://ip:2375 其他的預設就可以 3.使用docker部署boot專案 在springboot專案的根目錄下新增docker資料夾並建立Dockerfile檔案 檔案內容為:
 1
# 基礎映象 2 FROM java:8 3 #維護者資訊 4 MAINTAINER CLOVER 5 # 複製打包完成後的jar檔案到/home目錄下 6 ADD krt.jar /home/app.jar 7 # 掛載/home/file目錄到主機 8 #VOLUME 指向了一個/tmp的目錄,由於 Spring Boot 使用內建的Tomcat容器,Tomcat 預設使用/tmp作為工作目錄。 9 #這個命令的效果是:在宿主機的/var/lib/docker目錄下建立一個臨時檔案並把它連結到容器中的/tmp目錄 10 VOLUME /home/file 11 # 設定時區 12 RUN echo "Asia/Shanghai" > /etc/timezone
13 #對映8888埠到本機的8099埠 14 EXPOSE 8888 15 #bash方式執行,使krt.jar可訪問 16 # RUN新建立一層,在其基礎上執行這些命令,執行結束後,commit這一層的修改,構成新的映象 17 RUN bash -c 'touch /home/krt.jar' 18 # 啟動容器時執行 19 #為了縮短 Tomcat 的啟動時間,新增java.security.egd的系統屬性指向/dev/urandom作為 ENTRYPOINT 20 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/home/app.jar"]

修改pom檔案將build部分修改如下:
 1 <build>
 2         <plugins>
 3             <plugin>
 4                 <groupId>org.springframework.boot</groupId>
 5                 <artifactId>spring-boot-maven-plugin</artifactId>
 6                 <!--加入下面兩項配置-->
 7                 <executions>
 8                     <execution>
 9                         <goals>
10                             <goal>repackage</goal>
11                         </goals>
12                     </execution>
13                 </executions>
14                 <configuration>
15                     <includeSystemScope>true</includeSystemScope>
16                 </configuration>
17             </plugin>
18             <plugin>
19                 <groupId>com.spotify</groupId>
20                 <artifactId>docker-maven-plugin</artifactId>
21                 <version> 1.2.1</version>
22                 <!--將外掛繫結在某個phase執行-->
23                 <executions>
24                     <execution>
25                         <id>build-image</id>
26                         <!--將外掛繫結在package這個phase上,也就是說,使用者只需要執行mvn package,就會自動執行mvn docker:build-->
27                         <phase>package</phase>
28                         <goals>
29                             <goal>build</goal>
30                         </goals>
31                     </execution>
32                 </executions>
33                 <configuration>
34                     <!--指定生成的映象名-->
35                     <imageName>clover/${project.artifactId}</imageName>
36                     <!--指定標籤-->
37                     <imageTags>
38                         <imageTag>latest</imageTag>
39                     </imageTags>
40                     <!--指定Dockerfile 的位置,${project.basedir}:專案的根路徑下-->
41                     <dockerDirectory>${project.basedir}/src/main/resources/docker</dockerDirectory>
42                     <!--指定遠端docker api地址-->
43                     <dockerHost>http://192.168.1.4:2375</dockerHost>
44                     <resources>
45                         <resource>
46                             <!--容器中自定義jar包存放的位置,及對應的target目錄-->
47                             <targetPath>/</targetPath>
48                             <!--本地jar包所在路徑-->
49                             <directory>${project.build.directory}</directory>
50                             <!--需要包含本地jar包名稱,對應的是Dockerfile中新增的檔名-->
51                             <include>${project.build.finalName}.jar</include>
52                         </resource>
53                     </resources>
54                     <!--以下兩行是為了docker push到DockerHub使用的-->
55                     <!--<serverId>docker-hub</serverId>
56                     <registryUrl>https://index.docker.io/v1</registryUrl>-->
57                 </configuration>
58             </plugin>
59         </plugins>
60         <!-- jar包名稱 -->
61         <finalName>app</finalName>
62     </build>

4.配置idea執行Dcokerfile

執行配置後了的Dockerfile(我之前不明白為什麼執行了打包為什麼只是生成了image沒有生成container.困惑了好久,有點混亂;正確的理解應該是在pom的檔案中已經定義了打包成image.而Dockerfile才是create container 並執行iamge的) idea的server的docker部分會有日誌


訪問容器所在伺服器ip:對映到伺服器的埠/專案名 所以這個專案的訪問地址為http://192.168.1.4:8099/app

5.遇到的問題以及備註:
5.1.執行報錯,提示:
Building image...
Preparing build context archive...
[==================================================>]1/1 files
Done


Sending build context to Docker daemon...
[==================================================>]  438.0B
Done


Step 1/5 : FROM java:8
---> d23bdf5b1b1b
Step 2/5 : ADD app.jar /home/krt/app.jar
Error response from daemon: ADD failed: stat /home/software/docker/tmp/docker-builder635425878/app.jar: no such file or directory
原因: ADD 命令 ADD [SOURCE] [TARGET] source是相對於Dockerfile的檔案的相對位置的jar包的路徑 target指的是最終執行的容器的目錄的位置,一個新的容器是不會有自定義的資料夾/home/docker 所以要麼在ADD 命令之前新增資料夾,要麼將目標jar包放到基礎linux目錄的目錄下面,比如/home/,/opt/等 5.2.看到有的人在配置Dockerfile的時候會在Excutable項下的command選項加上-t command : 指的是在容器執行時載入的其它指令,這裡的指令為: -t(--tty=false 分配tty裝置,該可以支援終端登入)執行的時候執行命令