默认网络

当安装docker时,它会自动创建3个网络。可以使用docker network ls 来查看。
 
zane@zane-V:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
4b10534b40ff bridge bridge local
7dbe50e049ea host host local
08bfed547b1e none null local
当运行容器的时候,可以指定容器使用哪个网络,用--network 参数。
 
bridge网络代表的是出现在ifconfig 中的 docker0. 除非你使用docker run --network=<>来指定使用的网络,
否则都会使用这个默认的bridge网络。
 
zane@zane-V:~$ ifconfig

docker0   Link encap:以太网  硬件地址 ::dc::cb:3c
inet 地址:172.17.0.1 广播:0.0.0.0 掩码:255.255.0.0
inet6 地址: fe80:::dcff:fe06:cb3c/ Scope:Link
UP BROADCAST MULTICAST MTU: 跃点数:
接收数据包: 错误: 丢弃: 过载: 帧数:
发送数据包: 错误: 丢弃: 过载: 载波:
碰撞: 发送队列长度:
接收字节: (1.9 MB) 发送字节: (156.7 MB)
可以查看默认网络,检查默认网络,但是不能删除默认网络。可以增加自己定义的网络,这些在你长时间不用可以删除的。
我们先来看看默认bridge网络,然后再学习如何创建自己的网络。
 
默认bridge网络细节

 
默认bridge网络存在于所有的docker主机。docker network inspect 命令返回关于网络的信息:
zane@zane-V:~$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "4b10534b40ffa1d92610668060d8b831079a213f81f82c4f97f71ed1eb54b441",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"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": ""
},
"Labels": {}
}
]
docker引擎自动创建子网络和路由。docker run 命令自动添加新的容器到这个网络。
zane@zane-V:~$ docker run -itd --name=container1 busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
557a0c95bfcd: Pull complete
Digest: sha256:ae007bdb45fc0d56e3d705b97640ac24844bcc9ce4c8b8493f216a57ab6af0d5
Status: Downloaded newer image for busybox:latest
72b7379b7d426f4bab0a41a83643da3e2a40ed38f976154a413b914326af330b
zane@zane-V:~$ docker run -itd --name=container2 busybox
e9bce535ae32945f5e43340facdb6c16c93d92119e85b61c6cb7a5379a0caf63
创建两个容器之后再次检测网络,会显示新的容器在这个默认bridge网络中:
 
zane@zane-V:~$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "4b10534b40ffa1d92610668060d8b831079a213f81f82c4f97f71ed1eb54b441",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Containers": {
"72b7379b7d426f4bab0a41a83643da3e2a40ed38f976154a413b914326af330b": {
"Name": "container1",
"EndpointID": "63adfc2048157821ef74c5ff7220053d47df2e34042a93938fb9d653188bf121",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"e9bce535ae32945f5e43340facdb6c16c93d92119e85b61c6cb7a5379a0caf63": {
"Name": "container2",
"EndpointID": "0a2d00f6688b36431e8338583ae30d8d23451dc42b8edc058c3622d3e5a51aef",
"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": ""
},
"Labels": {}
}
]
容器使用ip地址和其他的容器通讯。docker不支持自动发现服务,在默认bridge网络中。
如果你想使用容器的名称来通讯,你必须通过 docker run --link 选项。
 
你可以连接一个正在运行的容器,然后检查它的配置文件:
zane@zane-V:~$ docker attach container1
/ # ifconfig
eth0 Link encap:Ethernet HWaddr ::AC:::
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80:::acff:fe11:/ Scope:Link
UP BROADCAST RUNNING MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (4.9 KiB) TX bytes: (648.0 B) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::/ Scope:Host
UP LOOPBACK RUNNING MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B) / # whoami
root
/ # uname -a
Linux 72b7379b7d42 4.2.--generic #~14.04.-Ubuntu SMP Fri Jan :: UTC x86_64 GNU/Linux
/ # exit
zane@zane-V:~$
注意:上面的exit 会使整个container1 停止。而不是想象中的退出了这个shell。
 
重启container1,看看能不能和上面的container2相通:
zane@zane-V:~$ docker attach container1
/ # ping -w3 172.17.0.3
PING 172.17.0.3 (172.17.0.3): data bytes
bytes from 172.17.0.3: seq= ttl= time=0.071 ms
bytes from 172.17.0.3: seq= ttl= time=0.045 ms
bytes from 172.17.0.3: seq= ttl= time=0.047 ms --- 172.17.0.3 ping statistics ---
packets transmitted, packets received, % packet loss
round-trip min/avg/max = 0.045/0.054/0.071 ms
退出刚刚的连接,使container1继续运行着,使用 Ctrl -p + ctrl -q 。
 
桥接网路

 
用户创建定义的最简单的网络就是一个桥接网路。这个网路和默认的docker0网络相似。
 
