每个docker 固定ip都由一个ip吗

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
【编者的话】 本文是《Docker网络及服务发现》一书的一个章节,介绍了搭建Docker单主机网络的基础内容。关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节。
当你开始大规模使用Docker时,你会发现需要了解很多关于网络的知识。作为Docker网络的一篇介绍,我们将从头开始,然后开始讨论如何管理容器间的连接。Docker容器需要运行在一台宿主机上,可以是一台物理机(on-premise数据中心中的裸金属服务器),也可以是on-prem或云上的一台虚拟机。就像下图中描述的那样,宿主机上运行了Docker的daemon进程和客户端,一方面可以与Docker registry交互,另一方面可以启动、关闭和审查容器。
图1 简单的Docker架构(单主机)
宿主机和容器的关系是1:N,这意味着一台宿主机上可以运行多个容器。例如,从Facebook的报告来看,取决于机器的能力,每台宿主机上平均可以运行10到40个容器。另一个数据是:在Mesosphere,我们发现,在裸金属服务器上的各种负载测试中,每台宿主机上不超过250个容器是可能的。
无论你是在单主机上进行部署,还是在集群上部署,你总得和网络打交道:
对于大多数单主机部署来说,问题归结于是使用共享卷进行数据交换,还是使用网络(基于HTTP或者其他的)进行数据交换。尽管Docker数据卷很容易使用,但也引入了紧耦合,这意味着很难将单主机部署转化为多主机部署。自然地,共享卷的优势是速度。在多主机部署中,你需要考虑两个方面:单主机上的容器之间如何通信和多主机之间的通信路径是怎样的。性能考量和安全方面都有可能影响你的设计决定。多主机部署通常是很有必要的,原因是单主机的能力有限(请看前面关于宿主机上容器的平均数量和最大数量的讨论),也可能是因为需要部署分布式系统,例如Apache Spark、HDFS和Cassandra。
分布式系统和数据本地化(Distributed Systems and Data Locality)
使用分布式系统(计算或存储)的基本想法是想从并行处理中获利,通常伴随着数据本地化。数据本地化,我指的是将代码转移到数据所在地的原则,而不是传统的、其他的方式。考虑以下的场景:如果你的数据集是TB级的,而代码是MB级的,那么在集群中移动代码比传输TB级数据更高效。除了可以并行处理数据之外,分布式系统还可以提供容错性,因为系统中的一部分可以相对独立地工作。简单地说,Docker网络是原生的容器SDN解决方案。总而言之,Docker网络有四种模式:桥模式,主机模式,容器模式和无网络模式。我们会详细地讨论单主机上的各种网络模式,在本章的最后,我们还会讨论一些常规主题,比如安全。
bridge模式网络在该模式(见下图)中,Docker守护进程创建了一个虚拟以太网桥docker0,附加在其上的任何网卡之间都能自动转发数据包。默认情况下,守护进程会创建一对对等接口,将其中一个接口设置为容器的eth0接口,另一个接口放置在宿主机的命名空间中,从而将宿主机上的所有容器都连接到这个内部网络上。同时,守护进程还会从网桥的私有地址空间中分配一个IP地址和子网给该容器。
$&docker&run&-d&-P&--net=bridge&nginx:1.9.1
$&docker&ps
CONTAINER&ID&&&IMAGE&&&&&&&&&&&&&&&&&&COMMAND&&&&CREATED
STATUS&&&&&&&&&PORTS&&&&&&&&&&&&&&&&&&NAMES
17d447b7425d&&&nginx:1.9.1&&&&&&&&&&&&nginx&-g&&&19&seconds&ago
Up&18&seconds&&0.0.0.0:4/tcp,
&&&&&&&&&&&&&&&&&&&&&&&&&&0.0.0.0:49154-&80/tcp&&trusting_feynman
因为bridge模式是Docker的默认设置,所以你也可以使用docker run -d -P
nginx:1.9.1。如果你没有使用-P(发布该容器暴露的所有端口)或者-p
host_port:container_port(发布某个特定端口),IP数据包就不能从宿主机之外路由到容器中。
图2 bridge模式网络设置
host模式网络该模式将禁用Docker容器的网络隔离。因为容器共享了宿主机的网络命名空间,直接暴露在公共网络中。因此,你需要通过端口映射(port mapping)来进行协调。
$&docker&run&-d&--net=host&ubuntu:14.04&tail&-f&/dev/null
$&ip&addr&|&grep&-A&2&eth0:
2:&eth0:&&BROADCAST,MULTICAST,UP,LOWER_UP&&mtu&9001&qdisc&mq&state&UP&group&default&qlen&1000
link/ether&06:58:2b:07:d5:f3&brd&ff:ff:ff:ff:ff:ff
inet&**10.0.7.197**/22&brd&10.0.7.255&scope&global&dynamic&eth0
$&docker&ps
CONTAINER&ID&&IMAGE&&&&&&&&&COMMAND&&CREATED
STATUS&&&&&&&&PORTS&&&&&&&&&NAMES
b44d7d5d3903&&ubuntu:14.04&&tail&-f&&2&seconds&ago
Up&2&seconds&&&&&&&&&&&&&&&&jovial_blackwell
$&docker&exec&-it&b44d7d5d3903&ip&addr
2:&eth0:&&BROADCAST,MULTICAST,UP,LOWER_UP&&mtu&9001&qdisc&mq&state&UP&group&default&qlen&1000
link/ether&06:58:2b:07:d5:f3&brd&ff:ff:ff:ff:ff:ff
inet&**10.0.7.197**/22&brd&10.0.7.255&scope&global&dynamic&eth0
我们可以从上例中看到:容器和宿主机具有相同的IP地址10.0.7.197。
在下图中,我们可以看到:当使用host模式网络时,容器实际上继承了宿主机的IP地址。该模式比bridge模式更快(因为没有路由开销),但是它将容器直接暴露在公共网络中,是有安全隐患的。
图3 host模式网络设置
container模式网络该模式会重用另一个容器的网络命名空间。通常来说,当你想要自定义网络栈时,该模式是很有用的。实际上,该模式也是Kubernetes使用的网络模式。
$&docker&run&-d&-P&--net=bridge&nginx:1.9.1
$&docker&ps
CONTAINER&ID&&IMAGE&&&&&&&&COMMAND&&&CREATED&&&&&&&&&STATUS
PORTS&&&&&&&&&&&&&&&&&&&&&&NAMES
eb1&&nginx:1.9.1&&nginx&-g&&3&minutes&ago&&&Up&3&minutes
0.0.0.0:32769-&80/tcp,
0.0.0.0:3/tcp&&&&&admiring_engelbart
$&docker&exec&-it&admiring_engelbart&ip&addr
8:&eth0@if9:&&BROADCAST,MULTICAST,UP,LOWER_UP&&mtu&9001&qdisc&noqueue&state&UP&group&default
link/ether&02:42:ac:11:00:03&brd&ff:ff:ff:ff:ff:ff
inet&**172.17.0.3**/16&scope&global&eth0
$&docker&run&-it&--net=container:admiring_engelbart&ubuntu:14.04&ip&addr
8:&eth0@if9:&&BROADCAST,MULTICAST,UP,LOWER_UP&&mtu&9001&qdisc&noqueue&state&UP&group&default
link/ether&02:42:ac:11:00:03&brd&ff:ff:ff:ff:ff:ff
inet&**172.17.0.3**/16&scope&global&eth0
结果(上面的例子)显示:第二个容器使用了--net=container参数,因此和第一个容器admiring_engelbart具有相同的IP地址172.17.0.3。
none模式网络该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务);你希望自定义网络,在第3章中有很多选项使用了该模式。
$&docker&run&-d&-P&--net=none&nginx:1.9.1
$&docker&ps
CONTAINER&ID&&IMAGE&&&&&&&&&&COMMAND&&&CREATED
STATUS&&&&&&&&PORTS&&&&&&&&&&NAMES
d8c26d68037c&&nginx:1.9.1&&&&nginx&-g&&2&minutes&ago
Up&2&minutes&&&&&&&&&&&&&&&&&grave_perlman
$&&docker&inspect&d8c26d68037c&|&grep&IPAddress
&IPAddress&:&&&,
&SecondaryIPAddresses&:&null,
在上面的例子中可以看到,恰如我们所料,网络没有任何配置。
你可以在中读到更多关于Docker网络的配置。
本书中的所有Docker命令都是在CoreOS环境中执行的,Docker客户端和服务端的版本都是1.7.1。更多话题在本章中,我们了解了Docker单主机网络的四种基本模式。现在我们讨论下你应该了解的其他主题(这与多主机部署也是相关的):
分配IP地址
频繁大量的创建和销毁容器时,手动分配IP地址是不能接受的。bridge模式可以在一定程度上解决这个问题。为了防止本地网络上的ARP冲突,Docker Daemon会根据分配的IP地址生成一个随机地MAC地址。在下一章中,我们会再次讨论分配地址的挑战。分配端口
你会发现有两大阵营:固定端口分配(fixed-port-allocation)和动态端口分配(dynamically-port-allocation)。每个服务或者应用可以有各自的分配方法,也可以是作为全局的策略,但是你必须做出自己的判断和决定。请记住,bridge模式中,Docker会自动分配UDP或TCP端口,并使其可路由。网络安全
Docker可以开启容器间通信(意味着默认配置--icc=true),也就是说,宿主机上的所有容器可以不受任何限制地相互通信,这可能导致拒绝服务攻击。进一步地,Docker可以通过--ip_forward和--iptables两个选项控制容器间、容器和外部世界的通信。你应该了解这些选项的默认值,并让网络组根据公司策略设置Docker进程。可以读一下StackEngine的Boyd Hemphill写的文章Docker security analysis。
另一个网络安全方面是线上加密(on-the-wire encryption),通常是指中定义的TLS/SSL。注意,在写本书时,这一方面还很少被讨论,实际上,只有两个系统(下一章会详细讨论)提供了这个特性:Weave使用,OpenVPN是基于TLS的。根据我从Docker的安全负责人Diogo Mónica那里了解的情况,v1.9之后可能加入线上加密功能。
最后,可以读一下Adrian Mouat的Using Docker,其中详细地介绍了网络安全方面。
自动Docker安全检查
为了对部署在生产环境中的Docker容器进行安全检查,我强烈建议使用。原文链接:(翻译:夏彬)
这个文章是不是老了,现在docker好像有别的网络模式了
要回复文章请先或您所在的位置: &
运维人员的解放----Docker快速部署
运维人员的解放----Docker快速部署
Docker是一个用了一种新颖方式实现的超轻量虚拟机,在实现的原理和应用上还是和VM有巨大差别,专业的叫法是应用容器(Application Container)
Docker是一个用了一种新颖方式实现的超轻量虚拟机,在实现的原理和应用上还是和VM有巨大差别,专业的叫法是应用容器(Application Container)。(我个人还是喜欢称虚拟机)
Docker应用容器相对于 VM 有以下几个优点:
启动速度快,容器通常在一秒内可以启动,而 VM 通常要更久
资源利用率高,一台普通PC 可以跑上千个容器,你跑上千个 VM 试试
性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源
因为VM 的 Hypervisor 需要实现对硬件的虚拟化,并且还要搭载自己的操作系统,自然在启动速度和资源利用率以及性能上有比较大的开销。
个人体会较深的两处优点:
1、快速部署,传统的部署模式是:安装(包管理工具或者源码包编译)-&配置-&运行;Docker的部署模式是:复制-&运行。
2、可以保证线上与测试环境一致,计划以后上线就直接复制测试使用的docker容器)
什么是docker?
为什么你应该关注docker?
1、docker安装
debian7安装docker
参考地址:
echo&deb&http://get.docker.io/ubuntu&docker&main&|&sudo&tee/etc/apt/sources.list.d/docker.list &sudo&apt-key&adv&--keyserver&&--recv-keys&36A1D0F966E92DD21E9 &sudo&apt-get&update &sudo&apt-get&install&-y&lxc-docker&
#四行命令,Docker就安装好了。下面创建一个ubuntu虚拟系统:
docker&pull&ubuntu&#此处是从官网拉取名为ubuntu的image,也可手动在https://index.docker.io上搜索想要的镜像。 &docker&run&-i&-t&ubuntu&/bin/bash&#创建一个容器,-t是临时终端。&
ubuntu12.04、windows、macOS安装docker
参考docker中文文档
2、docker使用过程实践
2.1 在测试机启动容器,安装ssh
docker&run&-i&-t&ubuntu&/bin/bash&#此方式运行的容器,退出后容器就会关闭。 &apt-get&install&openssh-server&#安装ssh &#需要修改/etc/sshd/sshd_config文件中内容 &PermitRootLogin&yes &UsePAM&no&
2.2启动ssh,容器以后台方式运行
docker&run&-d&-p&50001:22&容器id&/usr/sbin/sshd-D &#容器id可通过&docker&ps-a查看,最上面的为最新的。&
2.3 通过ssh连接到容器安装软件
ssh&root@127.0.0.1-p&50001 &#连上后想装什么就装什么,可使用exit退出容器,但后台还会运行。&
2.4 服务安装完成后,停止容器。
docker&stop&容器id&#停止运行的容器&
2.5 把容器提交生成最新的镜像
docker&commit&容器id&debian02&#把这个容器提交生成新的debian02镜像(该镜像是原始镜像与容器的整合)&
2.6 打包镜像
docker&save&debian02&/root/debian02.tar&#debian02镜像打包&
2.7 在另外的机器上导入镜像
docker&load&&&#导入镜像 &docker&images&#查看存在的镜像&
2.8 启动容器
docker&run&-h=&redis-test&&--name&redis-test&-d&-p&51000:22&-p&-p&&-p&&-p&51005:80&-p&&-p&&debian02&/etc/rc.local &#此处是我测试机器启动命令,指定主机名与端口映射。 &#启动后,后面又装了程序,开机自启动命令可放在/etc/rc.local文件中。 &docker容器迁移简单方便,可以任意的拷贝部署,以后再也不怕新部署环境了,一堆依赖装的想死有木有。&
3、关于docker容器的端口映射
由于docker容器的IP地址每次启动都会变,所以不适用于手动添加端口映射(难道每次重启都来查看容器的IP么?),所以需要每次启动容器时由docker程序自动添加NAT规则,前期尽可能的把需要映射的端口在创建容器时配置好,如下:
docker&run&-h=&activemq&&--name&activemq&-d&-p&51000:22&-p&-p&&-p&&-p&51005:80-p&&-p&&debian/base/etc/rc.local &#此处我把mysql,redis,nginx,ssh都进行了映射。&
后续对于docker容器的管理,记住容器的名称,如上述名称是activemq,则使用docker stop,start来控制容器进程。
docker&stop&activemq &docker&start&activemq&
当然,也可以不让docker每次启动容器修改容器的IP地址,参考如下:
docker网络配置:
4、关于docker容器的多程序开机自动运行
docker容器每次启动时,开机自启动的命令都要在启动容器前指定。如 docker run -I -t debian /bin/bash命令,只会运行/bin/bash程序,其它的程序都不会运行,对于要跑多个程序的容器特别纠结。
多程序开机自动运行方法:
可把前面所说的启动命令换成dockerrun -I -t debian /etc/rc.local,在容器中把所有需要开机自的启动命令放在/etc/rc.local中,就可以达到多程序开机自启动了。
后台运行则是:docker run -d -p 50001:22 debian /etc/rc.local。注意:run命令是创建一个新的容器,如果要启动一个曾经运行过的容器,则用命令docker ps -a中找对应的容器ID,然后使用docker start &容器ID&即可。
5、关于docker容器和镜像的关系
无论容器里做什么操作,写文件,删文件。该容器的基本镜像都不会有任何改变。
这是因为Docker从父镜像建立增量镜像,只存储每个容器的更改。因此,如果你有一个300MB的父镜像,如果你在容器中安装了50MB的额外应用或服务,你的容器只有50MB,父镜像还是300MB。
但是可以使用Dockfile或commit命令来,把增量镜像和父镜像一起生成一个新的镜像。
commit使用:
docker&commit&容器id&新镜像名称&
Dockfile使用:
root@yangrong:/data#&cat&Dockerfile &FROMubuntu/testa&#这是基础镜像 &CMD[&/root/start.sh&]&#这是启动命令 &root@yangrong:/data#&docker&build&-t&新镜像名&./&
关于Dockfile更多参数参考地址:
6、docker参数详解
docker &useage&of&docker &-D&默认false&允许调试模式(debugmode) &-H&默认是unix:///var/run/docker.sock&tcp://[host[:port]]来绑定&或者unix://[/path/to/socket]来使用(二进制文件的时候),当主机ip&host=[0.0.0.0],(端口)port=[4243]&或者&path=[/var/run/docker.sock]是缺省值,做为默认值来使用 &-api-enable-cors&默认flase&允许CORS&header远程api &-b&默认是空,附加在已存在的网桥上,如果是用'none'参数,就禁用了容器的网络 &-bip&默认是空,使用提供的CIDR(ClasslessInter-Domain&Routing-无类型域间选路)标记地址动态创建网桥(dcoker0),和-b参数冲突 &-d&默认false&允许进程模式(daemonmode) &-dns&默认是空,使docker使用指定的DNS服务器 &-g&默认是&/var/lib/docker&:作为docker使用的根路径 &-icc&默认true,允许inter-container来通信 &-ip&默认&0.0.0.0&:绑定容器端口的默认Ip地址 &-iptables&默认true&禁用docker添加iptables规则 &-mtu&默认1500&:&设置容器网络传输的最大单元(mtu) &-p&默认是/var/run/docker.pid进程pid使用的文件路径 &-r&默认是true&重启之前运行的容器 &-s&默认是空&,这个是docker运行是使用一个指定的存储驱动器 &-v&默认false&打印版本信息和退出&
7、docker run命令详解
Usage:&docker&run&[OPTIONS]&IMAGE[:TAG]&[COMMAND]&[ARG...] &Run&a&command&in&a&new&container &-a=map[]:&附加标准输入、输出或者错误输出 &-c=0:&共享CPU格式(相对重要) &-cidfile=&&:&将容器的ID标识写入文件 &-d=false:&分离模式,在后台运行容器,并且打印出容器ID &-e=[]:设置环境变量 &-h=&&:&容器的主机名称 &-i=false:&保持输入流开放即使没有附加输入流 &-privileged=false:&给容器扩展的权限 &-m=&&:&内存限制&(格式:&unit,&unit单位&=&b,&k,&m&or&g) &-n=true:&允许镜像使用网络 &-p=[]:&匹配镜像内的网络端口号 &-rm=false:当容器退出时自动删除容器&(不能跟&-d一起使用) &-t=false:&分配一个伪造的终端输入 &-u=&&:&用户名或者ID &-dns=[]:&自定义容器的DNS服务器 &-v=[]:&创建一个挂载绑定:[host-dir]:[container-dir]:[rw|ro].如果容器目录丢失,docker会创建一个新的卷 &-volumes-from=&&:&挂载容器所有的卷 &-entrypoint=&&:&覆盖镜像设置默认的入口点 &-w=&&:&工作目录内的容器 &-lxc-conf=[]:&添加自定义-lxc-conf=&lxc.cgroup.cpuset.cpus&=&0,1&&-sig-proxy=true:&代理接收所有进程信号(even&in&non-tty&mode) &-expose=[]:&让你主机没有开放的端口 &-link=&&:&连接到另一个容器(name:alias) &-name=&&:&分配容器的名称,如果没有指定就会随机生成一个 &-P=false:&Publish&all&exposed&ports&to&thehost&interfaces&公布所有显示的端口主机接口&
8、docker常用命令总结
docker&pull&镜像名:tag&#从官网拉取镜像 &docker&search&镜像名&#搜索在线可用镜像名&
8.1查询容器、镜像、日志
docker&top&&#显示容器内运行的进程 &docker&images&#查询所有的镜像,默认是最近创建的排在最上。 &docker&ps&#查看正在运行的容器 &docker&ps&-l&#查看最后退出的容器的ID &docker&ps&-a&#查看所有的容器,包括退出的。 &docker&logs&{容器ID|容器名称}&#查询某个容器的所有操作记录。 &docker&logs&-f&{容器ID|容器名称}&#实时查看容易的操作记录。&
8.2删除容器与镜像
docker&rm$(docker&ps&-a&-q)&#删除所有容器 &docker&rm&容器名or&ID&#删除单个容器 &docker&rmi&&#删除单个镜像 &docker&rmi$(docker&images&|&grep&none&|&awk&'{print&$3}'&|&sort&-r)&#删除所有镜像&
8.3启动停止容器
docker&stop&容器名or&ID&#停止某个容器 &docker&start&容器名or&ID&#启动某个容器 &docker&kill&容器名or&ID&#杀掉某个容器&
8.4容器迁器
docker&export&&ID&&/home/export.tar&#导出 &cat&/home/export.tar&|&sudo&docker&import&-&busybox-1-export:latest&#&导入export.tar文件 &docker&save&debian&/home/save.tar&#将debian容器打包 &docker&load&/home/save.tar&#在另一台服务器上加载打包文件&
save和export的对比参考地址:
8.5运行一个新容器
#运行一个新容器,同时为它命名、端口映射。以debian02镜像为例 &docker&run&-h=&redis-test&&--name&redis-test&-d&-p&51000:22&-p&-p&&-p&&-p&51005:80&-p&&-p&&debian02&/etc/rc.local &&#从container中拷贝文件,当container已经关闭后,在里面的文件还可以拷贝出来。 &sudo&docker&cp&7bb0e258aefe:/etc/debian_version&.&#把容器中的/etc/debian_version拷贝到当前目录下。&
8.6 docker Dockfile镜像制作
root@yangrong:/data#&cat&Dockerfile &FROM&ubuntu/testa&#这是基础镜像 &CMD&[&/root/start.sh&]&#这是启动命令 &root@yangrong:/data#&docker&build&-t&新镜像名&./&#生成新的镜像&
Dockfile更多参数参考:
如有疑问,欢迎留言讨论。qq:
原文链接:
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&的更多文章
运维人,不论你是做技术运维、安全运维,还是系统运维、应用运维
Linux界极具活力,面向不同的用户可以使用不同的Linux发行版,比如适合新手和游戏爱好者等。
讲师: 12人学习过讲师: 2人学习过讲师: 25人学习过
OS X Server的Mavericks版本并没有发生这样巨大的变化
近几年,开源业界的创新发展很繁荣,不仅在软件层面,
TFS为淘宝提供海量小文件存储,通常文件大小不超过1M
JBuilder 2006是一款强大的Java企业级开发平台,其集成了几乎所有的Java技术,涵盖了软件开发生命周期的各个过程。本书深入浅出
51CTO旗下网站【网络】Docker给每一个启动的container指定一个ip,
这个如何做?
[问题点数:20分,结帖人ehmonfhtcojh]
【网络】Docker给每一个启动的container指定一个ip,
这个如何做?
[问题点数:20分,结帖人ehmonfhtcojh]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。为Docker设置固定IP及使用Weave管理工具的方法
代码如下: br_name=dockerbrctl addbr $br_nameip addr add 192.168.33.2/24 dev $br_nameip addr del 192.168.33.2/24 dev em1ip link set $br_name upbrctl addif $br_name eth0 接着,可以启动容器了,注意用--net=none方式启动:代码如下:
# start new containerhostname=''cid=$(docker run -d -i -h $hostname --net=none -t centos)pid=$(docker inspect -f '{{.State.Pid}}' $cid) 下面,为该容器配置网络namespace,并设置固定ip:代码如下:
# set up netnsmkdir -p /var/run/netnsln -s /proc/$pid/ns/net /var/run/netns/$pid# set up bridgeip link add q$pid type veth peer name r$pidbrctl addif $br_name q$pidip link set q$pid up# set up docker interfacefixed_ip='192.168.33.3/24'gateway='192.168.33.1'ip link set r$pid netns $pidip netns exec $pid ip link set dev r$pid name eth0ip netns exec $pid ip link set eth0 upip netns exec $pid ip addr add $fixed_ip dev eth0ip netns exec $pid ip route add default via 192.168.33.1 这样,容器的网络就配置好了,如果容器内部开启了sshd服务,通过192.168.33.3就可以直接ssh连接到容器,非常方便。上面的步骤比较长,可以借助pipework来为容器设置固定ip(除了设置IP,还封装了配置网关、macvlan、vlan、dhcp等功能):代码如下: pipework docker0 be4 10.88.88.8/24那么,当容器需要删除的时候,怎么清理网络呢,其实也很简单:代码如下:
# stop and delete containerdocker stop $ciddocker rm $cid# delete docker's net namespace (also delete veth pair)ip netns delete $pid代码如下:sudo wget -O /usr/local/bin/weave /zettio/weave/master/weave代码如下:sudo chmod a+x /usr/local/bin/weave启动weave路由器,这个路由器其实也是在docker中启动的:代码如下:[root@h-46mow360 ~]# weave launchUnable to find image 'zettio/weave' locally3b3a3db2c186fccb5203dcc269b3febbbbfebd0683749f代码如下:[root@h-46mow360 ~]# brctl showbridge name bridge id&&&&&& STP enabled interfacesdocker0&&&& afe9799&& no&&&&& veth801050aweave&&&&&& 8000.7afc2a03325e&& no&&&&& vethwepl2146代码如下:[root@h-46mow360 ~]# docker psCONTAINER ID&&&&&&& IMAGE&&&&&&&&&&&&&&&&&&&&&&&&&& COMMAND&&&&&&&&&&&&&&& CREATED&&&&&&&&&&&&& STATUS&&&&&&&&&&&&& PORTS&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& NAMES3b3a3db2c186&&&&&&& zettio/weave:git-a34e214201cb&& &/home/weave/weaver&&& About a minute ago&& Up About a minute&& 0.0.0.0:/tcp, 0.0.0.0:/udp&& weave在两台物理机上分别启动一个容器:代码如下:c1=$(weave run 10.0.3.3/24 -t -i -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /tmp/$(mktemp -d):/run systemd:systemd /usr/lib/systemd/systemd)c2=$(weave run 10.0.3.5/24 -t -i -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /tmp/$(mktemp -d):/run systemd:systemd /usr/lib/systemd/systemd)这个时候,两个容器之间是不通的,需要在两台weave的路由器之间建立连接:( if there is a firewall between $HOST1 and $HOST2, you must open port 6783 for TCP and UDP)代码如下:weave connect 10.33.0.9这样,两台容器之间通了:代码如下:# nsenter --mount --uts --ipc --net --pid --target $(docker inspect --format "{{.State.Pid}}" "$c2")代码如下:-bash-4.2# ping -c 3 10.0.3.3PING 10.0.3.3 (10.0.3.3) 56(84) bytes of data.64 bytes from 10.0.3.3: icmp_seq=1 ttl=64 time=2.34 ms64 bytes from 10.0.3.3: icmp_seq=2 ttl=64 time=1.52 ms64 bytes from 10.0.3.3: icmp_seq=3 ttl=64 time=1.13 ms--- 10.0.3.3 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2003msrtt min/avg/max/mdev = 1.131/1.667/2.345/0.505 ms&weave其他特性& &应用隔离:不同子网容器之间默认隔离的,即便它们位于同一台物理机上也相互不通;不同物理机之间的容器默认也是隔离的&&物理机之间容器互通:weave connect $OTHER_HOST&&动态添加网络:对于不是通过weave启动的容器,可以通过weave attach 10.0.1.1/24 $id来添加网络(detach删除网络)&&安全性:可以通过weave launch -password wEaVe设置一个密码用于weave peers之间加密通信&&与宿主机网络通信:weave expose 10.0.1.102/24,这个IP会配在weave网桥上&&查看weave路由状态:weave ps&&通过NAT实现外网访问docker容器
顶一下(0) 踩一下(0)
热门标签:

我要回帖

更多关于 docker ip 分配 的文章

 

随机推荐