最近特别的忙,负责的项目增加很多,差不多快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了。
本次环境:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
系统:宿主机与容器为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做网卡别名
1
|
ifconfig
em2:0 1.1.1.4 netmask 255.255.255.0 up
|
2、启动新容器
1
|
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
1
|
docker inspect
test
|
grep
-i add
|
比如本次获取的ip是172.17.0.5
3、在宿主机的iptables里做dnat映射
默认的input、output、forward我不做设置,仅设置nat
1
2
3
4
5
6
7
8
9
10
11
|
*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就解决了此问题。
有问题留言,我会及时的给与答复。
本文转自 reinxu 51CTO博客,原文链接:http://blog.51cto.com/dl528888/1604167,如需转载请自行联系原作者