我肯定是做错了什么,但我正在尝试测试一个绑定到机器上特定 IP 的 docker 容器的简单设置。以下是用例:
在主机上:
ifconfig eno1:1 192.168.3.222 netmask 255.255.255.0 up
docker network create --subnet=172.18.0.0/16 mynet123
docker run --net mynet123 --privileged -p 192.168.3.222:4444:4444 --name test -t -i ubuntu:xenial /bin/bash
在现在正在运行的 bash 会话中:
apt-get update
apt-get install netcat
netcat -l 4444
现在回到主机上的另一个 shell(或者网络上的任何其他计算机):
netcat 192.168.3.222 4444
这会导致连接被拒绝。
我一定是做错了什么,因为即使我尝试使用默认网络或-p 4444:4444
使用--net=host
主机的原始 IP 而不是 .222,也会发生同样的事情。
根据我在网上读到的所有内容,这看起来很简单,但由于某种原因,我无法让其他机器通过主机访问容器。
答案1
我不确定您为什么要创建具有不同 IP 子网的网络。
我可以在不创建网络的情况下实现您的要求。这<target-ip>
是您要绑定到的接口上的 IP。
core@coreos6 ~ $ docker run -it --privileged -p <target-ip>:4444:4444 alpine:edge /bin/sh
/ # nc -l 4444
hola mundo!
然后,从互联网上的任何地方(我的目标 IP 是公共 IP)
user@otherhost ~ # netcat <target-ip>:4444
hola mundo!
我还看到容器上写着“hola mundo!”。
我认为您的问题是更改--net mynet123
了容器所看到的接口的 IP。看看这个:
core@coreos6 ~ $ docker run -it --privileged -p <target-ip>:4444:4444 alpine:edge /bin/sh
/ # ip addr
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:2/64 scope link
valid_lft forever preferred_lft forever
/ # ^D
core@coreos6 ~ $ docker network create --subnet=172.18.0.0/16 mynet123
30cab3dff92248d0fab5a1c70362fdc6da9399393def0571fe1b903d4fcab8cf
core@coreos6 ~ $ docker run --net mynet123 -it --privileged -p <target-ip>:4444:4444 alpine:edge /bin/sh
/ # ip addr
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe12:2/64 scope link
valid_lft forever preferred_lft forever
这可能会搞乱docker为启用端口转发而执行的iptables处理。