1. 程式人生 > >spring cloud docker容器化

spring cloud docker容器化

spring cloud docker外掛自動化部署

通用步驟

  1. 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本地庫。

  1. 新增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才是。

遇到問題整理

  1. 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 常用指令

  1. FROM 指定 base 映象。

  2. MAINTAINER 設定映象的作者,可以是任意字串。

  3. COPY 將檔案從 build context 複製到映象。 COPY 支援兩種形式:

    COPY src dest

    COPY [“src”, “dest”] 注意:src 只能指定 build context 中的檔案或目錄

  4. ADD 與 COPY 類似,從 build context 複製檔案到映象。不同的是,如果 src 是歸檔檔案(tar, zip, tgz, xz 等),檔案會被自動解壓到 dest。

  5. 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 也不會幫你自動對映。

  1. 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

問題整理