Docker网络详解-一
2017-04-19 11:29
344 查看
title: Docker网络详解(一)——自定义网络
date: 2015-11-29 14:35:27
tags: docker
本篇是网络详解第一篇文章,介绍了Docker默认的几种网络,重点解释了用得最多的
目录:
* Docker 默认网络
* bridge网络详解
* 用户自定义网络
* 创建bridge网络
* 创建overlay网络
* 自定义网络插件
* 关于 –link
这三个网络是Docker的一部分,不能删除。当用户使用
-
-
- 指定
有关上面内容的详细信息可以参考:Docker之四种网络模式
使用
我们发现,
默认的
你可以创建许多网络,Docker支持将一个容器加入多个网络,只有在同一个网络中的容器之间才可以相互通信,而不能跨网络通信。
创建
之后我们就可以将新建的容器加入到这个新建的网络:
加入这个
在用户自定义的
如果你希望在单个宿主机上创建一个小型网络,
在每个Docker宿主机上都要开启如下两个端口:
你的Docker主机设置完成后,你可以使用
为了使用
在swarm中的一台机器中创建一个
这样就产生了一个跨越了多个主机的网络。
之后,在任何一个宿主机上启动容器时都要指定创建的overlay网络,例如:
一旦创建完成,每个容器都可以访问在同一个网络中的其它容器,不管它们是否在同一个宿主机上。
这方面的内容可以参考:Extending Docker 和 Writing a network driver plugin
date: 2015-11-29 14:35:27
tags: docker
categories: Docker Network
在Docker中,网络是很重要的部分,之前写过一篇有关Docker的几种网络模式的文章:Docker之四种网络模式,接下来的几篇文章将详细讲解Docker网络的原理和配置。本篇是网络详解第一篇文章,介绍了Docker默认的几种网络,重点解释了用得最多的
bridge。以及如何使用Docker提供的
network driver自定义网络。
目录:
* Docker 默认网络
* bridge网络详解
* 用户自定义网络
* 创建bridge网络
* 创建overlay网络
* 自定义网络插件
* 关于 –link
Docker默认网络
安装了Docker之后,Docker自动创建了三个网络,可以使用
docker network ls命令查看:
$ docker network ls NETWORK ID NAME DRIVER 7fca4eb8c647 bridge bridge 9f904ee27bf5 none null cf03ee007fb4 host host
这三个网络是Docker的一部分,不能删除。当用户使用
docker run运行容器时,可以通过
--net指定上面三个中的一个网络,新建的容器就会运行在这个网络中,默认是
bridge。
-
bridge代表Docker在宿主机中创建的docker0网络,你可以使用
ifconfig查看它的参数。
-
none意味着不指定网络,使用这个网络的容器中没有网卡。
- 指定
host网络会将容器加入宿主机所在的网络中,在使用这个网络的容器中其网络配合和宿主机一样
有关上面内容的详细信息可以参考:Docker之四种网络模式
bridge网络详解
要查看bridge网络的相信信息可以运行
docker network inspect bridge:
$ docker network inspect bridge [ { "Name": "bridge", "Id": "aa87f682528ed4e468147402d6e8e3408bd4d782309a9530d4d3db9762b21c96", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "172.17.0.0/16" } ] }, "Containers": {}, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" } } ]
使用
docker run启动一个容器,再查看bridge的信息:
$ docker run -itd --name=container1 busybox 3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c $ docker run -itd --name=container2 busybox 94447ca479852d29aeddca75c28f7104df3c3196d7b6d83061879e339946805c $ docker network inspect bridge {[ { "Name": "bridge", "Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "172.17.0.1/16", "Gateway": "172.17.0.1" } ] }, "Containers": { "3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c": { "EndpointID": "647c12443e91faf0fd508b6edfe59c30b642abb60dfab890b4bdccee38750bc1", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" }, "94447ca479852d29aeddca75c28f7104df3c3196d7b6d83061879e339946805c": { "EndpointID": "b047d090f446ac49747d3c37d63e4307be745876db7f0ceef7b311cbba615f48", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "9001" } } ]
我们发现,
docker network inspect会显示在某个网络中的所有容器的网络配置信息,在这个网络中的容器互相之间可以使用IP进行通信。Docker不支持默认的bridge网络上的服务发现(automatic service discovery),如果你希望默认的
bridge网络上的容器之间能够通过名字互相通信,需要在
docker run命令中指定
--link标识。
默认的
docker0网络上支持通过端口映射或是使用
--link来进行通信,但这种方法很笨重且容易出错,不建议在以后的应用中使用。
用户自定义网络
为了更好的实现容器之间网络的隔离,你可以自定义网络。Docker提供了一些网络驱动器(network driver)来方便用户自定义网络。你可以创建bridge network或
overlay network,也可以通过创建自己的网络插件。
你可以创建许多网络,Docker支持将一个容器加入多个网络,只有在同一个网络中的容器之间才可以相互通信,而不能跨网络通信。
创建bridge网络
创建自定义网络最简单的方式就是创建一个bridge网络。这样创建的网络和之间介绍的
docker0网络很像。
创建
bridge网络的命令为:
$ docker network create --driver bridge isolated_nw c5ee82f76de30319c75554a57164c682e7372d2c694fec41e42ac3b77e570f6b $ docker network inspect isolated_nw [ { "Name": "isolated_nw", "Id": "c5ee82f76de30319c75554a57164c682e7372d2c694fec41e42ac3b77e570f6b", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ {} ] }, "Containers": {}, "Options": {} } ] $ docker network ls NETWORK ID NAME DRIVER 9f904ee27bf5 none null cf03ee007fb4 host host 7fca4eb8c647 bridge bridge c5ee82f76de3 isolated_nw bridge
之后我们就可以将新建的容器加入到这个新建的网络:
$ docker run --net=isolated_nw -itd --name=container3 busybox 885b7b4f792bae534416c95caa35ba272f201fa181e18e59beba0c80d7d77c1d $ docker network inspect isolated_nw [ { "Name": "isolated_nw", "Id": "c5ee82f76de30319c75554a57164c682e7372d2c694fec41e42ac3b77e570f6b", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ {} ] }, "Containers": { "885b7b4f792bae534416c95caa35ba272f201fa181e18e59beba0c80d7d77c1d": { "EndpointID": "514e1b419074397ea92bcfaa6698d17feb62db49d1320a27393b853ec65319c3", "MacAddress": "02:42:ac:15:00:02", "IPv4Address": "172.21.0.2/16", "IPv6Address": "" } }, "Options": {} } ]
加入这个
bridge网络的容器必须在同一个宿主机上,同一个网络中的容器之间可以直接通信,但不能和不同网络的容器通信。其示意图如下(图片来自Docker官网Docker docs):
在用户自定义的
bridge网络中,
--link是不支持的,如果你希望外部网络可以访问容器中的应用,可以通过对外暴露端口(expose port)的方式完成。
如果你希望在单个宿主机上创建一个小型网络,
bridge网络是很有用的。但如果想创建更大的网络,尤其是跨越多个宿主机的网络,那就需要创建
overlay网络。
创建overlay网络
overlay支持在多个主机之间创建网络。
overlay网络需要一个键值对存储服务(key-value store service)才能工作,Docker目前支持Consul,Etcd和ZooKeeper。service和Docker主机之间的关系如图所示:
在每个Docker宿主机上都要开启如下两个端口:
你的Docker主机设置完成后,你可以使用
Docker Swarm将它们组成集群,Swarm具有服务发现功能。
为了使用
overlay网络,需要配置每一个Docker宿主机的
docker daemon使用overlay,也就是设置如下两个选项:
在swarm中的一台机器中创建一个
overlay网络:
$ docker network create --driver overlay my-multi-host-network
这样就产生了一个跨越了多个主机的网络。
之后,在任何一个宿主机上启动容器时都要指定创建的overlay网络,例如:
$ docker run -itd --net=my-multi-host-network busybox
一旦创建完成,每个容器都可以访问在同一个网络中的其它容器,不管它们是否在同一个宿主机上。
自定义网络插件
如果你想,你可以编写自己的网络驱动插件(network driver plugin)。网络驱动插件使用了Docker网络驱动的基础架构,也就是运行在Docker宿主机中的一个进程。这方面的内容可以参考:Extending Docker 和 Writing a network driver plugin
关于`–link`
在Docker网络的新特性之前,我们可以同过--link标识使两个容器互相通信(参考 Docker之容器互联 )。目前为止,
--link仍然可以使用,但只能用于默认的
docker0网络上。但这项特性被认为已经过时且有可能在未来的版本中移除。
相关文章推荐
- [转载] Docker网络详解及pipework源码解读与实践
- Docker网络详解及pipework源码解读与实践
- 详解Centos7 下建立 Docker 桥接网络
- docker实战1 (docker-toolbox的安装,docker基础命令详解[运行,容器导入/导出,镜像导入/导出,数据卷,网络],构建100个docker实例的测试环境)
- Docker网络详解-二
- Docker网络详解
- Docker网络详解
- Docker 手动配置容器网络实例详解
- Docker学习总结(21)——Docke网络bridge详解
- Docker网络详解及pipework源码解读与实践
- Docker多主机网络通信详解
- Docker网络详解
- Docker网络详解
- 【转】Docker网络详解及pipework源码解读与实践
- Docker网络详解及pipework源码解读与实践
- Docker网络详解及pipework源码解读与实践
- Docker中的网络详解以及与OpenStack网络对比
- Docker网络详解