docker容器访问宿主机,docker从容器中怎么访问宿主机
本篇文章给大家谈谈docker容器访问宿主机,以及docker从容器中怎么访问宿主机对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
docker从容器中怎么访问宿主机
例如你的docker环境的虚拟IP是192.168.99.100,那么宿主机同样会托管一个和192.168.99.100同网段的虚拟IP,并且会是主IP:192.168.99.1,那么就简单了,在容器中访问192.168.99.1这个地址就等于访问宿主机。
注意,通过192.168.99.1访问宿主机,等于换了一个ip,如果数据库或中间件限制了本机访问或者做了ip段限制,要记得添加192.168.99.1到白名单。
Docker容器运行的时候有 host、 bridge、 none三种网络可供配置。默认是 bridge,即桥接网络,以桥接模式连接到宿主机; host是宿主网络,即与宿主机共用网络; none则表示无网络,容器将无法联网。
当容器使用 host网络时,容器与宿主共用网络,这样就能在容器中访问宿主机网络,那么容器的 localhost就是宿主机的 localhost。
扩展资料
宿主机和容器通信原理的问题:
考虑重启速度:在实际的运维过程中,部分场景下,会出现主机卡死,或者docker进程卡死,这时,最快恢复业务的方法是重启主机。
容器在主机重启后,可以自动恢复,因此可以做到在1到2分钟内快速恢复业务。这一点太重要了,物理机重启由于需要做各种硬件检测,重启时间一般在5到10分钟,虚拟机重启一般在1分钟以内,物理机显然无法满足需求。
重建能力很重要:
容器平台经常需要更新操作系统,或者根据需要调整主机规格。
运行一段时间后,发现内存配置偏少了,需要添加内存。这时候申请一台新的机器加入到集群中,将旧机器下线即可。
运行多年的 ubuntu 12.04官方已经不再维护,需要全量替换,工作量相当大。好的方法就是使用全新的服务器替换旧服务器。
当发生故障,主机无法恢复时,直接申请新服务器加入集群即可。
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
在使用weave之前,你需要在所有宿主机上安装Docker环境,参考这些教程,在Ubuntu或CentOS/Fedora发行版中安装Docker。Docker环境部署完成后,使用下面的命令安装weave:$wget/zettio/weave/releases/download/latest_release/weave$chmoda+xweave$sudocpweave/usr/local/bin注意你的PATH环境变量要包含/usr/local/bin这个路径,请在/etc/profile文件中加入一行(LCTT译注:要使环境变量生效,你需要执行这个命令:source/etc/profile):exportPATH="$PATH:/usr/local/bin"在每台宿主机上重复上面的操作。Weave在TCP和UDP上都使用6783端口,如果你的系统开启了防火墙,请确保这两个端口不会被防火墙挡住。在每台宿主机上启动Weave路由器当你想要让处于在不同宿主机上的容器能够互相通信,第一步要做的就是在每台宿主机上启动weave路由器。第一台宿主机,运行下面的命令,就会创建并开启一个weave路由器容器(LCTT译注:前面说过了,weave路由器也是一个容器):$sudoweavelaunch第一次运行这个命令的时候,它会下载一个weave镜像,这会花一些时间。下载完成后就会自动运行这个镜像。成功启动后,终端会输出这个weave路由器的ID号。下面的命令用于查看路由器状态:$sudoweavestatus第一个weave路由器就绪了,目前为止整个peer对等网络中只有一个peer成员。你也可以使用docker的命令来查看weave路由器的状态:$dockerps第二台宿主机部署步骤稍微有点不同,我们需要为这台宿主机的weave路由器指定第一台宿主机的IP地址,命令如下:$sudoweavelaunch当你查看路由器状态,你会看到两个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:~$sudoweaverun10.0.0.1/24-t-iubuntu成功运行后,终端会显示出容器的ID号。你可以使用这个ID来访问这个容器:hostA:~$dockerattach在宿主机hostB上,也创建一个Ubuntu容器,IP地址为10.0.0.2:hostB:~$sudoweaverun10.0.0.2/24-t-iubuntu访问下这个容器的控制台:hostB:~$dockerattach这两个容器能够互相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会自动帮你维护这些网络,并将这两个网络互相隔离。另外,你可以灵活地将一个容器从一个网络移到另一个网络而不需要重启容器。举个例子:首先开启一个容器,运行在10.0.0.0/24网络上:$sudoweaverun10.0.0.2/24-t-iubuntu然后让它脱离这个网络:$sudoweavedetach10.0.0.2/24最后将它加入到10.10.0.0/24网络中:$sudoweaveattach10.10.0.2/24现在这个容器可以与10.10.0.0/24网络上的其它容器进行通信了。这在当你创建一个容器而网络信息还不确定时就很有帮助了。将weave网络与宿主机网络整合起来有时候你想让虚拟网络中的容器能访问物理主机的网络。或者相反,宿主机需要访问容器。为满足这个功能,weave允许虚拟网络与宿主机网络整合。举个例子,在宿主机hostA上一个容器运行在10.0.0.0/24中,运行使用下面的命令:hostA:~$sudoweaveexpose10.0.0.100/24这个命令把IP地址10.0.0.100分配给宿主机hostA,这样一来宿主机hostA也连到了10.0.0.0/24网络上了。显然,你在为宿主机选择IP地址的时候,需要选一个没有被其他容器使用的地址。现在hostA就可以访问10.0.0.0/24上的所有容器了,不管这些容器是否位于hostA上。好巧妙的设定啊,32个赞!
好了,关于docker容器访问宿主机和docker从容器中怎么访问宿主机的问题到这里结束啦,希望可以解决您的问题哈!