docker compose 编排微服务 使用 docker swarm 解决docker 容器 跨主机通信问题

文笔不好,不喜勿喷;但是自认为是能够解决实际问题的

微服务使用spring cloud实现,部署采用.jar 包方式

安静的研究了几天docker,最终解决了跨主机的通信的问题,虽然不知道其中的原理,但是还是需要记录下来!

一、准备工作

1,修改 eureka 注册中心配置

spring:
  profiles:
    active: @profileActive@  # 多环境使用 需要maven配合
  application:
    name: eureka-server

server:
  port: 8761

eureka:
  server:
    enableSelfPreservation: false
  instance:
    leaseRenewalIntervalInSeconds: 1
    leaseExpirationDurationInSeconds: 2
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://192.168.10.28:8761/eureka/,http://192.168.10.29:8761/eureka/,http://192.168.10.30:8761/eureka/

maven 使用多环境配置


        
            dev
            
                true
            
            
                dev
            
        
        
            test
            
                test
            
        
        
            prod
            
                prod
            
        
    

    
        
            
                src/main/resources
                
                    bootstrap*.yml
                
            
            
                src/main/resources
                
                true
                
                    bootstrap.yml
                    bootstrap-${profileActive}.yml
                
            
        
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

    
        
            spring-milestones
            Spring Milestones
            https://repo.spring.io/milestone
            
                false
            
        
    

2,修改config 配置中心,注册服务配置

