以spring cloud开发的微服务程序是否适合在docker环境下部署。代码参考之前的博客:http://blog.csdn.net/j903829182/article/details/78511059
一,Dockerfile编写
前面博客的6个微服务的Dockerfile的编写几乎完全一致,下面以config模块为例。
1,runboot.sh脚本编写
位于src/main/docker下:
sleep 10
java -jar /app/config.jar
根据启动顺序,调整sleep的时间
2,Dockerfile编写
位于src/main/docker下:
FROM hub.c.163.com/library/java:latest
MAINTAINER jack
VOLUME /tmp
RUN mkdir /app
ADD config.jar /app/app.jar
ADD runboot.sh /app/
RUN bash -c 'touch /app/app.jar'
WORKDIR /app
RUN chmod a+x runboot.sh
EXPOSE 8888
CMD /app/runboot.sh
为不同的微服务我们只需修改:
ADD config.jar /app/app.jar
以及端口:
EXPOSE 8888
3,Docker的maven插件
在开发机器编译Docker镜像到服务器,使用docker-maven-plugin即可,在所有程序的pom.xml内增加下面代码:
<build>
<finalName>config</finalName>
<plugins>
<!--<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>-->
<!--<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>-->
<!--在开发机器编译docker镜像到服务器使用docker-mave-plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-mave-plugin</artifactId>
<configuration>
<imageName>${project.name}:${project.version}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<skipDockerBuild>false</skipDockerBuild>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
4,编译镜像
使用docker-maven-plugin,默认将Docker编译到localhost。如果是远程Linux服务器,请在环境变量中配置:DOCKER_HOST,本例的linux服务器地址是:192.168.0.104
在控制台进入代码的目录,执行下面的语句:
mvn clean package docker:build -DskipTests
编译后效果如下:
查看linux服务器上的镜像,如下:
二,Docker Compose
Docker Compose是用来定义和运行多容器应用的工具。关于Docker Compose的安装和使用可以查看:
https://docs.docker.com/compose/。
Docker Compose使用一个docker-compose.yml来描述多容器的定义,使用下面命令运行整个应用:
docker-compose up
三,docker-compose.yml编写
docker-compose.yml的编写代码如下:
postgresdb:
image: busybox
volumes: - /var/lib/postgresql/data
postgres:
name: postgres
image: postgres
hostname: postgres
volumes_from:
- postgresdb
#ports:
# -"5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
discovery:
image: "discovery:1.0.0-SNAPSHOT"
hostname: discovery
name: discovery
ports:
- "8761:8761"
config:
image: "config:1.0.0-SNAPSHOT"
hostname: config
name: config
links:
- discovery
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
#ports:
# - "8888:8888"
person:
image: person:1.0.0-SNAPSHOT
hostname: person
links:
- discovery
- config
- postgres
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
#ports:
# - "8082:8082"
some:
image: some:1.0.0-SNAPSHOT
hostname: some
links:
- discovery
- config
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
#ports:
- "8083:8083"
ui:
image: ui:1.0.0-SNAPSHOT
hostname: ui
links:
- discovery
- config
- person
- some
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
ports:
- "80:80"
monitor:
image: monitor:1.0.0-SNAPSHOT
hostname: monitor
links:
- discovery
- config
- person
- some
- ui
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
#ports:
# - "8989:8989"
#enviroment:给容器使用的变量,在容器中使用${}来调用
#links:当前容器依赖的容器,可直接使用依赖容器的已有端口
#ports:将我们要暴露的端口映射出来,不需要暴露的端口则不做映射
四,运行
将docker-compose.yml上传至linux服务器,在文件当前目录执行下面命令:
docker-compose up -d
-d表示后台运行
启动效果如下:
源码地址:https://github.com/wj903829182/springcloud3