docker容器IP“暴露”到外网(宿主机外)
首先将docker容器IP固定
Docker自身的4种网络工作方式,简略说明下:
host模式,使用--net=host指定。
container模式,使用--net=container:NAME_or_ID指定。
none模式,使用--net=none指定。
bridge模式,使用--net=bridge指定,默认设置。
可以通过命令docker network ls查看。具体细节自行查阅官方文档。
因为docker的这四种网络都禁止用户为容器指定固定ip,所以需要自己创建网络。
docker network create --subnet=172.172.0.0/24 docker-br0
执行上述创建语句,再次执行docker network ls,docker network列表中多了我们刚创建的自定义网络,ip段可以自己定义,/24 是子网掩码。
有了自定义网卡,我们就可以为新启动的容器指定固定ip了。
docker run -itd --net=docker-br0 --ip 172.172.0.101 --name init busybox
docker exec -it init /bin/sh
进入容器后执行
ifconfig
分配了我们指定的172.172.0.101。
暴露ip给外网
举个实际场景。
我的开发环境是mac,在mac上安装了centos虚拟机,然后在这台centos上安装了docker,并启动了刚才的docker容器。
docker容器内是可以ping同mac的IP,但是mac是无法ping通docker容器的。
所以我们需要将所有访问容器ip段(172.172.0.0/24)的连接都交由虚拟机(centos)进行路由。
执行以下命令
ip route add 172.172.0.0/24 via 10.1.10.95 dev en4
10.1.10.95是虚拟机centos的ip地址。en4是mac上的网卡(可以通过ifconfig查看)。
mac上没有ip这个命令,需要单独安装:
brew install iproute2mac
查看刚添加好的路由
ip route
如果要删除
ip route del 172.172.0.0/24
好了,现在可以ping同刚创建的容器了
相信看到这里,应该明白怎么将容器IP“暴露”出去了。