Docker微服务初体验之心路历程

     本篇文章主要讲述笔者使用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中:

Docker微服务初体验之心路历程_第1张图片

接下来首先构建一个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文件,构造服务镜像。

Docker微服务初体验之心路历程_第2张图片

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

 

 

 

 

你可能感兴趣的:(JAVA)