spring-boot dubbo項目使用docker方式部署


項目結構

本項目采用maven構建,有三個模塊,分別是pms-interfaces, pms-services, pms-portal。

模塊 描述
pms-interfaces 接口層,只能存放實體,枚舉,接口。
pms-services 服務層,使用 dubbo向外暴露服務
pms-portal 用戶界面層,使用前后端分離的方式來構建用戶界面,它又分為frontend和spring mvc兩層。其中spring mvc 的controller負責訪問dubbo服務,然后向frontend提供restful服務。

項目結構截圖如下:
項目結構

使用docker-maven-plugin

  1. 其中parent POMs和 pms-interfaces不需要構造鏡像,因此需要跳過。
    <!--build plugin-->
    <build>
        <plugins>
            <!--docker-maven-plugin-->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <configuration>
                    <skipDockerBuild>true</skipDockerBuild>
                </configuration>
            </plugin>
        </plugins>
    </build>
  1. pms-services的配置
  • POM配置
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<!--docker-maven-plugin-->
			<plugin>
				<groupId>com.spotify</groupId>
				<artifactId>docker-maven-plugin</artifactId>
				<configuration>
					<skipDockerBuild>false</skipDockerBuild>
					<imageName>${project.name}:${project.version}</imageName>
					<dockerDirectory>${project.basedir}/docker</dockerDirectory>
					<resources>
						<resource>
							<directory>${project.build.directory}</directory>
							<include>${project.build.finalName}.jar</include>
						</resource>
					</resources>
				</configuration>
			</plugin>
		</plugins>
	</build>
  • Dockerfile的定義,位置在項目目錄下的docker文件夾中(${project.basedir}/docker)
# Dockerfile
FROM java:8-jre

# 設置工作目錄
WORKDIR /app

# 將jar文件拷貝到鏡像中。注:docker-maven-plugin 會將jar文件拷貝到構建目錄target/docker/中
COPY ./pms-services-1.0-SNAPSHOT.jar /app/app.jar

EXPOSE 20880
CMD ["java", "-jar", "/app/app.jar"]

容器在運行時向外暴露20880端口

  1. pms-portal的配置
  • POM配置
<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<!--docker-maven-plugin-->
			<plugin>
				<groupId>com.spotify</groupId>
				<artifactId>docker-maven-plugin</artifactId>
				<configuration>
					<skipDockerBuild>false</skipDockerBuild>
					<imageName>${project.name}:${project.version}</imageName>
					<dockerDirectory>${project.basedir}/docker</dockerDirectory>
					<resources>
						<resource>
							<directory>${project.build.directory}</directory>
							<include>${project.build.finalName}.jar</include>
						</resource>
					</resources>
				</configuration>
			</plugin>
		</plugins>
	</build>
  • Dockerfile的定義,位置在項目目錄下的docker文件夾中(${project.basedir}/docker)
# Dockerfile
FROM java:8-jre

# 設置工作目錄
WORKDIR /app

# 將jar文件拷貝到鏡像中。注:docker-maven-plugin 會將jar文件拷貝到構建目錄target/docker/中
COPY ./pms-portal-1.0-SNAPSHOT.jar /app/app.jar

EXPOSE 8000
CMD ["java", "-jar", "/app/app.jar"]

容器在運行時向外暴露8000端口

  1. 注意:在使用docker-maven-plugin時,還需要在~/.m2/settings.xml中的pluginGroups節點下增加 com.your.plugins
 <!-- pluginGroups
   | This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
   | when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
   | "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
   |-->
  <pluginGroups>
    <!-- pluginGroup
     | Specifies a further group identifier to use for plugin lookup.
    <pluginGroup>com.your.plugins</pluginGroup>
    -->
	<pluginGroup>com.spotify</pluginGroup>
  </pluginGroups>
  1. 開始構建鏡像
  • 在docker所在服務中配置tcp綁定
  [root@localhost ~]# cd /etc/docker
  [root@localhost ~]# vim daemon.json
  {
    "registry-mirrors": ["http://b24820b7.m.daocloud.io"],
    "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
  }
  [root@localhost ~]# service docker restart
  • 在開發環境中配置環境變量DOCKER_HOST
    在開發環境中配置環境變量DOCKER_HOST
  • 開始構建鏡像
  mvn clean package docker:build -Dmaven.test.skip=true

project docker images

在服務器上運行容器並測試

  • 依次運行pms-services, pms-portal
  [root@localhost ~]# docker run -d pms-services:1.0-SNAPSHOT
  [root@localhost ~]# docker run -d -p 8000:8000 pms-portal:1.0-SNAPSHOT
  • 登錄zookeeper gui查看dubbo服務注冊信息

  # provider
    
  dubbo://172.17.0.2:20880/com.lovefly.pms.interfaces.service.TestService?anyhost=true&application=pms-services&dubbo=2.5.3&interface=com.lovefly.pms.interfaces.service.TestService&methods=echo&pid=1&revision=1.0-SNAPSHOT&side=provider&timestamp=1504436089577
    
  # consumer
    
  consumer://172.17.0.3/com.lovefly.pms.interfaces.service.TestService?application=pms-portal&category=consumers&check=false&dubbo=2.5.3&interface=com.lovefly.pms.interfaces.service.TestService&methods=echo&pid=1&revision=1.0-SNAPSHOT&side=consumer&timestamp=1504436100128


  • 在瀏覽器中訪問pms-portal

  • 使用curl測試pms-portal

  [root@localhost docker]# curl -X GET http://192.168.41.128:8000/api/echo?input=ping2222
    ping2222: pong from service
  [root@localhost docker]# 

在容器中配置時區的兩種方式

  1. 通過docker-compose的volumes配置,跟宿主服務器操持一致
  volumes:
  - "/etc/timezone:/etc/timezone:ro"
  - "/etc/localtime:/etc/localtime:ro"
  1. 通過環境變量設置時區
  # 設置時區
  ENV TZ=Asia/Shanghai

在容器中設置hosts

  1. 通過docker-compose的extra_host配置
  extra_hosts:
    - "somehost:162.242.195.82"
    - "otherhost:50.31.209.229"
  1. 通過命令行參數--add-host設置
  [root@localhost ~]# docker run -d --add-host "service.ielong.cn":172.17.0.4 --add-host "servicewx.ielong.cn":172.17.0.5  pms-services:1.0-SNAPSHOT

參考文檔:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM