SpringCloud微服務實戰——搭建企業級開發框架(三十四):SpringCloud + Docker + k8s實現微服務集群打包部署-打包配置

??SpringCloud微服務包含多個SpringBoot可運行的應用程序,在單應用程序下,版本發布時的打包部署還相對簡單,當有多個應用程序的微服務發布部署時,原先的單應用程序部署方式就會顯得復雜且不可控。那么我們就會思考使用簡單的部署方式,解決自動化發布、自動化部署、微服務監控等問題。
??我們使用目前行業通用的解決方案,Jenkins+GitLab+Maven+Docker+Kubernetes來實現可持續自動化部署微服務的功能。下面將從工程中Maven打包文件配置、Dockfile文件編寫開始到Kubernetes配置來說明如何實現SpringCloud微服務可持續自動化部署功能。

1、bootstrap.yml文件不同環境加載配置

??在項目打包部署時,我們系統的配置文件需要根據不同的環境來區分開發、測試、生產環境的配置,在之前的SpringBoot工程中,我們用到spring.profiles.active配置屬性,使用application.yml、application-dev.yml、application-test.yml、application-sit.yml、application-uat.yml、application-prod.yml來區分不同環境的配置文件。在SpringCloud中,我們用到了Nacos注冊中心,Nacos的Config默認讀取的是bootstrap.yml配置文件,如果將Nacos Config的配置寫到application.yml里面,工程啟動時就會一直報錯。下面是SpringCloud加載配置文件的順序:

  • bootstrap.yml(bootstrap.properties)先加載,用于應用程序上下文的引導階段,可以用來配置application.yml中使用到的參數,由父Spring ApplicationContext加載。
  • application.yml(application.properties)后加載,用于配置各工程模塊中使-用到的參數。

??所以在SpringCloud工程中我們通過使用bootstrap.yml、bootstrap-dev.yml...等不同的配置文件來區分不同的環境,有些框架是放到同一個yml配置文件中,然后不同的配置放到不同的spring.profiles.active下面,類似于下面這種:

spring:
  profiles: dev
     開發配置項: 開發配置項
spring:
  profiles: test
     測試配置項: 測試配置項

但是,在實際開發過程中,我們開發、測試的配置文件有時會經常修改,而生產部署環境確很少改動,當多人員開發時,難免會有部分人員不小心將配置文件改動影響到生產環境配置,即使沒有影響,開發人員在改動時也要小心翼翼,害怕哪里改錯。當我們將這些配置分開時,開發、測試的配置文件無論如何改動,都不會影響到生產環境文件,這正是我們想要的結果。所以我們將不同環境的配置放到不同的配置文件中。我們將配置文件分為bootstrap.yml、bootstrap-dev.yml、bootstrap-test.yml、bootstrap-prod.yml

<!-- bootstrap.yml -->
server:
  port: 8001
spring:
  profiles:
    active: @spring.profiles.active@
  application:
    name: @artifactId@
  cloud:
    nacos:
      discovery:
        server-addr: ${spring.nacos.addr}
      config:
        server-addr: ${spring.nacos.addr}
        file-extension: yaml
        prefix: ${spring.nacos.config.prefix}
        group: ${spring.nacos.config.group}
        enabled: true
<!-- bootstrap-dev.yml -->
spring:
  profiles: dev
  nacos:
    addr: 127.0.0.1:8848
    config:
      prefix: gitegg-cloud-config
      group: GITEGG_CLOUD
<!-- bootstrap-test.yml -->
spring:
  profiles: test
  nacos:
    addr: 測試地址:8848
    config:
      prefix: gitegg-cloud-config
      group: GITEGG_CLOUD
<!-- bootstrap-prod.yml -->
spring:
  profiles: prod
  nacos:
    addr: 生產地址:8848
    config:
      prefix: gitegg-cloud-config
      group: GITEGG_CLOUD

??上面的配置可以滿足分環境打包讀取不同配置文件的目的,但是在實際開發過程中我們發現,我們的微服務太多,如果要修改Nacos配置的話,每個微服務的配置文件都需要修改一遍,雖然可以用IDEA批量替換,但是感覺這不是很好的方式。我們理想的方式是這樣的:

  • 所有的微服務配置文件默認都從一個統一的地方讀取
  • 當有某一個微服務需要特殊的配置時,只需要修改它自己的配置文件即可

實現上面的方式,我們可以將Nacos的配置到放到Maven的profile中,不同環境的bootstrap.yml可以讀取其對應環境的配置信息,修改后的配置如下:

