docker绑定ip(docker绑定目录)
单host下Docker的默认网络配置
本文用到的环境如下:
docker绑定ip(docker绑定目录)
docker绑定ip(docker绑定目录)
host: centos7
docker: 通过 yum install -y docker 安装,版本号为1.10.3
docker镜像:
# Version: 0.0.1 FROM ubuntu:latest MAINTAINER paul liu "" RUN apt-get update RUN apt-get install -y net-tools RUN apt-get install -y iputils-ping CMD /bin/bash
场景图:
我的host主机接有路由器,通过ADSL拨号上网,网卡0固定IP为192.168.0.200,为路由器的IP 192.168.0.1。
在host上安装docker,并运行容器。
通过以下命令安装docker,
yum install -y docker
启用docker,
ctl start docker
然后在host主机运行 ifconfig 或 ip a 命令,可以看到除去host原有的网卡0和回环lo外,多了个docker0。
docker0 IP为172.17.0.1,所在的网段默认为B类私网地址172.17.0.0/16。可以将docker0看做是host主机的一块虚拟网卡。这样host主机就等同于配置了双网卡,两块网卡之间可以通信,但前提是启用ip_forward。
这是docker0的个身份。
运行两个容器docker1,docker2,然后在host主机上运行 brctl show 查看,
这里可以看出docker0的第二个身份,一个虚拟交换机。每运行一个容器,就会产生一对v,其中一端连接到docker0上,另一端连接到容器的0上。这样,所有连接到docker0的容器组成了一个局域网。如下图:
在host主机上运行 ifconfig ,也会发现多了两个v这样的网络接口。
在host主机上运行 ip addr show v6d9a6 ,可以查看到该v具有mac地址,这也正说明了docker0的虚拟交换机的身份,交换机是通过mac地址通信的,连接到交换机的设备必须具有mac地址。
由于docker0自身也具有mac地址,这个与纯二层交换机是不同的,并且绑定了IP 172.17.0.1,容器默认把docker0作为了。也就是docker0还兼具路由的功能,因此可以把docker0看做是一个三层交换机,可以做二层数据包转发,也可以做三层路由转发。
在容器中运行 route -n 查看路由如下:
在host主机上运行 route -n 查看路由如下:
在host中,访问本网段192.168.0.0是通过0转发数据包的,访问172.17.0.0网段是通过docker0转发数据包的,而对于其他如公网是通过0将数据包转发给192.168.0.1,再由该进行数据包转发的,比如上网。
在容器中运行 ping 或 ping 192.168.0.200 都可以ping通。
默认情况下,不需要再额外做任何配置,在一台host主机上,通过docker0,各容器之间可以互通,并且可以通过host的0连接外网。
通俗的讲,通过docker0组成了一个网段为172.17.0.0/16的以太网,docker容器发起请求时,如果是相同网段则经由docker0转发到目标机器,如果是不同网段,则经由docker0,转发到host的另一块网卡0上,由0负责下一步的数据包转发,比如公网地址。
下面进一步分析一下报文是怎么发送到外面的。
容器内部发送一条公网请求报文,通过0,在v被接收。此时报文已经来到了主机上,通过查询主机的路由表( route -n ),如果发现报文应该通过主机的0,从默认发送出去,那么报文就被从docker0转发给主机的0,但前提是首先启用ip_forward功能,才能在host主机的docker0和0两个网卡间传递数据包。
由于目标地址并不属于host主机所在网段,那么会匹配机器上的 iptables中的nat表POSTROUTING链中的规则。
在host主机运行命令 iptables -L -n -t nat --line-numbers ,查看nat表,这里只看POSTROUTING链:
行中说明,对于源地址为172.17.0.0/16网段的数据包,发出去之前通过MQSQUERADE伪装。linux内核会修改数据包源地址为host主机0的地址(也就是192.168.0.200),然后把报文转发出去。对于外部来说,报文是从主机0发送出去的。
局域网内的机器由于都是私有IP,是无法直接访问互联网的(数据包可以发出去,但回不来。)如果要上网,除了可以通过硬件路由器,也可以通过软件路由,在iptables的nat表中的POSTROUTING链中添加SNAT规则。
测试一下,在host主机运行命令 iptables -t nat -D POSTROUTING 1 将条规则删掉,那么在容器中就运行命令 ping 就ping不通了。但仍然可以ping通host主机。
在host主机运行命令以下命令恢复:
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -o 0 -j SNAT --to-source 192.168.0.200
或者
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -j MASQUERADE
关于SNAT和MASQUERADE,这篇文章已经有过描述,可以参考: Docker前传之linux iptables
新建一Dockerfile,用以运行nginx容器:
# Version: 0.0.1 FROM paulliu/ubuntu_ip RUN apt-get install -y nginx EXPOSE 80
在host主机运行构建命令构建镜像 docker build -t paulliu/nginx .
在host主机运行容器启动命令 docker run -d -p 80 --name nginx1 paulliu/nginx nginx -g "daemon off;"
在host主机查看容器的端口映射 docker port nginx1 80
在host主机运行命令 iptables -nat -L -n 可以看到在PREROUTING链中多了以下DNAT规则:
也就是在容器启动时通过 -p 80 将host主机192.168.0.200:32773映射为容器172.17.0.4:80。
注意:docker容器每次启动时获取的IP地址未必是一样的,而且 -p 80 是在host主机上随机选择一个端口号进行映射,每次启动的端口号也未必是一样的。但iptables中相关的规则是自动变更的。
在host主机运行 c localhost:32773 或者在其他主机运行 c 192.168.0.200:32773 结果如下:
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-come:
将容器以host模式运行
在Spring Cloud中配置IP访问
多网卡的情况
指定IP在某些场景下很有用,如某台有0、1和2三块网卡,但是1可以被其它的访问;如果Eureka 将0或者2注册到Eureka 上,其它微服务就无法通过这个IP调用该微服务的接口。
若在生产环境中使用,一般就不会直接使用IP注册到eureka注册中心了,由于生产环境通常由k8s集群或其他类似docker集群进行管理,因此一般会使用服务名等进行注册,由k8s再转发到具体的服务上。
参考链接:
Docker网络与Iptables浅析
了解 Docker 网络模式,Docker 如何作 iptables 以实现网络端口映射,使用 iptables 控制主机网络流量规则。
当 Docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。从 docker0 子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的 默认 。在主机上创建一对虚拟网卡 v pair 设备,Docker 将 v pair 设备的一端放在新创建的容器中,并命名为 0 (容器的网卡),另一端放在主机中,以 vxxx 这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。 bridge 模式是 docker 的默认网络模式,不写 –net 参数,就是 bridge 模式。使用 docker run -p 时,docker 实际是在 iptables 做了 DNAT 规则,实现端口转发功能。可以使用 iptables -vnL 查看。
如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个的 Network Namespace ,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
使用 none 模式,Docker 容器拥有自己的 Network Namespace,但是,并不为Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。
iptables 通过3个 chain(INPUT,FORWARD,OUTPUT)即可完成对网络流量的控制,其屏蔽了底层作 netfilter 的细节,常用案例:
使用 iptables -L 可以查看已设置的规则, iptables -D 可以删除规则,iptables 命令执行完是即时生效的,但是如果主机重启,已设置的规则就会丢失,这里可以使用 iptables-se 和 iptables-restore 。
iptables-se 将现有规则保存成文件,iptables-restore 从文件中恢复规则。
该命令执行后,docker 会在 iptables 自定义链 DOCKER 中定义转发规则,如果此时系统的 net.ipv4.ip_forward 为0,该命令执行完会提示:WARNING: IPv4 forwarding is disabled. Networking will not work,只需打开该配置就行了,无需重启容器。
此时查看 DOCKER 链可以看到添加了一条允许所有来源转发到6379端口的流量,用 redis-cli 也可以顺利连上,如果我们手动执行:
发现现在 redis-cli 连不上了~ 将命令中的 -I 换成 -D 删除即可。
开发中,经常会遇到容器里面放问宿主机的情况,除了使用 host.docker.internal 之外,还可以配置 extra_hosts 解决,因为 docker0 与 宿主机是相通的,直接用 ifconfig 查看宿主机 en0 网卡的ip地址,配置到 extra_hosts 即可,如:
iptables 在 centos 系列正在逐渐被 firewalld 替换,firewalld 底层也是作的 iptables ,在同时作这两个工具的时候就容易出现互相覆盖影响的情况,建议两个不要同时使用,使用其一即可。
云计算Docker网络使用
在容器中运行的网络应用,需要让外部可以访问这些应用,我们可以通过
参数来指定端口映射。
使用命令运行nginx,-P指令随机映射一个端口映射容器内部端口
我们使用 docker ps 或者 docker container ls 可以看到,宿主机的454端口被映射到了容器的80端口,此时通过访问宿主机的454就可以访问nginx默认页面
语法格式:
OPTIONS注解:
首先我们先将我们之前运行的容器全部删除
我们可以使用docker link链接容器,避免容器重启ip地址变化的问题
格式如下:
我们进入mycentos2容器
查看容器的hosts,发现了别名webcentos的ip地址
ping mycentos1 容器的ip别名 webcentos ,发现容器可以ping通
docker创建以后默认使用的是Linux的 桥连接 ,在宿主机上虚拟创建了一个容器 网桥 (docker0),使用 ip addr 查看
Docker每启动一个容器就会根据 docker0 的网段分配给容器一个IP地址,这个网桥docker0是所有容器的默认。因为宿主机内容器都使用网桥docker0,所以容器可以使用IP进行通信。
Docker就是很好的利用了Linux虚拟网络技术,在宿主机和容器内分别创建一个虚拟接口,实现他们彼此联通.
网络模式配置说明 bridge模式--net=bridge 默认使用 ,在docke的默认网桥docker0上为容器创建网络 none模式--net=none不配置网络,用于稍后进入容器,自行配置网络 container模式--net=container:name/id容器可以和应一个容器共享network namespace,k8s的pod使用此模式 hots模式--net=host容器和宿主机共享Network namespace 用户自定义--net=createnet用户使用network相关指令创建网络
Docker的container模式是指,创建容器的时候,使用--net=container:name/id,指定创建的容器和已经有的容器共享一个Network Namespace。
docker网络的host模式容器和宿主机共享Network namespace
默认选择bridge模式,容器启动后通过网桥docker0获取ip地址
我们首先使用 docker network 创建一个新的docker网络
-d指定docker的网络模型,有 bridge、overlay ,然后overlay网络模型使用的是Swarm mode。
使用ping来证明mycentos6容器和mycentos5可以相互链接
同理在mycentos5可以和mycentos5相互链接
docker network (三):容器中添加网络(指定固定IP)
docker network connect
真好,帮助命令已经给出用法了。 这个时候我运行一个镜像。
docker run -it alpine:latest sh
使用 ifconfig 命令,查看当前网络状态。
docker run -it --network test_network --ip 172.18.0.101 alpine:latest sh
windows 10 上怎么修改docker 的默认ip 192.168.99.100
1、手动设置;1)手动设置适用于电脑数量比较少、TCP/IP参数基本不变的情况,比如只有几台到十几台电脑。因为这种方法需要在联入网络的每台电脑上设置“默认”,非常费劲,一旦因为迁移等原因导致必须修改默认的IP地址,就会给网管带来很大的麻烦,所以不使用。
2)在Windows 中,设置默认的方法是在“网上邻居”上右击,在弹出的菜单中点击“属性”,在网络属性对话框中选择“TCP/IP协议”,点击“属性”,在“默认”选项卡中填写新的默认的IP地址就可以了。
3)需要特别注意的是:默认必须是电脑自己所在的网段中的IP地址,而不能填写其他网段中的IP地址。
docker 怎么为每个容器分配ip
要重新再获得被分配IP地址,可以在客户端主机的DOC下(在[开始]-[运行]里输入“cmd”或点击附件里的[命令提示符]就可以进入) 输入命令 ipconfig/release (释放掉你获得的IP)
然后 ipconfig/renew(重新到DHCP那里获得IP)
A类是第1段1-126,B类第1段是128-1,C类第1段就是192-223
A、B类被作为外网地址,C类被用做局域网地址。
你要连通外网后A、B类的都是网络经营商拥有的,你得花钱租的。
DHCP有一定的记忆性,如果只连一台计算机,肯定经常出现总分配同1个地址,或不多的地址,以求网络的稳定,并节省消耗。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。