如何查看网络ip地址容器的IP地址和网络相关的参数

请问,如何在docker中设置容器的固定ip地址,而且重启容器后,ip地址不变,有什么方法呢?
1.公司业务需要,假设前台使用多个容器跑的是apache服务,后台使用的db容器,现在的问题是前台访问后台是通过访问后台的ip地址来实现访问,如果后台的容器一旦重启,那么容器的ip地址就会改变,不好管理
按投票排序
启动前端容器的时候加--link参数,指定关联后端容器,这样就会在你前端机器上增加本地hosts配置,所以你的前端应用中只要配置域名而不是IP就好了。更好的做法是把整个前后端的配置用docker compose管理起来。
我记得docker可以用桥接网卡吧
不推荐使用固定IP,两个容器之间是可以建立link。参见:是
提到的-link参数
你可以不用容器ip的比如映射到host ip的某個固定端口, 或者直接在host的文件系統中開個socket
你需要一个服务发现中间件 比如 etcd, zk
我觉得可以在容器启动的时候执行一个脚本,通过脚本来配置IP
已有帐号?
无法登录?
社交帐号登录7,968&人围观
前文已经对进行构建,本文主要通过实验验证Docker的bridge网络模式在宿主机内的容器间通信和利用Open vSwitch和Docker的none网络模式实现跨宿主机间的容器通信,从而加深对Docker容器间网络通信的理解。
2 环境准备
2.1 操作系统
root@ubuntu:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.1 LTS
Release: 14.04
Codename: trusty
root@ubuntu:~# lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 14.04.1 LTSRelease: 14.04Codename: trusty
注:建议在Ubuntu14.04.1做下面的实验,在Ubuntu12.04.5下安装使用Docker时比较麻烦。
2.2 主要组件
用于完成下面实验的相关组件。
2.2.1 Docker1.4
使用最新版本Docker1.4
安装方法(以下安装使用均在root用户权限下完成):
apt-get update
apt-get install docker.io
source /etc/bash_completion.d/docker.io
apt-key adv --keyserver hkp://:80 --recv-keys 36A1D0F966E92DD21E9
sh -c "echo deb /ubuntu docker main\
& /etc/apt/sources.list.d/docker.list"
apt-get update
apt-get install lxc-docker
apt-get update apt-get install docker.io source /etc/bash_completion.d/docker.io apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D0F966E92DD21E9 sh -c "echo deb https://get.docker.com/ubuntu docker main\ & /etc/apt/sources.list.d/docker.list" apt-get update apt-get install lxc-docker
2.2.2 Open vswitch2.3.0
使用最新版本的openvswitch2.3.0
安装方法:
1.自行获取官网的包
2.开始安装
./configure --with-linux=/lib/modules/`uname -r`/build 2&/dev/null
Make install
make modules_install
/sbin/modprobe openvswitch
mkdir -p /usr/local/etc/openvswitch
ovsdb-tool create /usr/local/etc/openvswitch/conf.db
vswitchd/vswitch.ovsschema
ovsdb-server
--remote=punix:/usr/local/var/run/openvswitch/db.sock \
--remote=db:Open_vSwitch,Open_vSwitch,manager_options \
--private-key=db:Open_vSwitch,SSL,private_key \
--certificate=db:Open_vSwitch,SSL,certificate \
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
--pidfile --detach
ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach
12345678910111213141516
./configure --with-linux=/lib/modules/`uname -r`/build 2&/dev/null&&Make&&Make install&&make modules_install&&/sbin/modprobe openvswitch&&mkdir -p /usr/local/etc/openvswitch&&ovsdb-tool create /usr/local/etc/openvswitch/conf.db&&vswitchd/vswitch.ovsschema&&ovsdb-server&&--remote=punix:/usr/local/var/run/openvswitch/db.sock \&&&&&&&&&&&&&&&& --remote=db:Open_vSwitch,Open_vSwitch,manager_options \&&&&&&&&&&&&&&&& --private-key=db:Open_vSwitch,SSL,private_key \&&&&&&&&&&&&&&&& --certificate=db:Open_vSwitch,SSL,certificate \&&&&&&&&&&&&&&&& --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \&&&&&&&&&&&&&&&& --pidfile --detachovs-vsctl --no-wait initovs-vswitchd --pidfile --detach
2.3 ovs-docker
Docker公司开发的一款开源的工具脚本,用于简化操作ovs和Docker之间关联使用。类似工具还有pipwork。
wget /openvswitch/ovs/raw/master/utilities/ovs-docker
chmod a+x ovs-docker
wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-dockerchmod a+x ovs-docker
安装pipework
git clone /jpetazzo/pipework
cp ~/pipework/pipework /usr/local/bin/
git clone https://github.com/jpetazzo/pipeworkcp ~/pipework/pipework /usr/local/bin/
3.1 宿主机内容器通信
Docker在启动容器时,如果不指定网络模式选项时,会创建名docker0的虚拟网桥,通过该网桥实现与宿主机之间的通信。
3.1.1 实验目的
验证在一个宿主机内部,容器1与容器2之间如何通信。
3.1.2 实验拓扑
3.1.3 实验方法
假设你已经有Ubuntu14的镜像,如果没有可以通过docker pull ubuntu:latest下载一个。
1.启动容器c1:
docker run -t -i --name c1 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash
docker run -t -i --name c1 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash
2.查看Docker默认的网桥分配的网卡信息
3. 启动容器c2,并关联容器c1,link的别名为c2-c1
sudo docker run -t -i --name c2 --link c1:c2-c1 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash
sudo docker run -t -i --name c2 --link c1:c2-c1 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash
4.验证在容器c2中 ping容器c1的ip,可以互通
在容器c2中,发现其/etc/hosts文件中写入了与c1的连接信息c2-c1:
5. Ping外网实验
在容器c2中可直接ping 外网,因为docker0作为各个容器的默认网关,通过地址转换所有的数据包都被转发到宿主机的etho网卡出去了。
3.2 跨宿主机容器通信
3.2.1 实验目的
验证利用openvswitch的桥接+gre隧道实现容器间的跨宿主机通信。
3.2.2 实验拓扑
3.2.3 实验方法
在主机host2上192.168.5.73,做如下配置:
ovs-vsctl add-br tech-br
ovs-vsctl add-port tech-br tep0 -- set interface tep0 type=internal
ifconfig tep0 192.168.1.1 netmask 255.255.255.0
ovs-vsctl add-br sdn-br0
ovs-vsctl set bridge sdn-br0 stp_enable=true
ovs-vsctl add-port sdn-br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.5.31
ovs-vsctl add-br tech-brovs-vsctl add-port tech-br tep0 -- set interface tep0 type=internalifconfig tep0 192.168.1.1 netmask 255.255.255.0ovs-vsctl add-br sdn-br0ovs-vsctl set bridge sdn-br0 stp_enable=trueovs-vsctl add-port sdn-br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.5.31
2.启动容器c3
docker run -t -i --name c3 --net=none --privileged=true ubuntu:latest /bin/bash
docker run -t -i --name c3 --net=none --privileged=true ubuntu:latest /bin/bash
默认没有分配ip信息:
分配容器c3的网络ip,建立sdn-br0和容器的映射:
pipework sdn-br0 fb700ea8.0.3/24
pipework sdn-br0 fb700ea73293 192.168.0.3/24
3.启动容器c4
docker run -t -i --name c4 --net=none --privileged=true ubuntu:latest /bin/bash
docker run -t -i --name c4 --net=none --privileged=true ubuntu:latest /bin/bash
pipework sdn-br0 75 192.168.0.4/24
pipework sdn-br0 75 192.168.0.4/24
4.在主机host1配置192.168.5.31,通主机host2方法一样
ovs-vsctl add-br tech-br
ovs-vsctl add-port tech-br tep0 -- set interface tep0 type=internal
ifconfig tep0 192.168.1.2 netmask 255.255.255.0
ovs-vsctl add-br sdn-br0
ovs-vsctl set bridge sdn-br0 stp_enable=true
ovs-vsctl add-port sdn-br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.5.73
docker run -t -i --name c1 --net=none --privileged=true 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash
docker run -t -i --name c2 --net=none --privileged=true 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash
ovs-vsctl add-br tech-brovs-vsctl add-port tech-br tep0 -- set interface tep0 type=internalifconfig tep0 192.168.1.2 netmask 255.255.255.0ovs-vsctl add-br sdn-br0ovs-vsctl set bridge sdn-br0 stp_enable=trueovs-vsctl add-port sdn-br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.5.73docker run -t -i --name c1 --net=none --privileged=true 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bashdocker run -t -i --name c2 --net=none --privileged=true 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash
pipework sdn-br0 441ce7ecf5cf 192.168.0.2/24
pipework sdn-br0 d341b.168.0.1/24
pipework sdn-br0 441ce7ecf5cf 192.168.0.2/24pipework sdn-br0 d341b3915d29 192.168.0.1/24
5.验证结果
容器2:192.168.0.2分别ping容器1,容器3,容器4均可通。
6.使用SDN控制器Floodlight管理上面的Docker容器集群
在主机host1上的sdn-br0设置连接控制器:
ovs-vsctl set-controller sdn-br0 tcp:192.168.5.31:6633
ovs-vsctl set-controller sdn-br0 tcp:192.168.5.31:6633
在容器做互ping操作,可让floodlight拓扑发现这些容器,最终SDN控制器完全能够发现这些容器,如下图:
在实验1中,通过指定docker --link选项实现两个容器间的通信,其本质是利用linux的iptable为两个容器添加一条ACCEPT规则。在实验2中,需要特别说明的是主机host2即192.168.5.73是VMWare虚拟出来的的一个主机,由此可证明,Docker完全可以提供跨云、跨主机的通信。并且笔者也通过Open vSwitch的VXLAN打通跨主机的容器通信。
最后也验证了通过SDN控制器来管控Docker容器集群,这一点给大家的想象空间更大,在Docker的性能完胜KVM的情况下,通过容器将来可以做出更炫的APP,从另一个方面也证明了无论是IASS还是PASS,SDN都有其用武之地。
本站声明:本站原创文章仅代表作者观点,不代表SDNLAB立场。转载须注明来自 并附上本文链接。
本文链接:
本文标签:
请后才可以评论
要想完成POF交换机的二次开发和拓展,有必…
本篇文章为大家介绍OPNFV的最新版本Brahma…
文系SDN撕X群分享整理而成,分享者Arista…
本文介绍了如何使用Open vSwitch为Docker …
本文系SDN实战团微信群组织的线上技术分享…
微信公众号:搜索"SDNLAB"或扫描上面的二维码。
没有帐号?中国领先的IT技术网站
51CTO旗下网站
容器网络方面的挑战和要求
Docker网络模型在满足企业要求方面不尽如人意。以下是容器网络方面需要考虑的几大方面。
作者:布加迪编译来源:| 09:45
在最近于加拿大温哥华召开的OpenStack峰会上,6000多名与会人士接受了使用容器情况方面的调查。被问及是否在生产环境中有容器时,台下一小部分听众举手示意DD据我估计大概有5%。但是被问及谁在接下来几年考虑将容器迁移到生产环境时,几乎人人都举手。
这一幕生动地表明,虽然容器是一项现处于早期阶段的技术,但众多企业组织为它制定了宏伟计划。由于Docker和Kubernetes等多种选择,用户们在认真考虑自己的选择道路。容器提供了几个明显的优势:简化和加快了应用程序的部署、可移植性以及占用少量的资源,但是也存在风险。
一大风险就是整合。开源社区正在考虑如何将容器整合到现有的云和自动化框架当中,比如Magnum和几个OpenStack项目。另一个问题就是容器网络。用户们常常问我如何设计一套同时支持容器和虚拟机的网络解决方案。虚拟机和容器(以及部署的裸机系统)通常带来了全然不同的网络模型。
不妨后退一步,考虑一下如今的容器网络是如何工作的。容器网络基于一种简单的架构,主要是单主机解决方案。比如说,Docker网络模型基于几个简单的假定:
&它充分利用与容器相连接的本地(每个主机里面的)Linux网桥。
&每个计算节点都有集群看得见的IP地址。
&每个容器都有集群看不见的专有的IP地址。
&网络地址转换(NAT)协议用来将容器的专有IP地址绑定至计算节点的公共IP地址。
&此外,负载均衡系统可用来将服务映射至一组IP地址和端口。
&iptable用于应用程序与租户之间的网络分段和隔离。
如果运用到容器网络上,这种模型在许多方面显得不尽如人意。它限制了用容器构建的多租户云解决方案跨多个主机进行扩展的功能。高可用性方面的配置很有限。无论工作负载的移动性如何,一致的连接性和安全性也成问题。另外,iptable和NAT的结合使用限制了可扩展性和性能,这让使用容器的主要优势之一荡然无存。
那么,面向容器的网络解决方案应该提供什么呢?另外,你又该如何评估解决方案与特定应用程序的契合度?我们不妨把这分成三个问题;这些答案应该可以帮助你更深入地了解容器网络方面的独特之处。
1. 你会在基于容器的基础设施上运行哪种类型的应用程序?
这直接影响到你网络基础设施的蓝图以及如何构建网络基础设施。你的应用程序需要丰富的网络拓扑结构以及高级服务吗?它们是多租户模式,还是简单的&扁平网络&就足以胜任?
面向容器的虚拟网络解决方案让最终用户(租户)和云操作人员都可以定义并控制各自的网络要求。解决方案还必须提供跨多个物理主机的微分段(micro-segmentation)和隔离所需要的构件。
2. 性能和可扩展性方面的要求是什么?
你在思考这个问题时,要考虑基础设施上应用程序的要求。应当考虑这样的解决方案:在一种完全分布式的架构中提供隔离和网络功能,从而为你应用程序的发展和扩展铺平道路。随着部署的云越来越庞大,网络解决方案应该跨多个物理主机向外扩展,还应该在云编排框架里面紧密地整合起来。
3. 你需要将容器与虚拟机和裸机工作负载互联起来吗?
大多数应用程序需要用容器支持混合工作负载,所以要寻求同时支持两者的解决方案。一致的抽象模型(网络、子网、路由器、接口和浮动IP地址)和一套用于配置和自动化的一致的API,是完成这项工作的方法。
云用户呼吁面向任何工作负载的网络模型与功能强大的网络抽象结合起来,从而简化容器到容器的联系,并且增添先进的网络功能和微分段。
你在网络和容器方面有什么样的挑战和要求?欢迎留言交流!
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
专题专题专题专题专题
24H热文一周话题本月最赞
讲师:5人学习过
讲师:29人学习过
讲师:5人学习过
精选博文论坛热帖下载排行
本书是目前中文版本第一个真正介绍PHP 5及MySQL 5新增语法与功能的权威宝典!
本书本着精、全、要三宗旨,从理论中延伸,从实践中深入,详...
订阅51CTO邮刊如何在 Docker 容器之间设置网络
收藏: &&&&
你也许已经知道了,Docker 容器技术是现有的成熟虚拟化技术的一个替代方案。它被企业应用在越来越多的领域中,比如快速部署环境、简化基础设施的配置流程、多客户环境间的互相隔离等等。当你开始在真实的生产环境使用 Docker 容器去部署应用沙箱时,你可能需要用到多个容器部署一套复杂的多层应用系统,其中每个容器负责一个特定的功能(例如负载均衡、LAMP 栈、数据库、UI 等)。
那么问题来了:有多台宿主机,我们事先不知道会在哪台宿主机上创建容器,如果保证在这些宿主机上创建的容器们可以互相联网?
联网技术哪家强?开源方案找 。这个工具可以为你省下不少烦恼。听我的准没错,谁用谁知道。
于是本教程的主题就变成了&如何使用 weave 在不同主机上的 Docker 容器之间设置网络&。
Weave 是如何工作的
让我们先来看看 weave 怎么工作:先创建一个由多个 peer 组成的对等网络,每个 peer 是一个虚拟路由器容器,叫做&weave 路由器&,它们分布在不同的宿主机上。这个对等网络的每个 peer 之间会维持一个 TCP 链接,用于互相交换拓扑信息,它们也会建立 UDP 链接用于容器间通信。一个 weave 路由器通过桥接技术连接到本宿主机上的其他容器。当处于不同宿主机上的两个容器想要通信,一台宿主机上的 weave 路由器通过网桥截获数据包,使用 UDP 协议封装后发给另一台宿主机上的 weave 路由器。
每个 weave 路由器会刷新整个对等网络的拓扑信息,可以称作容器的 MAC 地址(如同交换机的 MAC 地址学习一样获取其他容器的 MAC 地址),因此它可以决定数据包的下一跳是往哪个容器的。weave 能让两个处于不同宿主机的容器进行通信,只要这两台宿主机在 weave 拓扑结构内连到同一个 weave 路由器。另外,weave 路由器还能使用公钥加密技术将 TCP 和 UDP 数据包进行加密。
在使用 weave 之前,你需要在所有宿主机上安装
环境,参考,在 &或 &发行版中安装 Docker。
Docker 环境部署完成后,使用下面的命令安装 weave:
$ wget /zettio/weave/releases/download/latest_release/weave
$ chmod a+x weave
$ sudo cp weave /usr/local/bin
注意你的 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 会自动帮你维护这些网络,并将这两个网络互相隔离。另外,你可以灵活地将一个容器从一个网络移到另一个网络而不需要重启容器。举个例子:
首先开启一个容器,运行在 10.0.0.0/24 网络上:
$ sudo weave run 10.0.0.2/24 -t -i ubuntu
然后让它脱离这个网络:
$ sudo weave detach 10.0.0.2/24 &container-id&
最后将它加入到 10.10.0.0/24 网络中:
$ sudo weave attach 10.10.0.2/24 &container-id&
现在这个容器可以与 10.10.0.0/24 网络上的其它容器进行通信了。这在当你创建一个容器而网络信息还不确定时就很有帮助了。
将 weave 网络与宿主机网络整合起来
有时候你想让虚拟网络中的容器能访问物理主机的网络。或者相反,宿主机需要访问容器。为满足这个功能,weave 允许虚拟网络与宿主机网络整合。
举个例子,在宿主机 hostA 上一个容器运行在 10.0.0.0/24 中,运行使用下面的命令:
hostA:~$ sudo weave expose 10.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 个赞!
如你所见,weave 是一个很有用的 docker 网络配置工具。这个教程只是它的冰山一角。如果你想进一步玩玩,你可以试试它的以下功能:多跳路由功能,这个在 multi-cloud 环境(LCTT 译注:多云,企业使用多个不同的云服务提供商的产品,比如 IaaS 和 SaaS,来承载不同的业务)下还是很有用的;动态重路由功能是一个很巧妙的容错技术;或者它的分布式 DNS 服务,它允许你为你的容器命名。如果你决定使用这个好东西,欢迎分享你的使用心得。
作者: 译者: 校对:
原创翻译, 荣誉推出
上一篇:下一篇:
分享到微信朋友圈
打开微信,点击底部的“发现”,
使用“扫一扫”将网页分享至朋友圈。
请将我们加入您的广告过滤器的白名单,请支持开源站点。谢谢您。

我要回帖

更多关于 怎么查看网络的ip地址 的文章

 

随机推荐