<!-- bootstrap.yml -->
server:
  port: 8001
spring:
  profiles:
    active: @spring.profiles.active@
  application:
    name: @artifactId@
  cloud:
    nacos:
      discovery:
        server-addr: ${spring.nacos.addr}
      config:
        server-addr: ${spring.nacos.addr}
        file-extension: yaml
        prefix: ${spring.nacos.config.prefix}
        group: ${spring.nacos.config.group}
        enabled: true
<!-- bootstrap-dev.yml -->
spring:
  profiles: dev
  nacos:
    addr: @nacos.addr@
    config:
      prefix: @nacos.config.prefix@
      group: @nacos.config.group@
<!-- bootstrap-test.yml -->
spring:
  profiles: test
  nacos:
    addr: @nacos.addr@
    config:
      prefix: @nacos.config.prefix@
      group: @nacos.config.group@
<!-- bootstrap-prod.yml -->
spring:
  profiles: prod
  nacos:
    addr: @nacos.addr@
    config:
      prefix: @nacos.config.prefix@
      group: @nacos.config.group@
<!-- pom.xml -->
    <profiles>
        <profile>
            <activation>
                <!--默認為dev環境打包方式-->
                <activeByDefault>true</activeByDefault>
            </activation>
            <id>dev</id>
            <properties>
                <spring.profiles.active>dev</spring.profiles.active>
                <nacos.addr>1127.0.0.1:8848</nacos.addr>
                <nacos.config.prefix>gitegg-cloud-config</nacos.config.prefix>
                <nacos.config.group>GITEGG_CLOUD</nacos.config.group>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <spring.profiles.active>test</spring.profiles.active>
                <nacos.addr>測試環境地址:8848</nacos.addr>
                <nacos.config.prefix>gitegg-cloud-config</nacos.config.prefix>
                <nacos.config.group>GITEGG_CLOUD</nacos.config.group>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <spring.profiles.active>prod</spring.profiles.active>
                <nacos.addr>生產環境地址:8848</nacos.addr>
                <nacos.config.prefix>gitegg-cloud-config</nacos.config.prefix>
                <nacos.config.group>GITEGG_CLOUD</nacos.config.group>
            </properties>
        </profile>
    </profiles>

這樣,通過在pom.xml里面不同profile的配置,就可以實現修改一處,使所有微服務讀取Nacos的配置文件同時修改。
??修改完之后,可能會有這樣的疑惑:現在我們三個文件bootstrap-dev.yml、bootstrap-test.yml、bootstrap-prod.yml內容配置基本是一樣的,只有profiles的值不同,那么實際可以直接寫在bootstrap.yml一個文件中,通過pom.xml來配置區分不同環境即可。那么這里做的目的和意義:主要是為了后續可擴展定制,某個環境特定的配置。

2、Maven打包配置

在編寫pom.xml之前,我們先了解一下幾個常用Maven打包插件的區別和聯系:

  • maven-compiler-plugin: 用于在編譯(compile)階段加入定制化參數,比如設置項目源碼的jdk版本、編譯的jdk版本,以及項目編碼等。
  • maven-jar-plugin: 將maven工程打成 jar 包,提供了manifest的配置,生成jar包中一般存放的是.class文件和resources目錄下的配置,不會將依賴的jar包打包成一個可運行的jar包。
  • spring-boot-maven-plugin: 其在Maven的package生命周期階段,能夠將mvn package生成的軟件包,再次打包為可執行的軟件包,并將mvn package生成的軟件包重命名為*.original。 其主要作用就是將SpringBoot工程代碼和依賴的jar包全部打包為可執行的jar或war文件,可以直接在jre環境下運行。

