Docker不能绑定静态的外网固定ip的问题及解决办法

前段时间,我一直在研究如何给Docker分配静态ip,主要的用途是让thrift进来和出来都走一个ip,还有就是爬虫可以独立ip地址,这样就很好的实现了爬虫的多ip方式…  但是随着nginx tcp的加入和开发了一个基于Python socket的ip轮询访问模块解决了这两个问题…  当然也不能因为这两问题,就丢弃这问题了….

在Docker run的时候,咱们可以添加-p参数来控制他的source来源ip。   下面的命令,对外来说,开放了192.168.1.200:9200的端口…  但是我们不仅仅满与此。 docker run -p 端口的实现,就是借用iptables来实现的…   我们iptables -t nat -L 的时候,就能看到docker帮我做好的nat关系…. docker做iptables的prerouting的时候,是追加了名叫docker的自定义链条…      差点又跑题了,如果是桥接模式,那么就致使当我们如果容器里面端口的变动比较大的时候,那么就会造成改动端口映射的操作的复杂性,需要每次的变更,做一个iptables prerouting映射…    但是如果你选择HOST网络模式,那么你又不好确定你的app绑定的是哪个ip地址,不是什么服务端都支持bind ip地址的… 有些搓蛋的服务端就默认绑定第一个ip地址…    这个时候,为docker容器分配一个独立的静态ip地址就显得很有必要了….  反正就一个ip地址,你可劲的折腾…..

Python

docker run -it -p 192.168.1.200:9200:9200 redis_cluster 9200
Python

root@ubuntu:~#
 iptables -t nat -L -n
ChainPREROUTING(policyACCEPT)
target  protoptsource       destination
DOCKER  all -- 0.0.0.0/0      0.0.0.0/0      ADDRTYPEmatchdst-typeLOCAL
ChainINPUT(policyACCEPT)
target  protoptsource       destination
ChainOUTPUT(policyACCEPT)
target  protoptsource       destination
DOCKER  all -- 0.0.0.0/0     !127.0.0.0/8     ADDRTYPEmatchdst-typeLOCAL
ChainPOSTROUTING(policyACCEPT)
target  protoptsource       destination
MASQUERADE all -- 172.17.0.0/16    0.0.0.0/0
MASQUERADE all -- 172.17.0.0/16   !172.17.0.0/16
MASQUERADE tcp -- 172.17.0.1     172.17.0.1     tcpdpt:9200
ChainDOCKER(2references)
target  protoptsource       destination
DNAT   tcp -- 0.0.0.0/0      0.0.0.0/0      tcpdpt:9200to:172.17.0.1:9200

需要注意的是,docker run创建一个容器的时候,一定要把他的网卡模式改成docker的none…  一般在docker自定义网络的时候,都会把–net=none,再通过后期的一顿折腾让docker的容器有网络…..

接着,我如果想给容器,彻底的分配一个外网ip,或者管理ip,反正就一个静态的独立ip,怎么破? 用pipework是可以实现的。 但这东西稍复杂些,我们就先用系统的ip netns来解决…. 通过inspect我们知道了他的state pid .

Python

root@ubuntu:~# docker ps -a
CONTAINER ID    IMAGE        COMMAND        CREATED       STATUS       PORTS        NAMES
232621e9e9fb    redis_cluster    "/app/manage.sh 9000  41 minutes ago   Up 41 minutes              agitated_blackwell
root@ubuntu:~# docker inspect -f "{{.State.Pid}}" 232621e9e9fb
4777
root@ubuntu:~# pid=4777

那么我们来开始绑定静态ip地址,先别看原理,暂时照着做…

Python

mkdir-p/var/run/netns
ln-s/proc/$pid/ns/net/var/run/netns/$pidiplinkaddAtypevethpeernameB
brctladdifdocker0A
iplinksetAup
iplinksetBnetns$pid
ipnetnsexec$pidiplinksetdevBnameeth0
ipnetnsexec$pidiplinkseteth0up
ipnetnsexec$pidipaddradd192.168.1.200/24deveth0
ipnetnsexec$pidiprouteadddefaultvia192.168.1.1