#配置中心
spring:
  profiles:
    active: @profileActive@
  application:
    name: spring-cloud-config
    #服务的git仓库地址
  cloud:
    config:
      server:
        git:
          username: 请替换成你自己git账号
          password: 请替换成你自己git密码
          uri: 请替换成你自己git地址
          timeout: 10
          search-paths: /**  #查找所有目录,所有分支

#端口
server:
  port: 8762 #请自行定义

security:
  user:
    name: 配置中心安全验证账号
    password: 配置中心安全验证密码

eureka:
  instance:
    preferIpAddress: true
  client:
    serviceUrl:
      defaultZone: http://192.168.10.28:8761/eureka/,http://192.168.10.29:8761/eureka/,http://192.168.10.30:8761/eureka/

3,修改我们的微服务配置general-server

spring:
  profiles:
    active: @profileActive@  #环境
  application:
    name: general-server
  http: 
    multipart: #指定文件传输大小
      enabled: true
      max-file-size: 100mb
      max-request-size: 200mb
  cloud:
    config:
      username: 配置中心账号
      password: 配置中心密码
      label: git分支
      name: 配置文件名称
      profile: ${spring.profiles.active}  # 环境
      discovery: # 发现配置中心服务
        enabled: true
        service-id: spring-cloud-config
      retry:
        max-attempts: 6
        multiplier: 1.1
        initial-interval: 1000
        max-interval: 2000

management:
  security:
    enabled: false

到这里,我们的微服务就改造完成,接下来就是这么发布到docker了

二、运维(docker swarm 环境搭建)

1,假如我有3台服务(内网互通,如果不是内网互通,建议不要集群):

192.168.10.28     manger

192.168.10.29     worker1

192.168.10.30     worker2

2,确保三台服务器已经安装(生成环境请根据自己的需求,选择需要版本

docker engine  (我安装的版本 docker ce  version 18.09.1) 

docker compose  (我安装的版本 docker-compose version 1.24.0-rc1)

我没有使用虚拟机,也没有用到 docker machine  ,所以就没有安装

3,使用docker swarm 创建集群(建议先关闭三台主机的防火墙,或者打开需要使用端口)

  1. manager。初始化群。如果主机只有一个网络接口,则该--advertise-addr标志是可选的。

    docker swarm init --advertise-addr=192.168.10.28

    记下打印的文本,因为它包含您将用于加入worker-1和使用worker-2swarm 的标记。将令牌存储在密码管理器中是个好主意。

  2. worker-1,加入群。如果主机只有一个网络接口,则该--advertise-addr标志是可选的。

    docker swarm join --token  \
      --advertise-addr 192.168.10.29:2377
  3. worker-2,加入群。如果主机只有一个网络接口,则该--advertise-addr标志是可选的。

    docker swarm join --token  \
      --advertise-addr 192.168.10.30:2377
  4. manager,列出所有的节点。此命令只能从经理处完成。

$ docker node ls

ID                            HOSTNAME            STATUS    AVAILABILITY    MANAGER
d68ace5iraw6whp7llvgjpu48     ip-192-168-10-28    Ready     Active          Leader
nvp5rwavvb8lhdggo8fcf7plg     ip-192-168-10-29    Ready     Active
ouvx2l7qfcxisoyms8mtkgahw     ip-192-168-10-30     Ready     Active

5.在manager上列出Docker网络,并注意到它们中的每一个现在都有一个名为 ingress 网络和一个名为 docker_gwbridge 网络。此处仅显示列表:worker-1 worker-2 ingress  docker_gwbridge   manager

$ docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
495c570066be        bridge              bridge              local
961c6cae9945        docker_gwbridge     bridge              local
ff35ceda3643        host                host                local
trtnl4tqnc3n        ingress             overlay             swarm

6.在manager 上面创建网络

$ docker network create --driver=overlay --attachable test-net

在worker1  worker2上面执行(主要是为了连接到manager 的 test-net网络)

$ docker run -itd --name=mybusybox --network=test-net busybox /bin/sh

 如果不执行上面的语句,待会使用 docker-compose up -d 的时候会报错,错误愿意就是无法找到test-net 网络

三、运维(微服务部署(三台服务器部署都是一样的))

目录结构就直接放图片

docker compose 编排微服务 使用 docker swarm 解决docker 容器 跨主机通信问题_第1张图片

我在common 目录下面只部署了 注册中心和配置中心(下面贴出我的docker-compose.yml文件)

version: '3'
services:
  eureka:
    build:
      context: ./eureka
    image: eureka:0.0.1
    networks:
      - test-net
    volumes:
       - server-app:/usr/server
    ports:
      - "8761:8761"
  config:
    build:
      context: ./config
    image: config:0.0.1
    networks:
      - test-net
    volumes:
       - server-app:/usr/server
    ports:
      - "8762:8762"
    depends_on:
       - eureka


volumes:
  server-app:

networks:
 test-net: #上面创建好的网络
  external: true

下面是eureka 目录,Dockerfile 文件(文件里面有指定内存的占用,可根据自己的需求进行更改)

FROM java:8
VOLUME /usr/server
ADD eureka-server-0.0.1-SNAPSHOT.jar eureka-server.jar
RUN bash -c 'touch /eureka-server.jar'

ENTRYPOINT ["java","-Xms56m","-Xmx128m","-XX:PermSize=128m","-XX:MaxPermSize=256m","-Djava.security.egd=file:/dev/./urandom","-jar","/eureka-server.jar"]

下面是config 目录,Dockerfile文件(文件里面有指定内存的占用,可根据自己的需求进行更改)

FROM java:8
VOLUME /usr/server
ADD config-server-0.0.1-SNAPSHOT.jar config-server.jar
RUN bash -c 'touch /config-server.jar'

ENTRYPOINT ["java","-Xms56m","-Xmx128m","-XX:PermSize=128m","-XX:MaxPermSize=256m","-Djava.security.egd=file:/dev/./urandom","-jar","/config-server.jar"]

回到 cd /user/common 目录  执行

$ docker-compose build  

$ docker-compose up -d

如果不出意外,在浏览器上面输入192.168.10.28:8761  已经能够看到注册中心了,而且config  也注册成功了

我是将 general-server 放在另外的 /usr/server目录的,不过可以根据自己的需求而定,自行存放

$ cd /usr/server

$ mkdir general

Dockerfile

FROM java:8
VOLUME /usr/server
ADD general-server.jar app.jar
RUN bash -c 'touch /app.jar'

ENTRYPOINT ["java","-Xms128m","-Xmx256m","-XX:PermSize=128m","-XX:MaxPermSize=512m","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

$ cd /usr/server

docker-compose.yml

version: '3'
services:
  general:
    build:
      context: ./general
    image: general-server:0.0.1
    networks:
      - test-net
    ports:
      - "8800-8802" //端口设置范围的目的,是为了使用 scale的方式启动多份微服务
    volumes:
       - server-app:/usr/server


volumes:
  server-app:

networks:
  test-net:
    external: true

$ docker-compose build  编译文件里面所有服务

$ docker-compose up -d  运行文件里面所有服务

$ docker-compose logs -f 查看日志

查看日志发现已经可以联通配置中心了

到这里就结束,如果有什么不对的地方,请指出

如果有什么看不懂的,可参考官方文档

https://docs.docker.com/network/network-tutorial-overlay/

你可能感兴趣的:(docker,分布式集群)