??因為maven-jar-plugin打包的jar是把打包的jar和lib放在同一目錄下,不是打成一個包,所以這樣打的jar包文件很小。spring-boot-maven-plugin打包是把maven-jar-plugin打的jar包和依賴庫repackage一個可運行的jar包,這個jar包文件很大。如果考慮到系統升級時的網絡因素,那么使用maven-jar-plugin是最好不過了,當依賴庫不改變的時候,只升級很小的jar包即可。這里因為是企業級微服務應用開發框架,不考慮網絡傳輸的影響,考慮系統升級穩定性,不至于開發時依賴庫修改了版本,而生產環境依賴庫版本升級導致所有微服務受到影響,所以我們選擇使用spring-boot-maven-plugin插件進行打包。
??在GitEgg工程的父級pom.xml里配置如下:

    <properties>
        <!-- jdk版本1.8 -->
        <java.version>1.8</java.version>
        <!-- maven-compiler-plugin插件版本,Java代碼編譯 -->
        <maven.plugin.version>3.8.1</maven.plugin.version>
        <!-- maven編譯時指定編碼UTF-8 -->
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    </properties>

    <build>
        <finalName>${project.name}</finalName>
        <resources>
            <!-- 增加分環境讀取配置 -->
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <excludes>
                    <exclude>**/*.jks</exclude>
                </excludes>
            </resource>
            <!-- 解決jks被過濾掉的問題 -->
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
                <includes>
                    <include>**/*.jks</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
        <pluginManagement>
            <plugins>
                <!-- 用于在編譯(compile)階段加入定制化參數,比如設置項目源碼的jdk版本、編譯的jdk版本,以及項目編碼等 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>${maven.plugin.version}</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                        <encoding>${maven.compiler.encoding}</encoding>
                        <compilerArgs>
                            <arg>-parameters</arg>
                        </compilerArgs>
                    </configuration>
                </plugin>
                <!-- 能夠將Spring Boot應用打包為可執行的jar或war文件,然后以通常的方式運行Spring Boot應用 -->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring.boot.version}</version>
                    <configuration>
                        <fork>true</fork>
                        <finalName>${project.build.finalName}</finalName>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <activation>
                <!--默認為dev環境打包方式-->
                <activeByDefault>true</activeByDefault>
            </activation>
            <id>dev</id>
            <properties>
                <spring.profiles.active>dev</spring.profiles.active>
                <nacos.addr>127.0.0.1:8848</nacos.addr>
                <nacos.config.prefix>gitegg-cloud-config</nacos.config.prefix>
                <nacos.config.group>GITEGG_CLOUD</nacos.config.group>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <spring.profiles.active>test</spring.profiles.active>
                <nacos.addr>127.0.0.1:8848</nacos.addr>
                <nacos.config.prefix>gitegg-cloud-config</nacos.config.prefix>
                <nacos.config.group>GITEGG_CLOUD</nacos.config.group>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <spring.profiles.active>prod</spring.profiles.active>
                <nacos.addr>127.0.0.1:8848</nacos.addr>
                <nacos.config.prefix>gitegg-cloud-config</nacos.config.prefix>
                <nacos.config.group>GITEGG_CLOUD</nacos.config.group>
            </properties>
        </profile>
    </profiles>

??以上Maven配置完成之后,就可以進行正常的打可運行的SpringBoot包了。通常情況下,如果不使用docker和k8s集群,那么就可以直接使用Jenkins一鍵打包部署到測試或生產環境了。

??我們下面將一步步介紹如何實現將微服務打包為Docker文件,進而發布到Docker鏡像倉庫私服Harbor上,k8s拉取私服Harbor上的Docker文件進行分布式部署。

  • Docker: 開源的應用容器引擎,打包應用以及依賴包到一個可移植的鏡像中,可以發布到任何流行的 Linux或Windows操作系統的機器上。
  • Harbor: 區別于Docker官方提供的公共的鏡像倉庫,可以用于本地部署的私有Docker鏡像倉庫。
  • Kubernetes(k8s): 用于自動部署,擴展和管理容器化應用程序的開源系統,可以自由地部署在企業內部,私有云、混合云或公有云
3、Docker打包配置

??目前,網上有多種Docker打包插件使用說明,講解最多的是Spotify開源的,Spotify官方已不再推薦使用docker-maven-plugin插件進行打包,而是推薦其最新的docker打包插件dockerfile-maven-plugin,但是dockerfile-maven-plugin也已經很久沒有更新了,在使用方面也有局限性,比如:只支持在本機Docker的鏡像build、tag、push。經過在網上搜索,發現Google開源的Jib插件功能更強大,它可以不寫Dockerfile,不需要在本地安裝Docker環境就能實現Docker打包,而且一直在更新,所以這里選擇這個插件作為我們的Docker打包插件。
??SpringBoot打包會將所有的依賴和資源文件等打包到一起,生成一個Fat Jar,這個Fat Jar的文件大小往往高達百兆,如果受制于網絡環境,那么發布時,會傳輸較慢;同時,發布多次后,會占用大量的磁盤空間。尤其微服務架構下,會有一堆的Far Jar,那么,我們可以利用Docker鏡像的分層結構特性,將應用程序的公共依賴打包為源鏡像層,發布應用時,只發布業務修改層的代碼。下面介紹Jib( jib-maven-plugin插件 )如何將SpringBoot應用程序分層打包Docker鏡像,充分利用Docker的鏡像分層復用機制,解決網絡限制和占用大量磁盤空間的問題。