zane@zane-V:~$ docker network create --driver bridge isolated_nw
6e9792814d7ec6ab954c207dbec1eb61dba1f9b37750fba9e5f9721c074901fe
zane@zane-V:~$ docker network inspect isolated_nw
[
{
"Name": "isolated_nw",
"Id": "6e9792814d7ec6ab954c207dbec1eb61dba1f9b37750fba9e5f9721c074901fe",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1/16"
}
]
},
"Internal": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
zane@zane-V:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
4b10534b40ff bridge bridge local
7dbe50e049ea host host local
6e9792814d7e isolated_nw bridge local
c741cdd168b0 my-bridge-network bridge local
08bfed547b1e none null local
当你创建了一个网络,可以启动容器并使用这个网络。通过docker run --network=<NETWORK>选项。
zane@zane-V:~$ docker run --network=isolated_nw -itd --name=container3 busybox
ff22003c26acb64fb7b867b4cbaeb96ebf7b11765a2623379c82aa33182de026
zane@zane-V:~$ docker network inspect isolated_nw
[
{
"Name": "isolated_nw",
"Id": "6e9792814d7ec6ab954c207dbec1eb61dba1f9b37750fba9e5f9721c074901fe",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1/16"
}
]
},
"Internal": false,
"Containers": {
"ff22003c26acb64fb7b867b4cbaeb96ebf7b11765a2623379c82aa33182de026": {
"Name": "container3",
"EndpointID": "7bea487483d2e4a4d1e7eba08b58a596df884e738b0a5d5219abfa57ebefc89e",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
在同一个网络中的容器可以立刻相互通信。虽然这个网络本身与其他网络中的容器 是隔离的。

 
在用户自己定义的bridge网络,linking 是不支持的。你可以给网络中容器开放一个公共的容器端口。
如果你想使桥接网络的一部分可用于外部网络,这将是非常有用的。

如果你想在单一主机上运行一个相对小的网络,使用桥接网络是有效果的。
 
然而你想创建一个显著的大 网络,可以通过overlay 网络来实现。
 
docker_gwbridge 网络

 
docker在两种情况下回自动创建一个本地的桥接网络,docker_gwbridge:
  • 当你初始化或者加入一个swarm,Dcoker会创建docker_gwbridge.

    • 并使用它作为 不同主机的swarm 节点通讯网络。
  • 当没有一个容器网络可以提供与外部的连接,
    • Docker将容器连接到docker_gwbridge网络以及容器的其他网络,
    • 以便容器可以连接到外部网络或其他swarm节点。
如果需要自定义配置,你可以提前创建一个docker_gwbridge.除此之后,在有需求的时候才创建它。
 
下面的例子通过一些自定义的选项来创建docker_gwbridge:
zane@zane-V:~$ docker network create --subnet 172.30.0.0/ \
> --opt com.docker.network.bridge.name=docker_gwbridge \
> --opt com.docker.network.bridge.enable_icc=false \
> docker_gwbridge
689e4d893ca525c9e6765abbbe65d68f40ce2bca9592cf6c2b147b06647f8354 
当您使用overlay网络时,docker_gwbridge网络总是存在。
 
Docker swarm模式的overlay网络

你可以在一个运行swarm 模式的,管理节点中创建一个overlay网络,而不是使用外部键值存储。
该swarm使overlay网络仅对swarm中需要服务的节点可用。
当你创建一个使用overlay网络的服务,管理节点自动扩展overlay网络到那个运行服务任务的节点中。
 
下面的示例显示如何创建网络并将其用于来自swarm中的管理器节点的服务:
 
# Create an overlay network `my-multi-host-network`.
$ docker network create \
--driver overlay \
--subnet 10.0.9.0/ \
my-multi-host-network
400g6bwzd68jizzdx5pgyoe95 # Create an nginx service and extend the my-multi-host-network to nodes where
# the service's tasks run.
$ docker service create --replicas --network my-multi-host-network --name my-web nginx 716thylsndqma81j6kkkb5aus
具有额外键值存储的overlay网络

 
如果你在swarm 模式下没有使用Docker 引擎,overlay网络需要一个有效的键值存储服务。
支持键值存储的包括Consul,Etcd,ZooKeeper。在这个版本的引擎中创建网络之前,必须安装和配置你选择的键值存储服务。
 
注意:在Doker 引擎中运行swarm 模式,和使用其他键值存储的网络是不兼容的。
 

网络中的每台主机必须运行着Docker 引擎的实例。
这简单的方式就是提供的主机都是Docker 主机.

应该在每台主机上开放下面的端口:
 
在创建overlay 网络前,你需要在docker daemon中配置一些选项。
Option Description
--cluster-store=PROVIDER://URL
Describes the location of the KV service.
--cluster-advertise=HOST_IP|HOST_IFACE:PORT
The IP address or interface of the HOST used for clustering.
--cluster-store-opt=KEY-VALUE OPTIONS
Options such as TLS certificate or tuning discovery Timers
在swarm中的一台机器上创建overlay 网络
$ docker network create --driver overlay my-multi-host-network
这会使得单一网络跨越多个主机。overlay网络为容器提供完全的隔离
之后在每台主机,创建容器的时候确定指定了网络的名字。
 
$ docker run -itd --network=my-multi-host-network busybox
 
每次连接,每个容器都可以和网络中的所有容器相连而不管这些容器是哪个Docker 主机创建的。
 
定制网络插件

只要你想,你可以写自己的网络驱动插件。
 
总结

 
  • 一般容器使用ip地址通讯,也可以使用容器名称进行通信,但必须制定参数

    • docker run --link
  • 连接到正在运行的容器中
    • docker attach container1
    • 注意:误退出容器
      • 在容器shell 界面 的exit 会导致容器停止,而不是仅仅退出shell
      • 正常退出可以使用 ctr -p + ctr -q
  • 同一网络中的容器可以通信,与其他网络中的容器隔离
  • 开放共同端口,用于在桥接模式下,本地主机容器与外部主机容器通信
  • docker_gwbridge 用于与外部网络连接

Docker 容器网络的更多相关文章

  1. Docker容器网络篇

    Docker容器网络篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker的网络模型概述 如上图所示,Docker有四种网络模型: 封闭式网络(Closed conta ...

  2. 【转】理解Docker容器网络之Linux Network Namespace

    原文:理解Docker容器网络之Linux Network Namespace 由于2016年年中调换工作的原因,对容器网络的研究中断过一段时间.随着当前项目对Kubernetes应用的深入,我感觉之 ...

  3. 两台主机间docker容器网络互通

    服务器1: 网络172.30.0.0/16 服务器2: 网络172.31.0.0/16 服务器1和服务器2上的docker容器网络之间是无法互通的,如果需要互通,需要做以下配置: 服务器1上执行: i ...

  4. docker容器网络bridge

    我们知道docker利用linux内核特性namespace实现了网络的隔离,让每个容器都处于自己的小世界里面,当这个小世界需要与外界(宿主机或其他容器)通信的时候docker的网络就发挥作用了,这篇 ...

  5. Docker容器网络-基础篇

    开源Linux 一个执着于技术的公众号 Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/N ...

  6. Docker容器网络配置

    Docker容器网络配置 1.Linux内核实现名称空间的创建 1.1 ip netns命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作.ip netns命令 ...

  7. docker容器网络

    1.我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: · host模式,使用--net=host指定 · containe ...

  8. 5、Docker容器网络

    使用Linux进行IP层网络管理的指     http://linux-ip.net/html/ # yum install iproute http://linux-ip.net/html/tool ...

  9. 初学Docker容器网络不得不看的学习笔记

    一.关于Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

随机推荐

  1. Dataflow编程模型和spark streaming结合

    Dataflow编程模型和spark streaming结合 主要介绍一下Dataflow编程模型的基本思想,后面再简单比较一下Spark  streaming的编程模型 == 是什么 == 为用户提 ...

  2. python 学习分享-常用模块篇

    模块 就是前人给你造的轮子,你开车就好!!! 常用模块有: time模块 random模块 os模块 sys模块 shutil模块 json  &  picle模块 shelve模块 xml处 ...

  3. Java学习4之抽象类

    在面向父类编程的过程中,抽象出来的父类具有一般化特质.父类函数只是一个抽象化的概念,只是为了在面向对象编程时统一接口服务. example: 有时父类会定义出一些无法实现的行为: public voi ...

  4. html编码和解码

    public static string EncodeStr(string str) { str = Regex.Replace(str, @"<html[^>]*?>.* ...

  5. HDU6438 Buy and Resell 解题报告(一个有趣的贪心问题的严格证明)

    写在前面 此题是一个很容易想到的贪心题目,但是正确性的证明是非常复杂的.然而,目前网上所有题解并未给出本题贪心算法的任何正确性证明,全部仅停留在描述出一个贪心算法.本着对算法与计算机科学的热爱(逃), ...

  6. 低水平选手的自我救赎 (1)CLRS Exercise 16.5-2

    题目大意 给定正整数 $n$ 和一个由 $m$ 个正整数构成的可重集合 $A$,满足 $\forall a\in A, a\le n$ 且 $m\le n$ . 定义 $N_t(A) = |\{a\i ...

  7. SPOJ 422 Transposing is Even More Fun ——Burnside引理

    这题目就比较有趣了. 大概题目中介绍了一下计算机的储存方法,给一个$2^a*2^b$的矩阵. 求转置.但是只能交换两个数,求所需要的步数. 首先可以把变化前后的位置写出来,构成了许多的循环.左转将狼踩 ...

  8. [luoguP3332] [ZJOI2013]K大数查询(树套树)

    传送门 一开始想的是区间线段树套权值线段树,结果好像不能实现. 然后题解是权值线段树套区间线段树. 区间线段树上标记永久化就省去了pushdown的操作减少常数. 标记永久化的话..yy不出来就看代码 ...

  9. pat 甲级 L3-002. 堆栈

    L3-002. 堆栈 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有 ...

  10. jQuery 拖动排序

    原文发布时间为:2010-04-11 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html><html lang="en">< ...