微服务架构下,原来所有服务均部署在一台云服务器上,时常会过载。现在增加了一台,总共七个微服务,加上nacos和redis,利用docker部署在两台云服务器上。
系统要求
Docker 运行在 CentOS 7.X 之上 (不支持内核在 3.8 以下的老版本)
通过以下命令查看您的 CentOS 内核
uname -r
需要保证Docker安装在 64 位平台。
设置 Yum 源
Docker 有多种安装方式,例如 Yum 安装、PRM 包安装、Shell安装等。以下以 Yum 安装方式进行, Docker 分 Docker EE 和 Docker CE 两种版本(EE:企业版,收费的;CE:社区版,不收费)。
1、安装 yum-utils , 这样就能使用 yum-config-manager 工具设置 Yum 源。
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2、执行以下命令,添加 Docker 的 Yum 源。
$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1、更新 Yum 包的索引
$ sudo yum makecache fast
2、安装最新版本的 Docker
$ sudo yum install docker-ce
3、在生产系统中,可能需要安装指定版本的 Docker ,而并不总是安装最新的版本。
执行以下命令,即可列出可用的 Docker 版本
$ yum list docker-ce --showduplicates | sort -r
列出 Docker 版本后,可使用以下命令安装指定版本的 Docker 。
例如:
$ sudo yum -y install docker-ce-17.09.0.ce
4、启动 Docker
$ sudo systemctl start docker
5、执行以下命令,验证安装是否正确
$ sudo docker run hello-world
6、查看 Docker 版本
docker version
服务打包成镜像后需要上传到私有仓库,然后服务器每次从私有仓库中拉取镜像,这里私服仓库选择阿里云镜像仓库。
注册阿里云账号,搜索容器镜像服务,然后创建命名空间、镜像仓库即可。如下图
使用了docker-maven-plugin插件来打包、推送镜像。
配置主要是在各个需要打包的微服务下的pom.xml里做配置,我这里结合了Dockerfile文件。
上传私有库,需要配置maven,找到setting.xml( linux可以使用find / -name settings.xml)加入以下配置
<servers>
<server>
<id>docker-aliyun-myid>
<username>adminusername>
<password>12345password>
server>
servers>
然后是pom文件的配置
<docker.repository.url>registry.cn-hangzhou.aliyuncs.com/danel-hub/momi-dockerdocker.repository.url>
<docker.repository.namespace>danel-hubdocker.repository.namespace>
<docker.repository.serverId>docker-aliyun-mydocker.repository.serverId>
<docker.plugin.version>1.2.0docker.plugin.version>
<build>
<plugins>
<plugin>
<groupId>com.spotifygroupId>
<artifactId>docker-maven-pluginartifactId>
<version>${docker.plugin.version}version>
<configuration>
<imageName>${docker.repository.url}:${project.artifactId}-${project.version}imageName>
<dockerDirectory>${project.basedir}dockerDirectory>
<resources>
<resource>
<targetPath>/targetPath>
<directory>${project.build.directory}directory>
<include>${project.build.finalName}.jarinclude>
resource>
resources>
<registryUrl>${docker.repository.url}registryUrl>
<serverId>${docker.repository.serverId}serverId>
configuration>
<executions>
<execution>
<id>build-imageid>
<phase>packagephase>
<goals>
<goal>buildgoal>
goals>
execution>
executions>
plugin>
每个服务下的Dockerfile文件
FROM sapmachine/jdk11
VOLUME /tmp
ADD /target/momi-user.jar app.jar
RUN bash -c 'touch /app.jar'
ENV JAVA_OPTS="\
-Dfile.encoding=UTF8 \
-XX:SurvivorRatio=8 \
-XX:+UseConcMarkSweepGC \
"
EXPOSE 8102
ENTRYPOINT ["sh", "-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar --spring.profiles.active=test"]
以上就是相关的配置,注意的是本地打包镜像上传阿里云仓库的时候,需要你本机安装有docker。
安装、启动nacos只需下面几行命令
docker search nacos
docker pull nacos/nacos-server:1.2.1
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server:1.2.1
这里-p参数是端口映射,docker容器启动nacos是以容器的内网ip启动的,外网没法访问,做了端口映射的话我们就可以通过服务器的ip来访问nacos了,这里注意下,项目里配置的nacos地址就是服务器ip:8848端口 而不是172开头的内网ip,所以这里必须做端口映射。
启动之后通过docker ps
查看运行中的容器。然后可以登录nacos的界面去导入配置文件(主要是redis、mysql数据库的配置)。
redis 可以用docker部署,也可以不用,我这里没用docker部署,直接在服务器装的redis。
根据阿里云镜像仓库的操作指南操作即可。完成之后执行docker images
查看镜像。
然后用以下命令启动容器,–name容器名称,–net=host网络模式,以host模式容器是以宿主机的ip启动的,而不是内网ip,端口也会对应到宿主机的端口,所以也不必再做端口映射。所以这样服务注册到nacos上的也是外网ip,这样的话两台服务器上的微服务就可以互相调用了。
docker run --name mo-auth --net=host -d registry.cn-hangzhou.aliyuncs.com/danel-hub/mo-docker:mo-auth-1.0-SNAPSHOT
全部启动成功后,打开nacos界面查看对应部署的服务是否都注册上来了;
测试接口的调用发现调用都没有问题,则基于docker的部署已经成功。
1、微服务本身就可以放在不同的服务器上,只要保证网络互通,就可以互相调用,所以这里不需要做集群。
2、如果服务注册不上nacos,一是查看项目里nacos的地址配置了没有,配置对了没有,我这里nacos的地址是写在配置文件中的。二是查看每个微服务暴露的端口在服务器上开放了没有。
3、如果所有服务都注册到nacos上,而两台服务器上的微服务无法互相调用,先查看nacos的服务是以哪个ip注册上来的,启动容器时不加–net=host会默认以内网ip启动注册到nacos,这样是无法给外部调用的。
4、Dockerfile里一开始用的基础镜像是open-jdk的slim 版本,运行后测试获取验证码的接口会报错Could not initialize class sun.awt.X11FontManager
,替换了jdk11的基础镜像后问题解决。