Jib( jib-maven-plugin插件 )構建的三個參數:

  • buildTar:本地構建,不需要Docker daemon就可以將鏡像生成tar文件,保存在工程的target目錄下

  • dockerBuild:將構建的鏡像存到當前環境的Docker daemon

  • build:將構建的鏡像推送到遠程倉庫,官方倉庫或者Harbor私有倉庫

  • 在GitEgg工程的父級pom.xml里配置jib-maven-plugin如下:

    <properties>
......
        <!-- jib-maven-plugin插件版本,代碼打包docker -->
        <jib.maven.plugin.version>3.1.4</jib.maven.plugin.version>
......
    </properties>
       <pluginManagement>
            <plugins>
......
                <!-- Docker 打包插件 -->
                <plugin>
                    <groupId>com.google.cloud.tools</groupId>
                    <artifactId>jib-maven-plugin</artifactId>
                    <version>${jib.maven.plugin.version}</version>
                    <!-- 綁定到Maven的install生命周期 ,此處如果不使用https,會有問題,需要設置sendCredentialsOverHttp=true-->
                    <executions>
                        <execution>
                            <phase>install</phase>
                            <goals>
                                <goal>build</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <!--允許非https-->
                        <allowInsecureRegistries>true</allowInsecureRegistries>
                        <!-- 相當于Docerkfile中的FROM -->
                        <from>
                            <image>openjdk:8-jdk-alpine</image>
                        </from>
                        <to>
                            <image>${docker.harbor.addr}/${docker.harbor.project}/${project.artifactId}:${project.version}</image>
                            <auth>
                                <username>${docker.harbor.username}</username>
                                <password>${docker.harbor.password}</password>
                            </auth>
                        </to>
                        <container>
                            <!--jvm內存參數-->
                            <jvmFlags>
                                <jvmFlag>-Xms512m</jvmFlag>
                                <jvmFlag>-Xmx4g</jvmFlag>
                            </jvmFlags>
                            <volumes>/giteggData</volumes>
                            <workingDirectory>/gitegg</workingDirectory>
                            <environment>
                                <TZ>Asia/Shanghai</TZ>
                            </environment>
                            <!--使用該參數保證鏡像的創建時間與系統時間一致-->
                            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
                            <format>OCI</format>
                        </container>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
......

    <profiles>
        <profile>
            <activation>
                <!--默認為dev環境打包方式-->
                <activeByDefault>true</activeByDefault>
            </activation>
            <id>dev</id>
            <properties>
                <spring.profiles.active>dev</spring.profiles.active>
                <nacos.addr>172.16.20.188:8848</nacos.addr>
                <nacos.config.prefix>gitegg-cloud-config</nacos.config.prefix>
                <nacos.config.group>GITEGG_CLOUD</nacos.config.group>
                <docker.harbor.addr>172.16.20.175</docker.harbor.addr>
                <docker.harbor.project>gitegg</docker.harbor.project>
                <docker.harbor.username>robot$gitegg</docker.harbor.username>
                <docker.harbor.password>Jqazyv7vvZiL6TXuNcv7TrZeRdL8U9n3</docker.harbor.password>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <spring.profiles.active>test</spring.profiles.active>
                <nacos.addr>127.0.0.1:8848</nacos.addr>
                <nacos.config.prefix>gitegg-cloud-config</nacos.config.prefix>
                <nacos.config.group>GITEGG_CLOUD</nacos.config.group>
                <docker.harbor.addr>172.16.20.175</docker.harbor.addr>
                <docker.harbor.project>gitegg</docker.harbor.project>
                <docker.harbor.username>robot$gitegg</docker.harbor.username>
                <docker.harbor.password>Jqazyv7vvZiL6TXuNcv7TrZeRdL8U9n3</docker.harbor.password>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <spring.profiles.active>prod</spring.profiles.active>
                <nacos.addr>127.0.0.1:8848</nacos.addr>
                <nacos.config.prefix>gitegg-cloud-config</nacos.config.prefix>
                <nacos.config.group>GITEGG_CLOUD</nacos.config.group>
                <docker.harbor.addr>172.16.20.175</docker.harbor.addr>
                <docker.harbor.project>gitegg</docker.harbor.project>
                <docker.harbor.username>robot$gitegg</docker.harbor.username>
                <docker.harbor.password>Jqazyv7vvZiL6TXuNcv7TrZeRdL8U9n3</docker.harbor.password>
            </properties>
        </profile>
    </profiles>

