为了账号安全,请及时绑定邮箱和手机立即绑定

docker高级应用之赋予容器独立外网ip

标签:
Docker


最近特别的忙,负责的项目增加很多,差不多快4个月没有写博客,今天就给各位分享一下我docker方面经验。之前写过一篇docker的安装与使用(地址http://dl528888.blog.51cto.com/2382721/1427150),最近公司使用docker做持久化部署项目,主要使用docker的单机环境与集群环境,目前流程测试都没有问题,剩下仅有细节优化,现在我就给大家分享一下我的成功与经验。

本次介绍赋予docker container一个独立的外网ip,可以有自己独立的网络与其他服务器沟通。

需求:

需要一个独立ip xx.xx.xx.xx来与容器做映射,运行这个外网ip的80与443端口映射到容器的80与443端口,其实如果这个宿主机仅有这一个容器,或者仅有这个容器需要开通80与443对外,不需要独立的ip,但如果同一个宿主机有多个不同容器想把自己本身的80与443都对外把80与443对外,那么就得需要独立ip了。

本次环境:

系统:宿主机与容器为centos 6.5 x86_64

网络:em1是内网,em2是外网(设置本次外网ip是1.1.1.3),docker0是docker的桥接网卡

独立ip:设置本次独立ip是1.1.1.4

使用的技术:参考了openstack的iptables dnat技术

下面是docker版本

08:32:50 # docker version

Client version: 1.1.2

Client API version: 1.13

Go version (client): go1.2.2

Git commit (client): d84a070/1.1.2

Server version: 1.1.2

Server API version: 1.13

Go version (server): go1.2.2

Git commit (server): d84a070/1.1.2

root@ip-10-10-29-224:~

09:58:51 # docker info

Containers: 15

Images: 8

Storage Driver: devicemapper

 Pool Name: docker-8:3-22806948-pool

 Data file: /var/lib/docker/devicemapper/devicemapper/data

 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata

 Data Space Used: 60996.6 Mb

 Data Space Total: 102400.0 Mb

 Metadata Space Used: 33.9 Mb

 Metadata Space Total: 2048.0 Mb

Execution Driver: native-0.2

Kernel Version: 2.6.32-431.29.2.el6.x86_64

操作方法:

1、为独立ip与外网卡em2做网卡别名

ifconfig em2:0 1.1.1.4 netmask 255.255.255.0 up

2、启动新容器

docker run --restart always --privileged -d  --name='test' docker.ops-chukong.com:5000/centos6-http:new /usr/bin/supervisord

我这里使用supervisor启动容器的ssh与http服务,并且设置允许特权模式,在docker重启后自动启动容器。另外我没有设置开放的端口,原因是我自己使用iptables的dnat,没有使用默认docker的nat规则(设置了--iptables=false),使用自定义的好处是我可以随意指定开放端口,如果使用默认的,只能在容器生成的时候-p指定端口才能对外开放。

获取容器ip

docker inspect test|grep -i add

比如本次获取的ip是172.17.0.5

3、在宿主机的iptables里做dnat映射

默认的input、output、forward我不做设置,仅设置nat

*nat

:PREROUTING ACCEPT [15:1542]

:POSTROUTING ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

:DOCKER - [0:0]

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER 

-A POSTROUTING  -j MASQUERADE 

-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER 

-A DOCKER  -d 1.1.1.4 ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.5:80

-A DOCKER  -d 1.1.1.4 ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.5:443

COMMIT

其中-A DOCKER是做的dnat设置,-d是指定访问的外网ip地址,就是我刚才1.1.1.4,另外dport是允许访问的端口,--to-destination是容器的ip与内部端口

然后重启iptables就解决了此问题。

有问题留言,我会及时的给与答复。

©著作权归作者所有:来自51CTO博客作者dl528888的原创作品,如需转载,请注明出处,否则将追究法律责任

docker外网ipdocker映射ipdocker容器外网ip运维自动化专题


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消