设为首页 收藏本站
查看: 1507|回复: 0

[经验分享] Docker 容器网络

[复制链接]

尚未签到

发表于 2017-12-6 11:53:51 | 显示全部楼层 |阅读模式
默认网络



当安装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:以太网  硬件地址 02:42:dc:06:cb:3c
inet 地址:172.17.0.1  广播:0.0.0.0  掩码:255.255.0.0
inet6 地址: fe80::42:dcff:fe06:cb3c/64 Scope:Link
UP BROADCAST MULTICAST  MTU:1500  跃点数:1
接收数据包:47395 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:49555 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:1932484 (1.9 MB)  发送字节:156709338 (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": "1500"
},
"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": "1500"
},
"Labels": {}
}
]

容器使用ip地址和其他的容器通讯。docker不支持自动发现服务,在默认bridge网络中。

如果你想使用容器的名称来通讯,你必须通过 docker run --link 选项。



你可以连接一个正在运行的容器,然后检查它的配置文件:




zane@zane-V:~$ docker attach container1
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:37 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5031 (4.9 KiB)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:65536  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # whoami
root
/ # uname -a
Linux 72b7379b7d42 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 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): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.071 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.045 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.047 ms

--- 172.17.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% 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": {}
}
]


在同一个网络中的容器可以立刻相互通信。虽然这个网络本身与其他网络中的容器 是隔离的。

DSC0000.png

DSC0001.png

DSC0002.png

DSC0003.png



应该在每台主机上开放下面的端口:





在创建overlay 网络前,你需要在docker daemon中配置一些选项。


OptionDescription




--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 用于与外部网络连接

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421268-1-1.html 上篇帖子: 操作Docker容器 下篇帖子: docker 命令介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表