这些都结束了后,我们会发现容器的网卡里面从一个lo,多出一个eth0网卡,网卡的ip地址正是我们刚才绑定的192.168.1.200

Python

bash-4.1#
 ip a
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN
  link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
  inet127.0.0.1/8scopehostlo
   valid_lftforeverpreferred_lftforever
  inet6::1/128scopehost
   valid_lftforeverpreferred_lftforever
22:eth0:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000
  link/etherca:aa:87:05:c9:5abrdff:ff:ff:ff:ff:ff
  inet192.168.1.200/24scopeglobaleth0
   valid_lftforeverpreferred_lftforever
  inet6fe80::c8aa:87ff:fe05:c95a/64scopelink
   valid_lftforeverpreferred_lftforever
bash-4.1#

到此为止,docker绑定固定的静态ip的方法已经说明白了….   看了文章后,会发现docker绑定ip是比较的简单..  docker的网络是不怎么好理解的,这两天我多专供下docker分配ip的整个流程 (docker iptables)

以上所述是小编给大家介绍的Docker不能绑定静态的外网固定ip的问题及解决办法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Docker容器固定IP分配详解

    我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host指定. container模式,使用--net=container:NAME_or_ID指定. none模式,使用--net=none指定. bridge模式,使用--net=bridge指定,默认设置. 默认选择bridge的情况下,容器启动后会通过DHCP获取一个地址,这可能不是我们想要的,本文介绍在centos7 docker

  • Docker 容器指定自定义网段的固定IP/静态IP地址

    Docker容器指定自定义网段的固定IP/静态IP地址 第一步:创建自定义网络 备注:这里选取了172.172.0.0网段,也可以指定其他任意空闲的网段 docker network create --subnet=172.172.0.0/16 docker-ice 注:docker-ice为自定义网桥的名字,可自己任意取名. 第二步:在你自定义的网段选取任意IP地址作为你要启动的container的静态IP地址 备注:这里在第二步中创建的网段中选取了172.172.0.10作为静态IP地址.这

  • Docker 配置固定IP及桥接的实现方法

    docker默认使用bridge模式,通过网桥连接到宿主机,而容器内部的ip则从网桥所在的ip段取未用的ip.这样做一个不方便的地方在于容器内部的ip不是固定的,想要连接容器时只能通过映射到宿主机的端口,因而有很多项目使用overlay来为docker提供网络的配置,比如Pipework.Flannel.Kubernetes.Weave.opencontrail等. 想要使用overlay来为docker配置网络,需要首先了解下docker的网络模式: 一.Docker的四种网络模式 Docke

  • Docker如何固定IP设置的方法

    由于工作需要,需要给Docker设置固定IP,在网上的查找了一些资料,自己试着实践一下,留个笔记. 经常用Docker模拟项目在生产环境中的部署,往往需要同时开好几台Docker容器,而且有时安装的软件需要绑定Docker局域网中的其他容器,如 MongoDB 副本集部署的时候,就需要绑定其他容器的内网IP. 但是,Docker 每次重启后,容器的IP地址会变化,查询了资料,Docker是支持设置固定IP的. Docker 默认网络 Docker安装后,默认会创建下面三种网络类型: $ dock

  • Docker不能绑定静态的外网固定ip的问题及解决办法

    前段时间,我一直在研究如何给Docker分配静态ip,主要的用途是让thrift进来和出来都走一个ip,还有就是爬虫可以独立ip地址,这样就很好的实现了爬虫的多ip方式-  但是随着nginx tcp的加入和开发了一个基于Python socket的ip轮询访问模块解决了这两个问题-  当然也不能因为这两问题,就丢弃这问题了-. 在Docker run的时候,咱们可以添加-p参数来控制他的source来源ip.   下面的命令,对外来说,开放了192.168.1.200:9200的端口-  但是

  • C#实现获取本地内网(局域网)和外网(公网)IP地址的方法分析

    本文实例讲述了C#实现获取本地内网(局域网)和外网(公网)IP地址的方法.分享给大家供大家参考,具体如下: 1.获取本机的IP地址集合: /// <summary> /// 获取本机所有ip地址 /// </summary> /// <param name="netType">"InterNetwork":ipv4地址,"InterNetworkV6":ipv6地址</param> /// <

  • jQuery on()方法绑定动态元素的点击事件无响应的解决办法

    $('#check_all').on('click' , function(){ alert(1); }); $("#yujinlist").append(html); count++; } 以上代码执行时,点击#check_all时,alert一直没反应,后在网上查资料时,才知道on前面的元素也必须在页面加载的时候就存在于dom里面, 那原话是这样的: 支持给动态元素和属性绑定事件的是live和on,其中live在JQUERY 1.7之后就不推荐使用了.现在主要用on,使用on的时候

  • js获取本机的外网/广域网ip地址完整源码

    完整源代码: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>客户端

  • 详解几种Linux 查询外网出口IP命令的方法

    Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl curlmyip.com curl ip.appspot.com curl ipinfo.io/ip curl ipecho.net/plain curl www.trackip.net/i curl JSON格式输出: curl ipinfo.io/jsoncurl ifconfig.me/all.jsoncurl www.trackip.net/ip?json curl XML格式输

  • Android开发获取手机内网IP地址与外网IP地址的详细方法与源码实例

    在进行Android应用开发过程中,有时候会遇到获取当前Android设备所使用的网络IP地址的场景,有时候需要本地的网络IP地址,即局域网地址,更多的时候是需要当前网络的真实的对外IP地址,即真实的网络地址,如大数据分析时往往需要Android设备上传本地的外网地址.本文对各种IP地址的获取进行了总结. 首先用大家比较熟悉的电脑端局域网地址和外网地址的获取方式对比一下:(1).电脑端局域网地址获取方式,可以通过在终端命令行输入ipconfig进行查看,如下图IPv地址标识的就是本机的局域网地址

  • docker.service启动失败:Unit not found的原因及解决办法

    背景 因为最近一直在折腾Kubernetes集群版本升级.Docker版本升级,所以不停的把测试环境安装.还原.升级.降级,简直乱的不行.终于,在测试Docker版本升级后,启动Docker时,遇到了docker.service: Unit not found.问题虽然不大,但是却折磨了我几个小时,所以在此mark一下. 操作系统:Red Hat Enterprise Linux 7 原因1:docker.socket 最初在启动docker时遇到问题,是因为docker.socket引起的,虽

  • Docker绑定固定IP/跨主机容器互访操作

    前言 之前使用pipework 分配静态ip是暂时的,重启之后就会失效,并且使用pipework绑定的ip 物理机,虚拟机,docker容器的ip都在同一网段,这在生产环境是很困难的,下面使用docker自带的network实现固定ip分配,并且重启不会消失. 环境介绍 服务器IP 容器分配网段 启动容器的ID 192.168.1.105 172.172.0.0/24 172.172.0.10 192.168.1.106 172.172.1.0/24 172.172.1.10 绑定步骤 先操作1

  • centos中NAT模式下静态IP连接外网

    使用linux虚拟机时,通常会用到yum命令来安装软件,然而这个命令需要连外网下载软件,用maven下载jar包也需要外网.虚拟机在内网可以互相ping通,然而ping不了外网,于是通过试验,终于找到了解决方案: 1.在物理机的cmd命令行中,使用ipconfig命令,查看IP配置,由图可知,物理机的子网IP是192.168.0.0,子网掩码是255.255.255.0,网关是192.168.0.1 C:\Users\huanongying>ipconfig 2.关闭将要配置IP的虚拟机,然后在

随机推荐