在需要docker打包的工程pom.xml里面添加插件引用

    <build>
        <plugins>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

在不需要docker打包的工程pom.xml里面需要配置skip=true

    <build>
        <plugins>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <configuration>
                    <!--此模塊不打可執行的jar包,打普通jar包即可-->
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

Docker本地打鏡像tar包命令:

clean package -Ptest jib:buildTar -f pom.xml

Docker把鏡像push到本地docker命令:

clean package -Ptest jib:dockerBuild -f pom.xml

Docker把鏡像push到遠程鏡像倉庫命令:

clean package -Ptest jib:build -Djib.httpTimeout=200000 -DsendCredentialsOverHttp=true -f pom.xml

??Jib( jib-maven-plugin插件 )的構建可以綁定到maven生命周期,以上實例中,已經綁定到maven的install生命周期,在實際使用時,因為安全方面的考慮,不支持http發送用戶名密碼,需要設置sendCredentialsOverHttp=true。

常見問題
  • 在bootstrap.yml中無法讀取@spring.profiles.active@,且提示found character '@' that cannot start any token.
    解決:項目中如果沒有指定spring-boot-starter-parent,resources->resource->filtering一定要設置為true才能夠解析@,如下所示:
  <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
  • GitEgg-Platform作為平臺jar包,不需要打docker文件,在GitEgg-Cloud打包時會引入GitEgg-Platform的jar包,所以上面的配置只需要在GitEgg-Cloud工程下配置。
  • K8S部署yaml,Jenkins腳本會首先讀取子工程是否有配置部署的yaml,如果有則使用,如果沒有則讀取根目錄下的部署yaml。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {APP_NAME}-deployment
  labels:
    app: {APP_NAME}
spec:
  replicas: 1
  revisionHistoryLimit: 3
  selector:
    matchLabels:
      app: {APP_NAME}
  template:
    metadata:
      labels:
        app: {APP_NAME}
    spec:
      hostNetwork: true
      containers:
      - name: {APP_NAME}
        image: {IMAGE_URL}/{IMAGE_PROGECT}/{APP_NAME}:{IMAGE_TAG}
        imagePullPolicy: Always
        resources:
          limits:
            cpu: 300m
            memory: 500Mi
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: {APP_PORT}
        env:
          - name: SPRING_PROFILES_ACTIVE
            value: {SPRING_PROFILE}
      imagePullSecrets:
        - name: harbor-key

---
kind: Service
apiVersion: v1
metadata:
  name: {APP_NAME}-service
  labels:
     app: {APP_NAME}
spec:
  selector:
    app: {APP_NAME}
  ports:
    - protocol: TCP
      port: {APP_PORT}
      targetPort: {APP_PORT}        
  • docker安裝啟動命令
docker pull 172.16.20.175/gitegg/gitegg-service-system:1.0-SNAPSHOT
#  --restart=always 自動重新啟動 , /opt/gitegg 是配置 jar包運行的位置
docker run -d imageId --restart=always --name=gitegg-service-system -p 8006:8006  /opt/gitegg
# 查看是否啟動
docker ps
# 查看日志
docker logs --tail  100 -f  gitegg-service-system
  • docker-compose配置啟動
docker-compose up -d
  • docker使用容器內網絡,當服務注冊中心Nacos使用docker-compose安裝時使用,注冊到Nacos的地址為docker容器內ip
......
    networks:
      - giteggNetworks
......
networks:
  giteggNetworks:
    driver: bridge
......

完整yaml

