前沿:

        docker 启动容器后,如何对外服务?   希望大家看了这篇文章后有些帮助。 


docker的有关网络问题没怎么搞清楚,请教了下邓磊同学,感谢 !


Docker生成的容器,一般会给你生成一个ip地址,这个ip地址是和docker0的地址是一个ip段的。


通过ip a命令 ,咱们可以看到docker0的ip和子网的范围 。 大家会发现除了docker0 还有一个vethc 数字的网卡,这个也算是虚拟网卡绑在桥接上的。

wKiom1PsaNfirzmfAAU8lwiyqYc483.jpg


我们创建一个容器,并且暴露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

wKioL1PsaqiC9a-XAAdUMGvZeLM044.jpg


原来我以为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 属性控制。


wKioL1Psd2HwJdOfAAQ3awyJ1Gg532.jpg


原文: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地址冲突是个人结论 ,也可能是我这边环境导致的这类问题!