前沿:
docker 启动容器后,如何对外服务? 希望大家看了这篇文章后有些帮助。
docker的有关网络问题没怎么搞清楚,请教了下邓磊同学,感谢 !
Docker生成的容器,一般会给你生成一个ip地址,这个ip地址是和docker0的地址是一个ip段的。
通过ip a命令 ,咱们可以看到docker0的ip和子网的范围 。 大家会发现除了docker0 还有一个vethc 数字的网卡,这个也算是虚拟网卡绑在桥接上的。
我们创建一个容器,并且暴露22端口。 这个22端口的意思是对外暴露了22端口,系统会从49000-49900端口范围内给你分配一个端口。
docker run 指明端口有两种的方式,一种是-P ,他是识别容器里的dockerfile声明的端口关系。 还有一个是-p 这个是小屁屁,他就可以直白点了。 比如 -p 6379,是对外暴露了6379。 6379:6379 是外面是6379,里面也是6379 。
原文:http://rfyiamcool.blog.51cto.com/1030776/1540074
root@dev-ops:~# docker run -d -p 22 --name="redis_test" rastasheep/ubuntu-sshd
ed7887b93aa452323ee96339d889bebc36ad25a479c660ba89e97d2c5869f105
root@dev-ops:~#
root@dev-ops:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed7887b93aa4 rastasheep/ubuntu-sshd:latest /usr/sbin/sshd -D 7 seconds ago Up 7 seconds 0.0.0.0:49153->22/tcp redis_test
root@dev-ops:~#
原文:http://rfyiamcool.blog.51cto.com/1030776/1540074
原来我以为docker是写了一个socker做了端口的映射功能,看文档才知道,他就是调用了一个 iptable的端口映射。
iptables -t nat -L
原文:http://rfyiamcool.blog.51cto.com/1030776/1540074 Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere !127.0.0.0/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- localhost/16 !localhost/16 Chain DOCKER (2 references) target prot opt source destination DNAT tcp -- anywhere anywhere tcp dpt:49153 to:172.17.0.2:22 root@dev-ops:~#
有主机的ip,和容器的ip,那你还怕啥 ! 想映射什么,自己映射。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80
docker之间的容器默认是互通的,也就是两个容器可以互相的通信。 如果想控制容器之间的通信,可以利用 docker 的 --icc 属性控制。
原文:http://rfyiamcool.blog.51cto.com/1030776/1540074
好了,我们在说下桥接的方式。 如果你觉得麻烦,每次都需要做端口的映射,或者是修改映射,那你可以考虑下用桥接网卡的模式。 貌似一些论坛上的牛人不太推荐用桥接,估计是为了安全的问题。 毕竟nat的话,对外是安全的,对外的服务也只是暴露出端口而已。 而桥接的话,会暴露ip出去。
原文:http://rfyiamcool.blog.51cto.com/1030776/1540074
暂停docker服务
sudo service docker stop
用ip命令使docker0网卡down掉
sudo ip link set dev docker0 down
删除网卡
sudo brctl delbr docker0
创建一个网卡 名字是bridge0
sudo brctl addbr bridge0
ip地址和子网
ip addr add 192.168.5.1/24 dev bridge0
启动桥接网卡
sudo ip link set dev bridge0 up
写入配置
echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
sudo service docker start
这样的桥接方式有个问题就是,他的ip是docker自己检测搞给你的,貌似不是dhcp获取空闲的,然后赋予给容器的。我昨天再次做测试的时候,有一个ip被占用的,但是他还是分喷给了一个被占用的ip地址。 这样的话就冲突了。 如果ip端和公司内部或者是线上重叠的话,可能会造成ip地址的冲突。 桥接后遇到ip地址冲突是个人结论 ,也可能是我这边环境导致的这类问题!