docker容器端口IP规划及端口动态扩容

转载自:http://yangrong.blog.51cto.com/6945369/1582184

     docker容器一旦启动,参数就无法改变,生产环境中最常变的就是端口映射,为了解决这个问题,那么首先就要规划好,本文列出了两种端口规划方案,如果后续维护中出现了要增加端口映射的场景,本文也给出了动态端口映射扩容方案。

 

1、单IP多容器映射规划方案

    此种环境适用只有单个IP环境下,如云主机等。


1.1 端口映射规划表格:

    规划不同的端口段,映射到容器从而对外提供服务。

主机名称

ssh映射

mysql映射

nginx映射

redis映射

redis-test

51000

22

51001

3306

51004

80

51002

6379

51005

8000

51003

6381

51006

8888



scheduler-test

52000

22

52001

3306

52004

80

52002

6379

52005

8888

52003

6381

52006

8000



 

1.2 对应容器启动命令:

    docker run -h="redis-test"  --name redis-test -d -p 51000:22 -p 51001:3306   -p 51003:6379 -p 51004:6381  -p 51005:80 -p  51006:8000 -p 51007:8888   debian02 /etc/rc.local

    docker run -h="salt_zabbix_manager02"  --name salt_zabbix_manager02 -d -p 52000:22 -p   52001:3306 -p 52003:6379 -p 52004:6381  -p  52005:80 -p 52006:8000 -p 52007:8888  debian02 /etc/rc.local

 

1.3 上述启动参数解释:

-h  是指启动后容器中的主机名。

--name 是宿主机上容器的名称,以后启动停止容器不必用容器ID,用名称即可,如docker stop redis-test。

-d   以后台形式运行。

-p   指定映射端口,如果需要映射UDP端口,则格式是 -p3000:3000/udp。

debian02  是基础镜像名称。

/etc/rc.local  是容器的启动命令,把多个启动脚本放/etc/rc.local中,方便多个程序随容器开机自启动。

#关于docker的安装、初步使用、命令详解、镜像制作、容器迁入迁出等,请参考我另一篇文章:http://yangrong.blog.51cto.com/6945369/1551327

 

2、多IP多容器映射规划方案

    此规划比较适用于内网测试研发环境,所有对外访问IP都需要配置在宿主机上,如以第二IP eth0:1,eth0:2这种形式配置,然后每个IP和容器的端口映射配置就可以一致了。

 

2.1 端口与IP映射规划表格:

(此处是内网IP,宿主机IP10.28.103.1

主机名称

对外访问IP

容器开放端口

操作系统

iframe-test

10.18.103.2

22 3306 80 8000 8888 443 6379   6381

debian7

web-test

10.18.103.3

22 3306 80 8000 8888 443 6379   6381

debian7

 

2.2 对应容器启动命令:

    docker run -h="iframe-test"  --name iframe-test -d -p 10.18.103.2:22:22 -p  10.18.103.2:3306:3306 -p 10.18.103.2:6379:6379 -p 10.18.103.2:6381:6381  -p 10.18.103.2:80:80 -p 10.18.103.2:8000:8000 -p 10.18.103.2:8888:8888 -p 10.18.103.2:443:443 debian-iframe-test /etc/rc.local

    docker run -h="web-test"  --name web-test -d -p 10.18.103.3:22:22 -p 10.18.103.3:3306:3306  -p 10.18.103.3:6379:6379 -p 10.18.103.3:6381:6381  -p 10.18.103.3:80:80 -p 10.18.103.3:8000:8000  -p 10.18.103.3:8888:8888 -p 10.18.103.3:443:443 debian-iframe-test /etc/rc.local

 

3、端口映射动态扩容方案

    在工作当中,一般增加新的服务时,就需新增一个端口映射,由于无法动态调整,通常都需要commit到新的镜像,然后在基于新的镜像来起容器,确实是一件很麻烦的事。

    但映射的本质,是通过iptables来完成的。所以我们可以动态的用iptables增加端口映射即可,如下:

 

3.1 用iptables查看容器映射情况:

root@qssec-iframe:~# iptables -t nat -nvL

Chain DOCKER (2 references)

 pktsbytes target     prot opt in     out    source               destination        

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8000 to:172.17.0.3:8000

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 to:172.17.0.3:443

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:3306 to:172.17.0.3:3306

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:6379 to:172.17.0.3:6379

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:6381 to:172.17.0.3:6381

 3470  190K DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.3:80

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8888 to:172.17.0.3:8888

   41  2336 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:50000 to:172.17.0.3:22

#从这里可以找到docker容器里使用的IP,然后在用iptables增加映射即可。

 

3.2 举例新增zabbix端口的映射

  3.2.1 单IP单容器端口扩容:

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 10050 -j DNAT --to-destination  172.17.0.3:10050

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 10051 -j DNAT --to-destination  172.17.0.3:10051

 

  3.2.2 单IP多容器端口扩容:

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 50010 -j DNAT --to-destination  172.17.0.3:10050

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 50011 -j DNAT --to-destination  172.17.0.3:10051

#另一个容器则可以规划为60010,60011,这样在zabbix监控的时候,就需要指定客户容器的端口连接了。

 

  3.2.3 多IP多容器端口扩容:

      iptables -t nat -A PREROUTING -d  10.18.103.2 -p tcp -m tcp --dport 10050 -j DNAT --to-destination 172.17.0.3:10050

      iptables -t nat -A PREROUTING -d  10.18.103.2 -p tcp -m tcp --dport 10051 -j DNAT --to-destination 172.17.0.3:10051

      #iptables -t nat -A PREROUTING -d  10.18.103.3 -p tcp -m tcp --dport 10050 -j DNAT --to-destination 172.17.0.4:10050

      #iptables -t nat -A PREROUTING -d  10.18.103.3 -p tcp -m tcp --dport 10051 -j DNAT --to-destination 172.17.0.4:10051

#这样zabbix连接10.18.103.23的正常zabbix端口就可以了。

 

 

关于docker的安装、初步使用、命令详解、镜像制作、容器迁入迁出等,点击参考我另一篇文章:

>>运维人员的解放----Docker快速部署


如有疑问可加我QQ10286460 ,共同讨论,共同进步。

 

本文出自 “楊雲” 博客,转载请与作者联系!

<think>好的,用户现在问的是“带宽200M,搭建docker,能虚拟几个ip地址”。首先,我需要明确用户的具体需求。带宽200M通常指的是网络带宽,即200Mbps。但用户的问题是关于在Docker环境下能虚拟多少个IP地址,这看起来和带宽关系不大,可能用户有些混淆概念。 首先,我应该考虑用户可能对Docker网络模型不太了解,误以为带宽会影响IP地址的数量。实际上,Docker容器使用的IP地址数量主要与网络配置有关,比如使用的网络驱动(如bridge、macvlan、ipvlan等),以及宿主机的网络资源(如子网划分、可用IP范围)。带宽更多影响的是网络吞吐量,而不是IP数量。 接下来,需要分析用户可能的背景。用户可能是在尝试搭建一个多容器的环境,比如微服务架构,或者需要多个独立IP的应用场景(如爬虫、多节点测试等)。这时候用户关心的是在有限的资源下能创建多少个容器,每个容器有独立IP。 然后,我需要考虑用户可能存在的误区。带宽200M是否限制了容器数量?实际上,带宽主要影响的是每个容器的网络速度,而不是数量。但如果有大量容器同时高负载使用网络,带宽可能会成为瓶颈,但这不影响IP地址的数量。 接下来,我需要解释Docker的网络模型。默认情况下,Docker使用bridge网络,每个容器会分配一个私有IP。如果使用自定义网络或macvlan,容器可以获得独立的IP,甚至公共IPIP数量取决于子网的大小,例如子网掩码为/24的话,可以有254个可用IP,所以理论最多254个容器,但实际可能受系统资源限制。 系统资源方面,每个容器需要一定的内存、CPU和文件描述符。如果宿主机的资源足够,可以创建更多容器。但用户提到带宽200M,可能宿主机的网络配置也需要考虑,比如NAT规则、iptables性能等。 用户可能还关心如何优化网络配置,比如使用macvlan或ipvlan来避免NAT带来的性能损失,或者如何划分子网以支持更多IP。需要给出具体的配置示例,帮助用户实际操作。 此外,用户可能没有考虑到端口冲突的问题。在默认bridge网络中,如果多个容器使用同一个端口,会有冲突。而使用host网络模式则容器共享宿主机的网络栈,IP相同,但端口不能重复。这可能也是用户关心IP数量的一个因素。 总结来说,用户的核心问题是如何在200M带宽下,通过Docker创建尽可能多的具有独立IP容器。需要澄清带宽与IP数量的关系,解释影响IP数量的主要因素,并提供配置建议和优化方法。同时,提醒用户注意系统资源和网络架构的限制,避免误解带宽对容器数量的直接影响。</think>在Docker环境中,虚拟IP地址的数量主要受**网络配置模式**和**系统资源限制**影响,与带宽(200Mbps)的直接关联较小。以下是分场景解析: --- ### **一、核心影响因素** 1. **网络驱动模式** - **默认bridge网络**:所有容器共享宿主机的1个IP,通过端口映射暴露服务(端口数量上限约28,000个) - **自定义bridge网络**:容器分配私有IP(如`172.17.0.0/16`),理论最多65,534个IP,但受宿主机内存限制 - **macvlan/ipvlan模式**:直接绑定物理网卡,每个容器拥有独立公网/内网IP(需交换机支持) 2. **系统资源限制** - **内存**:每个容器至少需50-100MB内存 - **文件描述符**:Linux默认限制1024个,需修改`/etc/security/limits.conf` - **网络命名空间**:每个容器占用1个网络命名空间,内核默认支持约30,000个 --- ### **二、典型场景容量测算** | 网络模式 | 可用IP数量 | 200M带宽下的建议容器数 | 适用场景 | |----------------|----------------------|------------------------|-----------------------| | 默认bridge | 1个宿主机IP | 50-100个(端口不冲突) | Web服务集群 | | 自定义bridge | 子网范围决定(如/16)| 200-500个 | 微服务隔离环境 | | macvlan | 子网可用IP总数 | 100-300个 | 需独立公网IP的爬虫节点| **示例计算**(以自定义bridge网络为例): 若子网配置为`192.168.100.0/24`(254个可用IP),宿主机内存16GB,则实际可运行约 `16GB / 100MB ≈ 160个容器` --- ### **三、关键配置优化** #### 1. **扩容IP池** ```bash # 创建自定义网络并指定大子网 docker network create \ --driver=bridge \ --subnet=10.10.0.0/16 \ # 65,534个IP --gateway=10.10.0.1 \ my_large_network ``` #### 2. **提升系统限制** ```bash # 修改Linux内核参数(临时生效) echo 100000 > /proc/sys/fs/file-max ulimit -n 100000 # 永久生效需编辑/etc/sysctl.conf: fs.file-max = 100000 net.ipv4.ip_local_port_range = 1024 65535 ``` #### 3. **macvlan模式实战** ```bash # 创建macvlan网络(需物理网卡支持混杂模式) docker network create -d macvlan \ --subnet=192.168.1.0/24 \ --gateway=192.168.1.1 \ -o parent=eth0 \ macvlan_net ``` --- ### **四、带宽与容器数量的关系** - **轻负载场景**(如API服务): 200Mbps带宽可支持约 `200,000Kbps / 100Kbps每容器 ≈ 2000个容器`(假设每容器平均占用0.1Mbps) - **高负载场景**(如视频流媒体): 带宽可能成为瓶颈,建议控制在 `200Mbps / 5Mbps每容器 = 40个容器` --- ### **五、风险提示** 1. **IP冲突风险**:macvlan模式下需确保IP不重复 2. **ARP表溢出**:大规模部署时需调整`net.ipv4.neigh.default.gc_thresh3`值 3. **合规性问题**:公网IP容器可能违反IDC政策 建议先通过`docker stats`监控资源使用,再逐步增加容器数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值