前沿:redis
docker 启动容器后,如何对外服务? 但愿你们看了这篇文章后有些帮助。 docker
docker的有关网络问题没怎么搞清楚,请教了下邓磊同窗,感谢 !ubuntu
Docker生成的容器,通常会给你生成一个ip地址,这个ip地址是和docker0的地址是一个ip段的。安全
经过ip a命令 ,我们能够看到docker0的ip和子网的范围 。 你们会发现除了docker0 还有一个vethc 数字的网卡,这个也算是虚拟网卡绑在桥接上的。bash
咱们建立一个容器,而且暴露22端口。 这个22端口的意思是对外暴露了22端口,系统会从49000-49900端口范围内给你分配一个端口。网络
docker run 指明端口有两种的方式,一种是-P ,他是识别容器里的dockerfile声明的端口关系。 还有一个是-p 这个是小屁屁,他就能够直白点了。 好比 -p 6379,是对外暴露了6379。 6379:6379 是外面是6379,里面也是6379 。ssh
原文:http://rfyiamcool.blog.51cto.com/1030776/1540074 tcp
root@dev-ops:~# docker run -d -p 22 --name="redis_test" rastasheep/ubuntu-sshd ide
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地址冲突是我的结论 ,也多是我这边环境致使的这类问题!