軟件版本: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
然后開端口或者關閉防火牆,二選其一即可
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設備,該可以支持終端登錄)運行的時候執行命令
