在集群初始化后,这个 Docker 实例就自动成为了集群的管理节点,而其他 Docker 实例可以通过运行这里所打印的 docker swarm join 命令来加入集群。
加入到集群的节点默认为普通节点,如果要以管理节点的身份加入到集群中,我们可以通过 docker swarm join-token 命令来获得管理节点的加入命令。
| 1 2 3 4 | $ sudodocker swarm join-token manager
 To add a manager to this swarm, run the following command:
     docker swarm join--token SWMTKN-1-60am9y6axwot0angn1e5inxrpzrj5d6aa91gx72f8et94wztm1-7lz0dth35wywekjd1qn30jtes 192.168.1.5:2377
 | 
我们通过这些命令来建立用于我们服务开发的 Docker 集群,并将相关开发同事的 Docker 加入到这个集群里,就完成了搭建跨主机网络的第一步。
建立跨主机网络
接下来,我们就通过 docker network create 命令来建立 Overlay 网络。
| 1 | $ sudodocker network create --driver overlay --attachable mongodbs
 | 
在创建 Overlay 网络时,我们要加入 --attachable 选项以便不同机器上的 Docker 容器能够正常使用到它。
在创建了这个网络之后,我们可以在任何一个加入到集群的 Docker 实例上使用 docker network ls 查看一下其下的网络列表。我们会发现这个网络定义已经同步到了所有集群中的节点上。
| 1 2 3 4 5 | $ sudodocker network ls
 NETWORK ID     NAME        DRIVER       SCOPE
 y89bt74ld9l8    mongodbs        overlay       swarm
 | 
接下来我们要修改 Docker Compose 的定义,让它使用这个我们已经定义好的网络,而不是再重新创建网络。
我们只需要在 Docker Compose 配置文件的网络定义部分,将网络的 external 属性设置为 true,就可以让 Docker Compose 将其建立的容器都连接到这个不属于 Docker Compose 的项目上了。
| 1 2 3 | networks:
  mesh:
   external: true
 | 
通过这个实现,我们在开发中就使整个服务都处于一个可以使用别名映射网络中,避免了要对不同功能联调时切换服务 IP 的烦琐流程。在这种结构下,我们只需要让我们开发的 Docker 退出和加入不同的集群,就能马上做到切换不同联调项目。
二、编写 docker-compose 文件
主节点
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | version: "3"
 services: 
  master:
   image: mongo:4.1
   container_name: master
   environment:
    MONGO_INITDB_ROOT_USERNAME: root
    MONGO_INITDB_ROOT_PASSWORD: 123456
    TZ: "Asia/Shanghai"
   volumes:
    # 挂载 MongoDB 数据目录
    - "/data/docker/mongodb/data/mongo:/data/db:rw"
    # 挂载 KeyFile
    - "/data/docker/mongodb/data/mongodb.key:/data/mongodb.key"
   ports:
    - "27018:27017"
   networks:
    - mongodbs
   command:
    # 密码
    --auth
    # 副本集名称
    --replSet testSet 
    --oplogSize 128
    --keyFile /data/mongodb.key
 # Swarm 跨主机网络网络
 networks:
  mongodbs:
   external: true
 | 
副节点
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | version: "3"
 services: 
 secondary:
  image: mongo:4.1
  container_name: secondary
  environment:
   MONGO_INITDB_ROOT_USERNAME: root
   MONGO_INITDB_ROOT_PASSWORD: 123456
   TZ: "Asia/Shanghai"
  volumes:
   - "/data/docker/mongodb/data/mongo:/data/db:rw"
   - "/data/docker/mongodb/data/mongodb.key:/data/mongodb.key"
  ports:
   - "27018:27017"
  networks:
   - mongodbs
  command:
   --auth
   --replSet testSet 
   --oplogSize 128
   --keyFile /data/mongodb.key
 networks:
 mongodbs:
  external: true
 |