Docker-compose一键部署zk集群+dubbo-admin

Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。

Zookeeper镜像下载

docker pull zookeeper

下载dubbo-admin
官网dubbo-admin地址apache/incubator-dubbo-ops,下载后切换branchgit checkout master(不切master没有dubbo-admin)

编译dubbo-admin
修改application.properties

vim src/main/resources/application.properties

使用下面三种方式修改都可以

#集群方式
#dubbo.registry.address=zookeeper://192.168.199.191:2181?backup=192.168.199.192:2181,192.168.199.193:2181
#单机IP方式
#dubbo.registry.address=zookeeper://172.19.165.222:2181
#容器service方式
dubbo.registry.address=zookeeper://zk:2181

注意,使用容器service方式,需要在docker-compose.yml配置中link到相关容器。

修改完后就可以打包了

mvn clean package -Dmaven.test.skip=true

将打包的jar文件复制到指定目录,如下:

#创建docker dubbo dubbo-admin文件
mkdir /usr/local/docker
mkdir /usr/local/docker/dubbo
mkdir /usr/local/docker/dubbo/dubbo-admin

#进入dubbo-admin
cd /usr/local/docker/dubbo/dubbo-admin

#将编译的 dubbo-admin-0.0.1-SNAPSHOT.jar 文件复制到当前目录
cp dubbo-admin/target/dubbo-admin-0.0.1-SNAPSHOT.jar .

接着编写Dockerfile

vim Dockerfile

FROM java:8

#作者
MAINTAINER xxx

# 注意 此处 EVN 设置注册中心地址
#ENV DUBBO_IP_TO_REGISTRY 172.19.165.222   #服务名称/IP地址
#ENV DUBBO_PORT_TO_REGISTRY 12345      #端口(默认不需要修改端口)

#挂载点
VOLUME /tmp

add dubbo-admin-0.0.1-SNAPSHOT.jar app.jar
#命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

生成镜像

docker build --rm -t dubbo-admin:1.0 .

创建docker-compose.yml 文件

version: '3'

services:
  zoo1:
    image: zookeeper:3.4  #zk镜像版本
    container_name: zoo1 
    restart: always
    hostname: zoo1 #容器名
    ports:
      - "2181:2181"  #将左端口绑定到右端口上
    environment:     #配置zk集群环境变量
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

  zoo2:
    image: zookeeper:3.4
    container_name: zoo2
    restart: always
    hostname: zoo2
    ports:
      - "2182:2181"
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888

  zoo3:
    image: zookeeper:3.4
    container_name: zoo3
    restart: always
    hostname: zoo3
    ports:
      - "2183:2181"
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888

  dubbo-admin:
    image: dubbo-admin:1.0
    container_name: dubbo-admin
    links:
      - zoo1:zk  #配置容器link名,可理解为别名
    depends_on:
      - zoo1
      - zoo2
      - zoo3
    ports:
      - 7001:7001 #主机端口:容器端口
    restart: always

注意,上面的0.0.0.0是表示可用主机IP访问且一定要这样错开。
注意service执行顺序,使用depends_on
配置link名称后,则application.properties中配置的zk路径就能打开对应的容器并注册。
测试时右端(容器)口只能用2181原因是容器通信的内部端口要与dubbo-admin一致

一键启动服务
先不要使用后台进程启动,看服务是否正常。

#Create and start containers
docker-compose up

打开服务http://IP:7001 登录,若Ok则以后台进程运行。

docker-compose up -d
#stop services
docker-compose stop
#start services
docker-compose start

查看容器日志
首先切到docker-compose.yml文件的目录,执行docker-compose ps

image.png

可以看到容器的名称,然后根据名称查看对应的日志

docker logs -ft --tail 100 dubboadmin_dubbo-admin_1

-f是跟踪日志输出 -t是输出时间 --tail是输出结尾n行

修改zk默认端口
当启动镜像时会看到以下日志:

[root@hadoopslave3 zk]# docker logs -ft --tail 100 zoo1
2018-11-21T03:24:23.275393000Z ZooKeeper JMX enabled by default
2018-11-21T03:24:23.276138000Z Using config: /conf/zoo.cfg
2018-11-21T03:24:23.675101000Z 2018-11-21 03:24:23,671 [myid:] - INFO  [main:QuorumPeerConfig@136] - Reading configuration from: /conf/zoo.cfg
2018-11-21T03:24:23.685718000Z 2018-11-21 03:24:23,685 [myid:] - INFO  [main:QuorumPeer$QuorumServer@184] - Resolved hostname: zoo3 to address: zoo3/172.18.0.4
2018-11-21T03:24:23.686546000Z 2018-11-21 03:24:23,685 [myid:] - INFO 

从日志上可以看到zk启动时读取配置文件的位置是/conf/zoo.cfg,若想改变配置文件内容,可以在本地挂载一个文件即可,如下:

version: '3'
services:
  zoo1:
    image: zookeeper:3.4
    restart: always
    container_name: zoo1
    hostname: zoo1
    volumes:
      - ./zoo.cfg:/conf/zoo.cfg
    ports:
      - "2183:2186"

此时镜像启动时就会读取本地配置文件而不是镜像里的原文件了-_-

发布到docker hub

  1. 查看images
[root@localhost disconf]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
dubbo-admin                    1.0                 dac91b8ba273        3 days ago          675MB
  1. 注册一个docker hub账号
    官网地址https://hub.docker.com/
  2. 给image打上标签
#docker tag image:tag  dockerID/imageName:version
docker tag dubbo-admin:1.0 mapbar/dubbo-admin:latest
  1. 登录你的docker hub
[root@localhost war]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: mapbar
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
  1. 上传到docker hub
docker push mapbar/dubbo-admin:latest

docker端口映射异常
[NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2186:ZooKeeperServer@922] - Refusing session request for client
被这个问题折腾了半天,还费力改了容器通信端口及zk默认端口(容器通信端口不会与宿主机冲突),还是报错,结果重启docker服务(service docker restart)一切ok。

学习交流群:64691032

推荐阅读更多精彩内容