項目結構
本項目采用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
- 其中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>
- 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端口
- 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端口
- 注意:在使用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>
- 開始構建鏡像
- 在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
- 開始構建鏡像
mvn clean package docker:build -Dmaven.test.skip=true
在服務器上運行容器並測試
- 依次運行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×tamp=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×tamp=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]#
在容器中配置時區的兩種方式
- 通過docker-compose的volumes配置,跟宿主服務器操持一致
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
- 通過環境變量設置時區
# 設置時區
ENV TZ=Asia/Shanghai
在容器中設置hosts
- 通過docker-compose的extra_host配置
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
- 通過命令行參數--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
參考文檔: