绑定地址在Docker macvlan
Bind address in Docker macvlan
我正在尝试构建一个 macvlan,其中 N 个容器绑定到同一个 ip。每个容器将公开一项服务。
为此:
sudo docker network create -d macvlan \
--subnet=192.168.4.0/24 \
--ip-range=192.168.4.0/24 \
--gateway=192.168.4.201 \
-o macvlan_mode=bridge \
-o parent=eth0 macvlan70
运行 个容器:
sudo docker run --net=macvlan70 -P -d --name test_sshd1 eg_ssh
sudo docker run --net=macvlan70 -P -d --name test_sshd2 eg_ssh
桥:
sudo ip link add mymacvlan90 link eth0 type macvlan mode bridge
sudo ip addr add 192.168.4.10/24 dev mymacvlan90
sudo ifconfig mymacvlan90 up
此时我可以 ping
和 nmap
来自主机的每个容器。我使用 inspect
检查每个容器的 "IPAddress"
。
macvlan
检查的结果:
"Containers": {
"89ed3de20801bf096b389379bb546da03f3452e80dbabad89c5457bdc4dcc5fc": {
"Name": "test_sshd1",
"EndpointID": "6a7d774ae7e3ce3aac877523968b2ce5a026ae740c059b61162ceb170d53a0c4",
"MacAddress": "02:42:c0:a8:04:01",
"IPv4Address": "192.168.4.1/24",
"IPv6Address": ""
},
"ca13b48ccbc267859f406084357dadcd3592cb678502b7086908d6d895728632": {
"Name": "test_sshd2",
"EndpointID": "98ce081e94a209838bb4281613055b32967ea85c40c2e3814fe73a88bc9cb380",
"MacAddress": "02:42:c0:a8:04:02",
"IPv4Address": "192.168.4.2/24",
"IPv6Address": ""
}
现在我正在创建另一个容器,如下所示:
sudo docker run --net=macvlan70 -p 192.168.4.1:66:22 -d --name test_sshd4 eg_ssh
我的目标是在同一个 ip 和 mac 下公开 2 个通用服务(试图用 N 服务模拟一个真实的 machine)。容器创建成功。但是如果我 运行 这个命令:
$ nmap 192.168.4.1 -p 66
Starting Nmap 7.01 ( https://nmap.org ) at 2017-12-06 16:57 WET
Nmap scan report for 192.168.4.1
Host is up (0.00021s latency).
PORT STATE SERVICE
66/tcp closed sqlnet
我期待在 66 处打开端口。但事实并非如此。
您不能使用 -p
绑定到另一个容器的地址。这是为了在 host 接口上公开容器。
您可以在与现有容器相同的网络名称空间中启动新容器:
docker run --net=container:test_sshd1 -d --name test_sshd4 eg_ssh
回复:您的评论:
当然,您不能将两个东西绑定到同一地址上的同一端口。
一个选项是在第二个容器中配置 ssh 以侦听端口 22 以外的其他内容。设置您的图像,以便您可以将侦听端口作为环境变量传递(因此您可以 docker run -e SSHD_LISTEN_PORT=66 ...
之类的)。
第二种选择是将它们都绑定到 host 地址(例如您的网桥地址 @ 192.168.4.10)。第一个以 -p 192.168.4.10:22:22
开始,第二个以 -p 192.168.4.10:66:22
开始。这将在 192.168.4.10 上公开两个服务,一个在端口 22 上,一个在端口 66 上。
我正在尝试构建一个 macvlan,其中 N 个容器绑定到同一个 ip。每个容器将公开一项服务。 为此:
sudo docker network create -d macvlan \
--subnet=192.168.4.0/24 \
--ip-range=192.168.4.0/24 \
--gateway=192.168.4.201 \
-o macvlan_mode=bridge \
-o parent=eth0 macvlan70
运行 个容器:
sudo docker run --net=macvlan70 -P -d --name test_sshd1 eg_ssh
sudo docker run --net=macvlan70 -P -d --name test_sshd2 eg_ssh
桥:
sudo ip link add mymacvlan90 link eth0 type macvlan mode bridge
sudo ip addr add 192.168.4.10/24 dev mymacvlan90
sudo ifconfig mymacvlan90 up
此时我可以 ping
和 nmap
来自主机的每个容器。我使用 inspect
检查每个容器的 "IPAddress"
。
macvlan
检查的结果:
"Containers": {
"89ed3de20801bf096b389379bb546da03f3452e80dbabad89c5457bdc4dcc5fc": {
"Name": "test_sshd1",
"EndpointID": "6a7d774ae7e3ce3aac877523968b2ce5a026ae740c059b61162ceb170d53a0c4",
"MacAddress": "02:42:c0:a8:04:01",
"IPv4Address": "192.168.4.1/24",
"IPv6Address": ""
},
"ca13b48ccbc267859f406084357dadcd3592cb678502b7086908d6d895728632": {
"Name": "test_sshd2",
"EndpointID": "98ce081e94a209838bb4281613055b32967ea85c40c2e3814fe73a88bc9cb380",
"MacAddress": "02:42:c0:a8:04:02",
"IPv4Address": "192.168.4.2/24",
"IPv6Address": ""
}
现在我正在创建另一个容器,如下所示:
sudo docker run --net=macvlan70 -p 192.168.4.1:66:22 -d --name test_sshd4 eg_ssh
我的目标是在同一个 ip 和 mac 下公开 2 个通用服务(试图用 N 服务模拟一个真实的 machine)。容器创建成功。但是如果我 运行 这个命令:
$ nmap 192.168.4.1 -p 66
Starting Nmap 7.01 ( https://nmap.org ) at 2017-12-06 16:57 WET
Nmap scan report for 192.168.4.1
Host is up (0.00021s latency).
PORT STATE SERVICE
66/tcp closed sqlnet
我期待在 66 处打开端口。但事实并非如此。
您不能使用 -p
绑定到另一个容器的地址。这是为了在 host 接口上公开容器。
您可以在与现有容器相同的网络名称空间中启动新容器:
docker run --net=container:test_sshd1 -d --name test_sshd4 eg_ssh
回复:您的评论:
当然,您不能将两个东西绑定到同一地址上的同一端口。
一个选项是在第二个容器中配置 ssh 以侦听端口 22 以外的其他内容。设置您的图像,以便您可以将侦听端口作为环境变量传递(因此您可以 docker run -e SSHD_LISTEN_PORT=66 ...
之类的)。
第二种选择是将它们都绑定到 host 地址(例如您的网桥地址 @ 192.168.4.10)。第一个以 -p 192.168.4.10:22:22
开始,第二个以 -p 192.168.4.10:66:22
开始。这将在 192.168.4.10 上公开两个服务,一个在端口 22 上,一个在端口 66 上。