xyZGHio

本是青灯不归客,却因浊酒恋风尘

0%

基于docker-connector连通宿主机网络与Docker桥接网络

这里介绍Mac环境下,通过docker-connector方式将宿主机网络与Docker桥接网络的连通。实现宿主机本地可以通过容器IP访问Docker容器

abstract.png

楔子

一方面,在Mac、Windows中,宿主机无法通过容器IP访问Docker容器;另一方面,容器通过 —net=host 选项使用host网络模式也仅在Linux系统上有效。在桥接网络下,宿主机与容器的网络通信是借助端口转发完成的。而在本地Web服务访问容器集群时,则需要使用容器IP访问。进而会导致本地Web服务无法访问容器。故这里介绍通过docker-connector的方式,将本地宿主机网络与Docker桥接网络的连通。实现宿主机本地可以通过容器IP访问Docker容器

安装

宿主机

docker-connector对Mac、Windows两种宿主机环境都提供了支持,这里介绍下在如何在Mac宿主机环境中安装docker-connector服务

1
2
3
# 通过brew安装docker-connector
brew tap wenjunxiao/brew
brew install docker-connector

启动docker-connector服务,并将其设置为开启自启。当我们将该服务设置为开机自启后,其会生成一个相应的plist文件

1
2
3
4
5
# 将指定服务设置为开机自启,并运行该服务
sudo brew services start docker-connector

# 查看当前用户的所有服务
sudo brew services list

figure 1.jpg

brew services的相关命令如下所示。需要注意:本文中所有关于brew services的命令执行都需要添加sudo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看当前用户的所有服务
sudo brew services list

# 启动指定服务
sudo brew services run docker-connector

# 停止指定服务
sudo brew services kill docker-connector

# 将指定服务设置为开机自启,并运行该服务
sudo brew services start docker-connector

# 将指定服务设置为开机自启,并重启指定服务
sudo brew services restart docker-connector

# 对指定服务取消开机自启,并停止该服务
sudo brew services stop docker-connector

Docker

在Docker中创建desktop-docker-connector容器。该容器不仅需使用host网络模式,同时需通过 —cap-add NET_ADMIN 选项为该容器添加管理网络的权限

1
2
3
4
5
6
7
# 拉取镜像
docker pull wenjunxiao/desktop-docker-connector:3.2

# 创建容器
# --cap-add NET_ADMIN 添加该容器管理网络的权限
# --net host 该容器使用host网络模式
docker run -it -d --net host --cap-add NET_ADMIN --name my-docker-connector wenjunxiao/desktop-docker-connector:3.2

配置

确定服务所使用的配置文件

通过刚刚执行sudo brew services list命令,我们知道该服务对应的plist文件。查看该plist文件后,不难看出该服务的日志文件的位置

figure 2.jpg

此时通过重启服务,我们即可通过日志文件来确定服务所读取的配置文件位置

figure 3.jpg

事实上,我们也可以直接通过plist文件确定配置文件位置。如下所示,这里使用相对路径指示配置文件的位置

figure 4.jpg

现在,确定该配置文件是否存在。如若不存在,创建该配置文件即可

figure 5.jpg

添加对容器桥接网络的路由

现在,我们只需添加对容器所在桥接网络的路由即可。这里我们有一个基于Docker的3主3从的Redis集群。首先,确定桥接网络的子网信息,利用下述命令可以看出该redis集群的桥接网络的子网为 120.120.120.0/24

1
2
3
4
5
6
7
8
# 查看Docker的桥接网络
docker network ls --filter driver=bridge

# 查看指定桥接网络的子网信息
docker network inspect <桥接网络的名称> --format "{{range .IPAM.Config}}{{.Subnet}}{{end}}"

# 查看名为 redis-cluster-3m3s_redis_cluster_3m3s_net 桥接网络的子网信息
docker network inspect redis-cluster-3m3s_redis_cluster_3m3s_net --format "{{range .IPAM.Config}}{{.Subnet}}{{end}}"

figure 6.jpg

然后,在docker-connector服务的配置文件添加对该网络的路由,写法如下所示。最后,利用sudo brew services restart命令重启该服务即可,现在我们就可以在宿主机中使用容器IP、容器端口来访问该容器了,而无需借助端口转发进行通信

1
2
# 添加对 120.120.120.0/24 网络的路由
route 120.120.120.0/24

figure 7.jpg

验证网络连通性

现在我们选择redis-cluster-3m3s_redis_cluster_3m3s_net桥接网络中的一个容器节点——node 1。尝试在宿主机中通过容器IP、容器端口进行访问

1
2
3
4
5
# 查看node-1容器的容器IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' node-1

# 查看node-1容器的容器端口
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' node-1

效果如下所示,访问成功

figure 8.jpg

请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