服务开发环境
在微服务开发中,每个人所开发的功能可能都不是完整的系统,很多功能需要与其他服务之间配合才能正常运转,⽽我们开发所使⽤的机器时常⽆法满⾜我们在⼀台机器上将这些相关服务同时运⾏起来。
我们仅仅是开发某⼀部分服务的内容,既对其他服务的运转机制不太了解,又完全没有必要在⾃⼰的机器上运⾏其他的服务。所以我们最佳的实践⾃然就是让参与系统中服务开发的同事,各⾃维护⾃⼰开发服务的环境,⽽直接提供给我们对应的连接地址使⽤服务即可。
更确切地说,我们在开发中,只需要在本地搭建起⾃⼰所开发服务的运⾏环境,再与其他开发者搭建的环境互联即可。
搭建本地环境
在我们的开发机器上,只需要运⾏我们正在开发的服务,这个过程依然可以使⽤ Docker Compose 来完成。
version: "3"
networks:
backend:
mesh:
services:
mysql:
image: mysql:5.7
networks:
- backend
volumes:
- ../mysql/my.cnf:/etc/mysql/my.cnf:ro
- ../mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
ports:
- "3306:3306"
app:
build: ./spring
networks:
- mesh
- backend
volumes:
- ../app:/app
depends_on:
- mysql
跨主机⽹络
搭建好本地的环境,就需要考虑如何与同事所搭建的环境进⾏互联了。
例如。可以通过端口映射将容器应用端口映射在宿主机上,然后在通过各服务机器的 IP 与对应的端口就可以连接了。然⽽这种⽅法还不算特别⽅便,⼀来除了处理映射外,我们还需要配置防⽕墙等才能使其他的机器正确访问到容器,⼆来是这种⽅式我们依然要记录各个服务的⽹络地址等配置,⽽开发中切换它们是个烦琐的过程。
这个时候就需要使用Overlay 网络了。Overlay Network
能够跨越物理主机的限制,让多个处于不同 Docker daemon 实例中的容器连接到同⼀个⽹络,并且让这些容器感觉这个⽹络与其他类型的⽹络没有区别。
Docker Swarm
要搭建 Overlay Network ⽹络,我们就要⽤到 Docker Swarm 这个⼯具了。Docker Swarm 是 Docker 内置的集群⼯具,它能够帮助我们更轻松地将服务部署到 Docker daemon 的集群之中。
在真实的服务部署⾥,我们通常是使⽤ Docker Compose 来定义集群,⽽通过 Docker Swarm 来部署集群。
对于 Docker Swarm 来说,每⼀个 Docker daemon 的实例都可以成为集群中的⼀个节点,⽽在 Docker daemon 加⼊到集群成为其中的⼀员后,集群的管理节点就能对它进⾏控制。我们要搭建的 Overlay ⽹络正是基于这样的集群实现的。
既然要将 Docker 加⼊到集群,我们就必须先有⼀个集群,我们在任意⼀个 Docker 实例上都可以通过 docker swarm init 来初始化集群。
docker swarm init
Swarm initialized: current node (t4ydh2o5mwp5io2netepcauyl) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4dvxvx4n7magy5zh0g0de0xoues9azekw308jlv6hlvqwpriwy-cb43z26n5jbadk024tx0cqz5r 192.168.1.5:2377
在集群初始化后,这个 Docker 实例就⾃动成为了集群的管理节点,⽽其他 Docker 实例可以通过运⾏这⾥所打印的 docker swarm join
命令来加⼊集群。
加⼊到集群的节点默认为普通节点,如果要以管理节点的⾝份加⼊到集群中,我们可以通过 docker swarm join-token
命令来获得管理节点的加⼊命令。
docker 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 network create 命令来建⽴ Overlay ⽹络。
docker network create --driver overlay --attachable mesh
在创建 Overlay ⽹络时,我们要加⼊ --attachable 选项以便不同机器上的 Docker 容器能够正常使⽤到它。
在创建了这个⽹络之后,我们可以在任何⼀个加⼊到集群的 Docker 实例上使⽤ docker network ls 查看⼀下其下的⽹络列表。我们会发现这个⽹络定义已经同步到了所有集群中的节点上。
接下来我们要修改 Docker Compose 的定义,让它使⽤这个我们已经定义好的⽹络,⽽不是再重新创建⽹络。只需要在 Docker Compose 配置⽂件的⽹络定义部分,将⽹络的 external
属性设置为 true,就可以让 Docker Compose 将其建⽴的容器都连接到这个不属于 Docker Compose 的项⽬上了。
networks:
mesh:
external: true