本篇文章主要讲述笔者使用Docker+微服务的经历,包括docker的常用命令,定义Dockerfile文件,使用docker build,docker run等命令,以及使用docker compose管理运行容器。
1.安装docker的几个命令:
$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ yum install docker-ce
$ systemctl start docker
$ systemctl enable docker
$ docker version
2.docker操作容器的常用命令:
#搜索docker镜像:
docker search 名称(svn)
#拉取镜像
docker pull 镜像名(docker.io/garethflowers/svn-server)
#删除镜像
docker rmi 镜像id
#查看本地docker镜像
docker images
#查看docker本地运行进程
docker ps -a
#运行docker镜像容器:
docker run -d
--name jenkins
-p 61081:8080 -p 50000:50000
-v /data/jenkins/var:/var/jenkins_home
jenkins/jenkins
#进入docker
docker exec -it (服务名) /bin/bash
#退出docker容器:
exit
#重启docker
docker restart (服务名)svn-server
#关闭容器
docker stop 容器ID
#删除容器
docker rm 容器ID (运行中的容器加-f参数)
#启动一个已经停止的容器实例
docker start 容器ID或容器名
3.构建微服务docker镜像
在spring cloud应用中服务都注册在eureka中:
接下来首先构建一个spring cloud eureka docker镜像:
3.1 创建 Dockerfile文件
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD eureka-1.0.0.jar eureka-1.0.0.jar
RUN sh -c 'touch /eureka-1.0.0.jar'
ENV JAVA_OPTS=""
#Djava.security.egd
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /eureka-1.0.0.jar" ]
将Dockerfile文件放在和jar同一个目录下。
3.2 构造docker镜像
docker build -t eureka-1.0.0.jar .
到此使用docker images命令可以看到生成了一个eureka docker镜像。
接下来同理3.1和3.2步骤创建其余微服务Dockerfile文件,构造服务镜像。
4.运行docker镜像
docker run --name eureka-server -p 8761:8761 -t 2d9ac70a4a98
由于服务运行在docker上面,所以需要为docker容器指定一个主机名--name eureka-server。
在微服务的pom上配置:
# 注册中心配置
eureka:
client:
service-url:
defaultZone: http://eureka-server:8761/eureka/
当容器之间存在相互引用的情况下,可以配合使用--links运行容器:
docker run --link eureka-server:8761 --name config -p 8888:8888 -t a37dca32a2e9
使用docker ps -a可以查看容器运行状态。
5.使用docker compose管理运行容器
微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,从上面的示例中可以看出,如果每个微服务都要手动启停,那么效率很低,维护量会越来越大。因此,接下来改造成使用docker compose来管理容器。
5.1 docker compose安装
# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
安装完成之后使用docker-compose version检测安装是否成功,如果抛出下面错误:
Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/docker-compose.pkg
可以参考以下链接:http://www.mamicode.com/info-detail-1863233.html
5.2 使用docker创建一个外部网络
docker network create arcloud_net
5.3 创建docker-compose.yml文件
关于docker-compose启动容器的加载顺利,可以参考https://docs.docker.com/compose/startup-order/
解决的办法有以下几种:
1、足够的容错和重试机制,比如连接数据库,在初次连接不上的时候,服务消费者可以不断重试,直到连接上
2、docker-compose拆分,分成两部分部署,将要先启动的服务放在一个docker-compose中,后启动的服务放在两一个docker-compose中,启动两次,两者使用同一个网络。
3、同步等待,使用wait-for-it.sh
或者其他shell
脚本将当前服务启动阻塞,直到被依赖的服务加载完毕wait-for-it
的github地址为:wait-for-it
本文使用第二种方式,创建两个docker-compose,并且两者使用同一个外部网络。
version: "3"
services:
eureka:
build: ./eureka/
ports:
- "8762:8761"
volumes:
- ./eureka:/eureka
networks:
- default
- arcloud_net
config:
build: ./config/
ports:
- "8889:8888"
links:
- "eureka:eureka-server"
networks:
- default
- arcloud_net
networks:
arcloud_net:
external: true
version: "3"
services:
auth:
build: ./auth/
ports:
- "3000:3001"
external_links:
- "eureka:eureka-server"
- config
networks:
- default
- arcloud_net
networks:
arcloud_net:
external: true
这里两个容器的定义里都使用了同一个外部网络 arcloud_net。然后分别到这两个docker-compose.yml文件的目录下通过 docker-compose up 命令启动这两个容器即可。
其他容器需要加入该网络中的话,可以使用如下命令:
docker network connect arcloud_net 容器id