spring cloud docker容器化
spring cloud docker外掛自動化部署
通用步驟
- dockerfile-maven-plugin外掛入門 docker-maven-plugin 外掛預設連線本地 Docker 地址為:localhost:2375,所以我們需要先設定下環境變數。
DOCKER_HOST=tcp://<host>:2375
Dockerfile Maven的特性
- 預設,構建Dockerfile的過程包含在mvn package階段;
- 預設,為Dockerfile打標籤的過程包含在mvn package階段;
- 預設,釋出Dockerfile的過程包含在mvn deploy階段;
mvn dockerfile:build mvn dockerfile:tag mvn dockerfile:push
構建Docker專案時,直接執行mvn deploy即可構建併發布Dockerfile檔案到Maven本地庫。
- 新增docker外掛依賴新增docker外掛依賴 外掛官方地址: https://github.com/spotify/dockerfile-maven Maven有個外掛,叫dockerfile-maven-plugin,它會連線遠端Docker,只要一個命令就能把本地的jar包打成Docker映象,命令執行完畢後,伺服器上就會有剛打包好的映象,此時再執行該映象即可。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!--dockerfile-maven-plugin外掛--> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>${dockerfile-maven-version}</version> <configuration> <repository>${docker.image.prefix}/${project.artifactId}</repository> <tag>${project.version}</tag> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> </plugins> </build>
至此你可以構建一個有tagged的docker的映象,使用命令
$ ./mvnw dockerfile:build
你也可以push這個映象到倉庫
./mvnw dockerfile:push
mvnw全名是Maven Wrapper,是對mvn的封裝,沒有引入mvnw時候,你可以直接使用mvn。
至此,你已經可以使用mvn命令手動直接打包映象了,也可以使用IDEA的介面maven介面操作。
如何把構建映象、和推送映象放到你maven的生命週期中呢?pom外掛plugin配置項加入如下配置項: you can make dockerfile:push automatically run in the install or deploy lifecycle phases by adding it to the plugin configuration. 你可以根據需要,新增不同配置項:
<executions>
<execution>
<id>default</id>
<phase>install</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
打包時,構建映象:
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>```
phase元素代表的是繫結的生命週期的階段 。 goals 元素代表外掛的目標 外掛是你前面artifactId中定義好的 goals相當於該外掛中的一個功能 該功能將在phase繫結的生命週期階段執行。 goal是一個外掛的具體功能 而不是一個階段 phase才是。
遇到問題整理
- mvn命令構建docker映象報錯 ADD failed: stat /var/lib/docker/tmp/ 原因分析: 這裡的提醒路徑/var/lib/docker/tmp/應該是指Docker宿主機, maven docker外掛應該是根據你的配置<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> 從這裡先copy到Docker宿主機的/var/lib/docker/tmp/xxx 目錄,然後才從Docker宿主機複製到Docker容器中。所以這個配置要配置正確,出問題優先檢查這個配置,讓maven docker外掛可以找到。
- ADD user-server-0.0.1-SNAPSHOT.jar app.jar 要和pom的user-server 工程的pom.xml 和Dockerfile配置不一致 保持名字一樣,不然maven打出來的包,docker找不到。
- 第二點 <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> 的配置要注意,第一我
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--dockerfile-maven-plugin外掛-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${dockerfile-maven-version}</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
Docker部署eureka-server
Dockerfile 常用指令
-
FROM 指定 base 映象。
-
MAINTAINER 設定映象的作者,可以是任意字串。
-
COPY 將檔案從 build context 複製到映象。 COPY 支援兩種形式:
COPY src dest
COPY [“src”, “dest”] 注意:src 只能指定 build context 中的檔案或目錄
-
ADD 與 COPY 類似,從 build context 複製檔案到映象。不同的是,如果 src 是歸檔檔案(tar, zip, tgz, xz 等),檔案會被自動解壓到 dest。
-
ENV 設定環境變數,環境變數可被後面的指令使用。例如:
…
ENV MY_VERSION 1.3
RUN apt-get install -y mypackage=$MY_VERSION
… 6. EXPOSE 指定容器中的程序會監聽某個埠,Docker 可以將該埠暴露出來。
Dockerfile中不管有沒有EXPOSE埠,需要新增埠對映只能restart container。 EXPOSE 指令是宣告執行時容器提供服務埠,這只是一個宣告,在執行時並不會因為這個宣告應用就會開啟這個埠的服務。
在 Dockerfile 中寫入這樣的宣告有兩個好處,一個是幫助映象使用者理解這個映象服務的守護埠,以方便配置對映;另一個用處則是在執行時使用隨機埠對映時,也就是 docker run -P 時,會自動隨機對映 EXPOSE 的埠。
要將 EXPOSE 和在執行時使用 -p <宿主埠>:<容器埠> 區分開來。-p,是對映宿主埠和容器埠,換句話說,就是將容器的對應埠服務公開給外界訪問,而 EXPOSE 僅僅是宣告容器打算使用什麼埠而已,並不會自動在宿主進行埠對映。
經測試,好像聲明瞭EXPOSE -P 也不會幫你自動對映。
- VOLUME 沒有宣告EXPOSE埠的情況下使用-p是有效的。但是要注意VOLUME和EXPOSE不同,一旦Dockerfile中有VOLUME, 在docker run的時候,,docker 始終會將host中的目錄掛載到VOLUME宣告的目錄並會將VOLUME宣告之前的內容複製到掛載上的目錄。
VOLUME 指向了一個/tmp的目錄,由於 Spring Boot 使用內建的Tomcat容器,Tomcat 預設使用/tmp作為工作目錄。這個命令的效果是:在宿主機的/var/lib/docker目錄下建立一個臨時檔案並把它連結到容器中的/tmp目錄VOLUME ,VOLUME 指向了一個/tmp的目錄,由於 Spring Boot 使用內建的Tomcat容器,Tomcat 預設使用/tmp作為工作目錄。這個命令的效果是:在宿主機的/var/lib/docker目錄下建立一個臨時檔案並把它連結到容器中的/tmp目錄VOLUME 指向了一個/tmp的目錄,由於 Spring Boot 使用內建的Tomcat容器,Tomcat 預設使用/tmp作為工作目錄。這個命令的效果是:在宿主機的/var/lib/docker目錄下建立一個臨時檔案並把它連結到容器中的/tmp目錄VOLUME ,VOLUME 指向了一個/tmp的目錄,由於 Spring Boot 使用內建的Tomcat容器,Tomcat 預設使用/tmp作為工作目錄。這個命令的效果是:在宿主機的/var/lib/docker目錄下建立一個臨時檔案並把它連結到容器中的/tmp目錄 8. WORKDIR 為後面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令設定映象中的當前工作目錄。 9. RUN 在容器中執行指定的命令。 10. ENTRYPOINT 設定容器啟動時執行的命令。 Dockerfile 中可以有多個 ENTRYPOINT 指令,但只有最後一個生效。CMD 或 docker run 之後的引數會被當做引數傳遞給 ENTRYPOINT。
為了縮短 Tomcat 的啟動時間,新增java.security.egd的系統屬性指向/dev/urandom作為 ENTRYPOINT為了縮短 Tomcat 的啟動時間,新增java.security.egd的系統屬性指向/dev/urandom作為 ENTRYPOINT