- 一、 Docker 的四大组成对象
- 二、搭建运行 Docker 环境
- 三、在 Windows 和 Mac 中使用 Docker
- 四、使用容器:镜像与容器
- 五、使用容器:从镜像仓库获得镜像
- 六、使用容器:运行和管理容器
- 七、为容器配置网络
- 八、管理和存储数据
- 九、操作镜像:保存和共享镜像
- 十、操作镜像:通过 Dockerfile 创建镜像
- 十一、常见 Dockerfile 使用技巧
- 十二、使用 Docker Hub 中的镜像
- 十三、组合操作:使用 Docker Compose 管理容器
- 十四、组合操作:常用的 Docker Compose 配置项
- 十五、组合操作:编写 Docker Compose 项目
- 十六、组合操作:应用于服务化开发
十六、组合操作:应用于服务化开发
16.1 服务开发环境
在开始之前,我们依然来设定一个场景。在这里,假定我们处于一个 Dubbo
治下的微服务系统,而工作是开发系统中某一项微服务。
- 微服务开发与上一节里我们提到的小型项目开发在环境搭建上有一定的区别,我们要合理地调整
Docker
的使用方法和策略,就必须先了解这些区别。 - 在微服务开发中,我们所开发的功能都不是完整的系统,很多功能需要与其他服务之间配合才能正常运转,而我们开发所使用的机器时常无法满足我们在一台机器上将这些相关服务同时运行起来。
- 我们仅仅是开发某一部分服务的内容,既对其他服务的运转机制不太了解,又完全没有必要在自己的机器上运行其他的服务。所以我们最佳的实践自然就是让参与系统中服务开发的同事,各自维护自己开发服务的环境,而直接提供给我们对应的连接地址使用服务即可。
- 更确切地说,我们在开发中,只需要在本地搭建起自己所开发服务的运行环境,再与其他开发者搭建的环境互联即可…
16.2 搭建本地环境
在我们的开发机器上,我们只需要运行我们正在开发的服务,这个过程依然可以使用 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...
16.3 跨主机网络
- 搭建好本地的环境,我们就需要考虑如何与朋友们所搭建的环境进行互联了。
- 这时候大家也许会想到,可以将服务涉及的相关端口通过映射的方式暴露到我们机器的端口上,接着我们只需要通过各服务机器的 IP 与对应的端口就可以连接了。
- 然而这种方法还不算特别方便,一来除了处理映射外,我们还需要配置防火墙等才能使其他的机器正确访问到容器,二来是这种方式我们依然要记录各个服务的网络地址等配置,而开发中切换它们是个烦琐的过程。
- 在介绍
Docker Compose
的小节里,我们知道了可以通过设置网络别名 (alias
) 的方式来更轻松地连接其他容器,如果我们在服务化开发里也能这么做就能减少很多烦琐操作了。 - 要实现设置网络别名的目的,自然要先确保所有涉及的容器位于同一个网络中,这时候就需要引出我们之前在网络小节里说到的
Overlay
网络了…
Overlay Network
能够跨越物理主机的限制,让多个处于不同 Docker daemon
实例中的容器连接到同一个网络,并且让这些容器感觉这个网络与其他类型的网络没有区别。
Docker Swarm
要搭建 Overlay Network
网络,我们就要用到 Docker Swarm
这个工具了。 Docker Swarm
是 Docker
内置的集群工具,它能够帮助我们更轻松地将服务部署到 Docker daemon
的集群之中。
- 在真实的服务部署里,我们通常是使用
Docker Compose
来定义集群,而通过Docker Swarm
来部署集群。 Docker Swarm
最初是独立的项目,不过目前已经集成到了Docker
之中,我们通过docker CLI
的命令就能够直接操控它。- 对于
Docker Swarm
来说,每一个Docker daemon
的实例都可以成为集群中的一个节点,而在Docker daemon
加入到集群成为其中的一员后,集群的管理节点就能对它进行控制。我们要搭建的Overlay
网络正是基于这样的集群实现的。 - 既然要将
Docker
加入到集群,我们就必须先有一个集群,我们在任意一个Docker
实例上都可以通过docker swarm init
来初始化集群…
$ sudo 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
命令来加入集群。 - 加入到集群的节点默认为普通节点,如果要以管理节点的身份加入到集群中,我们可以通过
ocker swarm join-token
命令来获得管理节点的加入命令。…
$ sudo 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
集群,并将相关开发同事的 Docker
加入到这个集群里,就完成了搭建跨主机网络的第一步
建立跨主机网络
接下来,我们就通过 docker network create
命令来建立 Overlay
网络。
$ sudo docker network create --driver overlay --attachable mesh
在创建 Overlay
网络时,我们要加入 --attachable
选项以便不同机器上的 Docker
容器能够正常使用到它。
在创建了这个网络之后,我们可以在任何一个加入到集群的 Docker
实例上使用 docker network ls
查看一下其下的网络列表。我们会发现这个网络定义已经同步到了所有集群中的节点上…
$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
## ......
y89bt74ld9l8 mesh overlay swarm
## .........
接下来我们要修改 Docker Compose
的定义,让它使用这个我们已经定义好的网络,而不是再重新创建网络。
我们只需要在 Docker Compose
配置文件的网络定义部分,将网络的 external
属性设置为 true
,就可以让 Docker Compose
将其建立的容器都连接到这个不属于 Docker Compose
的项目上了。
networks:
mesh:
external: true
通过这个实现,我们在开发中就使整个服务都处于一个可以使用别名映射网络中,避免了要对不同功能联调时切换服务 IP 的烦琐流程。在这种结构下,我们只需要让我们开发的 Docker
退出和加入不同的集群,就能马上做到切换不同联调项目。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论