设为首页 收藏本站
查看: 3618|回复: 0

[经验分享] 使Docker提供对外服务的网络配置(桥接与端口)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-8-15 10:12:54 | 显示全部楼层 |阅读模式
前沿:
        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 。

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:~#
wKioL1PsaqiC9a-XAAdUMGvZeLM044.jpg

原来我以为docker是写了一个socker做了端口的映射功能,看文档才知道,他就是调用了一个 iptable的端口映射。
iptables -t nat -L
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

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,那你还怕啥 !  想映射什么,自己映射。

1
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80




docker之间的容器默认是互通的,也就是两个容器可以互相的通信。 如果想控制容器之间的通信,可以利用 docker  的 --icc 属性控制。

wKioL1Psd2HwJdOfAAQ3awyJ1Gg532.jpg


好了,我们在说下桥接的方式。 如果你觉得麻烦,每次都需要做端口的映射,或者是修改映射,那你可以考虑下用桥接网卡的模式。 貌似一些论坛上的牛人不太推荐用桥接,估计是为了安全的问题。  毕竟nat的话,对外是安全的,对外的服务也只是暴露出端口而已。  而桥接的话,会暴露ip出去。

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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-23906-1-1.html 上篇帖子: centos7主要特性 ---docker安装测试 下篇帖子: 运维人员的解放----Docker快速部署
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表