version: '3'
services:
  gitegg-service-system:
    image: 172.16.20.175/gitegg/gitegg-service-system:1.0-SNAPSHOT
    container_name: gitegg-service-system
    ports:
      - 8001:8001
    volumes:
      - "/data/gitegg/gateway/gitegg-service-system.jar:/app.jar"
      - "/data/gitegg/gateway/logs:/logs"
    logging:
      options:
        max-size: "100m"
    networks:
      - giteggNetworks
  gitegg-service-base:
    image: 172.16.20.175/gitegg/gitegg-service-base:1.0-SNAPSHOT
    container_name: gitegg-service-base
    ports:
      - 8002:8002
    volumes:
      - "/data/gitegg/base/gitegg-service-base.jar:/app.jar"
      - "/data/gitegg/base/logs:/logs"
    networks:
      - giteggNetworks
  gitegg-oauth:
    image: 172.16.20.175/gitegg/gitegg-oauth:1.0-SNAPSHOT
    container_name: gitegg-oauth
    ports:
      - 8003:8003
    volumes:
      - "/data/gitegg/oauth/gitegg-oauth.jar:/app.jar"
      - "/data/gitegg/oauth/logs:/logs"
    networks:
      - giteggNetworks
  gitegg-service-extension:
    image: 172.16.20.175/gitegg/gitegg-service-extension:1.0-SNAPSHOT
    container_name: gitegg-service-extension
    ports:
      - 8005:8005
    volumes:
      - "/data/gitegg/extension/gitegg-service-extension.jar:/app.jar"
      - "/data/gitegg/extension/logs:/logs"
    networks:
      - giteggNetworks
  gitegg-code-generator:
    image: 172.16.20.175/gitegg/gitegg-code-generator:1.0-SNAPSHOT
    container_name: gitegg-code-generator
    ports:
      - 8006:8006
    volumes:
      - "/data/gitegg/generator/gitegg-code-generator:/app.jar"
      - "/data/gitegg/generator/logs:/logs"
    networks:
      - giteggNetworks
  gitegg-gateway:
    image: 172.16.20.175/gitegg/gitegg-gateway:1.0-SNAPSHOT
    container_name: gitegg-gateway
    ports:
      - 801:80
    volumes:
      - "/data/gitegg/gateway/gitegg-gateway:/app.jar"
      - "/data/gitegg/gateway/logs:/logs"
    networks:
      - giteggNetworks
networks:
  giteggNetworks:
    driver: bridge
  • docker使用宿主機網絡,不能和上面的使用容器內網絡同時使用。當服務注冊中心Nacos單獨部署時使用,Nacos獲取到的是docker宿主機的ip
......
network_mode: "host"
......

完整yaml,使用了network_mode: "host"之后,不能再使用ports端口映射

version: '3'
services:
  gitegg-service-system:
    image: 172.16.20.175/gitegg/gitegg-service-system:1.0-SNAPSHOT
    container_name: gitegg-service-system
    network_mode: "host"
    volumes:
      - "/data/gitegg/gateway/gitegg-service-system.jar:/app.jar"
      - "/data/gitegg/gateway/logs:/logs"
    logging:
      options:
        max-size: "100m"
  gitegg-service-base:
    image: 172.16.20.175/gitegg/gitegg-service-base:1.0-SNAPSHOT
    container_name: gitegg-service-base
    network_mode: "host"
    volumes:
      - "/data/gitegg/base/gitegg-service-base.jar:/app.jar"
      - "/data/gitegg/base/logs:/logs"
  gitegg-oauth:
    image: 172.16.20.175/gitegg/gitegg-oauth:1.0-SNAPSHOT
    container_name: gitegg-oauth
    network_mode: "host"
    volumes:
      - "/data/gitegg/oauth/gitegg-oauth.jar:/app.jar"
      - "/data/gitegg/oauth/logs:/logs"
  gitegg-service-extension:
    image: 172.16.20.175/gitegg/gitegg-service-extension:1.0-SNAPSHOT
    container_name: gitegg-service-extension
    network_mode: "host"
    volumes:
      - "/data/gitegg/extension/gitegg-service-extension.jar:/app.jar"
      - "/data/gitegg/extension/logs:/logs"
  gitegg-code-generator:
    image: 172.16.20.175/gitegg/gitegg-code-generator:1.0-SNAPSHOT
    container_name: gitegg-code-generator
    network_mode: "host"
    volumes:
      - "/data/gitegg/generator/gitegg-code-generator:/app.jar"
      - "/data/gitegg/generator/logs:/logs"
  gitegg-gateway:
    image: 172.16.20.175/gitegg/gitegg-gateway:1.0-SNAPSHOT
    container_name: gitegg-gateway
    network_mode: "host"
    volumes:
      - "/data/gitegg/gateway/gitegg-gateway:/app.jar"
      - "/data/gitegg/gateway/logs:/logs"
GitEgg-Cloud是一款基于SpringCloud整合搭建的企業級微服務應用開發框架,開源項目地址:

Gitee: https://gitee.com/wmz1930/GitEgg
GitHub: https://github.com/wmz1930/GitEgg

歡迎感興趣的小伙伴Star支持一下。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容