docker分配独立ip(docker swarm网络模式)

本文目录
- docker swarm网络模式
- docker运行Spring Cloud使用外部IP
- docker镜像为什么有自己的ip
- docker容器网络
- 每个docker一个ip地址吗
- docker 能给容器分配独立IP吗
docker swarm网络模式
docker swarm 网络模式
swarm service的路由办法通常有两种,VIP和DSN
这是缺省情况设置,当用户创建service的时候,这个service会被分配一个VIP,然后每一个具体的container都有一个独立的IP,ingress会负责从VIP到各个container之间的路由。
举例来说:
并且看到了它的属性。
创建两个service:
nslookup查看域名解析:
从这个例子我们可以看到:
我们再进入container看看:
每一个container有两块网卡:
eth0: 10.0.1.3 这就是我们前面看到的service container IP地址,是属于网络my-network的。
eth1: 172.18.0.4,这是另一个网络地址;是谁的呢, 是网络docker_gwbridge。(另外bridge网络使用的是172.17网段)
也就是说每一个container属于两个网络,my-network和docker_gwbridge,分别用来service路由,和连接主机网络。
补充一点网卡eth1: 172.18.0.4,对应的网关地址是172.18.0.1,那个这个网关地址172.18.0.1是谁呢,它就是主机网络上的docker_gwbridge,在主机上运行ifconfig可以看到:
bridge网络的网段地址从172.17.X.X/16开始,第一个内置的docker0使用了172.17.X.X,后面每新增一个bridge网络就新增一个网地址,172.18.X.X, 172.19.X.X,。。。
至此两个bridge网络都比较清楚了。
另外如果发布service的时候指定了主机端口映射,那么container里面会有三块网卡分别属于:
做一个总结:
发布service的时候:
注意swarm VIP使用的一个限制:
也就是说无法做到同一个client过来的请求保持路由到同一个container去。
适合使用自己的DSN Load-Balance算法,例如HAProxy。
创建使用DSN轮询的service。
由参数--endpoint-mode决定。
先看一下两个container的ip 地址:
两个contaienr的ip 地址分别是:
再看DSN解析结果:
每次运行ping解析出的IP地址在两个container之间轮换,也就没有虚IP概念了,而且swarm自动实现了DSN轮询的功能。
再看一个nslookup结果:
可见nslookup直接把两个container的地址都解析出来,说明一个域名(service name)对映有两个IP地址。对照前面使用VIP的,一个service name只对映一个IP地址,就是VIP地址,而不管具体有多少个container实例。
docker运行Spring Cloud使用外部IP
在多机器上docker部署Spring Cloud发现有一个问题,即在docker容器内部,Spring Cloud eureka实例只能获取到docker内部网络的IP,如172.x.x.x,并将其注册到注册中心,此时其他服务通过该IP在docker外部无法访问该服务。以下有两种解决方法:
启动容器时将宿主机的IP加到容器环境变量中然后在Spring Boot application.yml 中使用该环境变量。
application.yml
启动docker时加入 HOST 环境变量:
或使用docker-compose:
将容器以host模式运行
在Spring Cloud中配置IP访问
多网卡的情况
指定IP在某些场景下很有用,如某台服务器有eth0、eth1和eth3三块网卡,但是eth1可以被其它的服务器访问;如果Eureka Client将eth0或者eth3注册到Eureka Server上,其它微服务就无法通过这个IP调用该微服务的接口。
若在生产环境中使用,一般就不会直接使用IP注册到eureka注册中心了,由于生产环境通常由k8s集群或其他类似docker集群进行管理,因此一般会使用服务名等进行注册,由k8s再转发到具体的服务上。
参考链接:
docker镜像为什么有自己的ip
docker镜像有自己的ip的原因是docker属于容器。根据查询相关信息资料,docker容器可以分配并指定ip,尤其是搭建集群时,可以防止容器ip混乱,在启动docker容器的时候,使用默认网络是不支持指派固定ip的,因此要创建自定义网络,设置固定ip。
docker容器网络
利用Net Namespace可以为Docker容器创建隔离的网络环境,容器具有完全独立的网络栈,与宿主机隔离。也可以使Docker容器共享主机或者其他容器的网络命名空间,基本可以满足开发者在各种场景下的需要。
Docker支持 4种网络模式 :
1)host模式,--net=host指定,不支持多主机。
2)container模式,--net = container : name_or_id指定,不支持多主机。
3)none模式,--net=none指定,不支持多主机。
4)bridge模式,--net=bridge指定,默认设置,不支持多主机。
启动容器的时候使用Host模式,那么该容器与宿主机共用一个Network Namespace,因此容器将不会虚拟自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。
采用Host模式的容器,可以直接使用宿主机的IP地址与外界进行通信,无需额外进行NAT转换。由于容器通信时,不再需要通过Linux Bridge等方式转发或者数据包的拆封,性能上有很大优势。当然, Host模式有利也有弊 ,主要包括以下缺点:
1)容器没有隔离、独立的网络栈。容器因与宿主机共用网络栈而争抢网络资源,并且容器崩溃也可能导致宿主机崩溃,这在生产环境中是不允许发生的。
2)容器不再拥有所有的端口资源,因为一些端口已经被宿主机服务、Bridge模式的容器端口绑定等其他服务占用了。
需要补充说明的是,Host模式下的容器仅仅是网络命名空间与主机相同,但容器的文件系统、进程列表等还是和与宿主机隔离的。
Container模式是一种特殊的网络模式。该模式下的容器使用其他容器的网络命名空间,网络隔离性会处于Bridge模式与Host模式之间。当容器与其他容器共享网络命名空间时,这两个容器间不存在网络隔离,但它们与宿主机及其他容器又存在网络隔离。
在Kubernetes体系架构下引入Pod概念,Kubernetes为Pod创建一个基础设施容器, 同一Pod下的其他容器都以Container模式 共享这个基础设施容器的网络命名空间,相互之间以localhost访问,构成一个统一的整体。
与前两种不同,None模式的Docker容器拥有自己的Network Namespace,但并不为Docker容器进行网络配置。该Docker容器没有网卡、IP、路由等信息。需要用户为Docker容器添加网卡、配置IP等。
Bridge模式是Docker默认的网络模式,也是开发者最常使用的网络模式。在这种模式下,Docker为容器创建独立的网络栈,保证容器内的进程使用独立的网络环境,实现容器之间、容器与宿主机之间的网络栈隔离。同时,通过宿主机上的Docker0网桥,容器可以与宿主机乃至外界进行网络通信。
同一宿主机上,容器之间都是连接在Docker0这个网桥上,Docker0作为虚拟交换机使容器间相互通信 。但是, 由于宿主机的IP地址与容器veth pair的IP地址均不在同一个网段 ,故仅仅依靠 veth pair和NameSpace的技术 并不足以使宿主机以外的网络主动发现容器的存在。Docker采用了 端口绑定的方式(通过iptables的NAT) ,将宿主机上的端口流量转发到容器内的端口上,这样一来,外界就可以与容器中的进程进行通信。 iptables的介绍,请点我点我 。
创建容器,并将宿主机的3306端口绑定到容器的3306端口:docker run -tid --name db -p 3306:3306 mysql
在宿主机上,可以通过“iptables -t nat -L -n”,查到一条DNAT规则:DNAT tcp --0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 to:172.17.0.5:3306
Bridge模式的容器与外界通信时,必定会占用宿主机上的端口,从而与宿主机竞争端口资源,这会造成对宿主机端口管理很复杂。同时,由于容器与外界通信是基于三层上iptables NAT,性能和效率损耗是显而易见的。
NAT将地址空间分段的做法引入了额外的复杂度。比如容器中应用所见的IP并不是对外暴露的IP, 因为网络隔离,容器中的应用实际上只能检测到容器的IP,但是需要对外宣称的则是宿主机的IP,这种信息的不对称将带来诸如破坏自注册机制等问题 。
摘抄自陆平的《基于Kubernetes的容器云平台实战》一书的第10章Kubernetes网络
每个docker一个ip地址吗
docker run创建Docker contains时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:
host模式,使用--net=host指定。
container模式,使用--net=container:NAME_or_ID指定。
none模式,使用--net=none指定。
bridge模式,使用--net=bridge指定,默认设置。containers启动后会通过DHCP获取一个地址.
网络:em1是内网,em2是外网(设置本次外网ip是1.1.1.3),docker0是docker的桥接网卡
独立ip:设置本次独立ip是1.1.1.4
操作方法:
1、为独立ip与外网卡em2做网卡别名
ifconfig em2:0 1.1.1.4 netmask 255.255.255.0 up
2、启动新容器
***隐藏网址***
3. 获取容器ip
docker inspect test|grep -i add
比如本次获取的ip是172.17.0.5
在宿主机的iptables里做dnat映射
默认的input、output、forward我不做设置,仅设置nat
*nat
:PREROUTING ACCEPT
:POSTROUTING ACCEPT
:OUTPUT ACCEPT
:DOCKER -
-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与内部端口
docker 能给容器分配独立IP吗
注意你的 PATH 环境变量要包含 /usr/local/bin 这个路径,请在 /etc/profile 文件中加入一行(LCTT 译注:要使环境变量生效,你需要执行这个命令: source /etc/profile):
export PATH="$PATH:/usr/local/bin"
在每台宿主机上重复上面的操作。
Weave 在 TCP 和 UDP 上都使用 6783 端口,如果你的系统开启了防火墙,请确保这两个端口不会被防火墙挡住。
在每台宿主机上启动 Weave 路由器
当你想要让处于在不同宿主机上的容器能够互相通信,第一步要做的就是在每台宿主机上启动 weave 路由器。
第一台宿主机,运行下面的命令,就会创建并开启一个 weave 路由器容器(LCTT 译注:前面说过了,weave 路由器也是一个容器):
$ sudo weave launch
第一次运行这个命令的时候,它会下载一个 weave 镜像,这会花一些时间。下载完成后就会自动运行这个镜像。成功启动后,终端会输出这个 weave 路由器的 ID 号。
下面的命令用于查看路由器状态:
$ sudo weave status
第一个 weave 路由器就绪了,目前为止整个 peer 对等网络中只有一个 peer 成员。
你也可以使用 docker 的命令来查看 weave 路由器的状态:
$ docker ps
第二台宿主机部署步骤稍微有点不同,我们需要为这台宿主机的 weave 路由器指定第一台宿主机的 IP 地址,命令如下:
$ sudo weave launch 《first-host-IP-address》
当你查看路由器状态,你会看到两个 peer 成员:当前宿主机和第一个宿主机。
当你开启更多路由器,这个 peer 成员列表会更长。当你新开一个路由器时,要指定前一个宿主机的 IP 地址,请注意不是第一个宿主机的 IP 地址(LCTT 译注:链状结构)。
现在你已经有了一个 weave 网络了,它由位于不同宿主机的 weave 路由器组成。
把不同宿主机上的容器互联起来
接下来要做的就是在不同宿主机上开启 Docker 容器,并使用虚拟网络将它们互联起来。
假设我们创建一个私有网络 10.0.0.0/24 来互联 Docker 容器,并为这些容器随机分配 IP 地址。
如果你想新建一个能加入 weave 网络的容器,你就需要使用 weave 命令来创建,而不是 docker 命令。原因是 weave 命令内部会调用 docker 命令来新建容器然后为它设置网络。
下面的命令是在宿主机 hostA 上建立一个 Ubuntu 容器,然后将它放到 10.0.0.0/24 网络中,分配的 IP 地址为 10.0.0.1:
hostA:~$ sudo weave run 10.0.0.1/24 -t -i ubuntu
成功运行后,终端会显示出容器的 ID 号。你可以使用这个 ID 来访问这个容器:
hostA:~$ docker attach 《container-id》
在宿主机 hostB 上,也创建一个 Ubuntu 容器,IP 地址为 10.0.0.2:
hostB:~$ sudo weave run 10.0.0.2/24 -t -i ubuntu
访问下这个容器的控制台:
hostB:~$ docker attach 《container-id》
这两个容器能够互相 ping 通,你可以通过容器的控制台检查一下。
如果你检查一下每个容器的网络配置,你会发现有一块名为“ethwe”的网卡,你分配给容器的 IP 地址出现在它们那里(比如这里分别是 10.0.0.1 和 10.0.0.2)。
Weave 的其他高级用法
weave 提供了一些非常巧妙的特性,我在这里作下简单的介绍。
应用分离
使用 weave,你可以创建多个虚拟网络,并为每个网络设置不同的应用。比如你可以为一群容器创建 10.0.0.0/24 网络,为另一群容器创建 10.10.0.0/24 网络,weave 会自动帮你维护这些网络,并将这两个网络互相隔离。另外,你可以灵活地将一个容器从一个网络移到另一个网络而不需要重启容器。举个例子:

更多文章:
巴西半场0比0瑞士(世界杯巴西vs瑞士哪队强 瑞士和巴西两队实力对比分析交锋历史战绩)
2026年10月22日 06:00
简单托管班装修效果图(托管班墙面布置的要求及用什么涂料更适合)
2026年10月22日 04:40
来港易网站哪里申请(来港易申请香港入境,让填香港住址怎么办)
2026年10月22日 01:00
服务器管理软件支持国产自研芯片(100%“纯国产”芯片来了!国产龙芯霸气官宣:发布纯自研芯片产品)
2026年10月21日 22:30
ip查到没下载过的(我用自己的笔记本在公司连接无线网络、公司能查到我的上网记录吗偶尔玩下网游也能查到吗不可能吧)
2026年10月21日 20:00




