容器如果离开了网络,就是一个密闭的盒子。Docker 初期的网络功能并不是很完善,随着不断的演化,目前 docker 的网络已经大大加强。
docker自带的网络:
当docker安装成功后,就会创建三种网络。
可以使用docker network ls进行查看:
[root@localhost docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b4946b871004 bridge bridge local
8937b1719dd3 host host local
cb961b2e8932 none null local
创建容器时可以通过–net指定网络,对于bridge而言,默认是主机挂载在主机的docker0上的。
[root@localhost docker]# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:bfff:fed8:47ca prefixlen 64 scopeid 0x20<link>
ether 02:42:bf:d8:47:ca txqueuelen 0 (Ethernet)
RX packets 7230 bytes 75931861 (72.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8948 bytes 74624356 (71.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
查看某种网络的具体信息,可以使用docker network inspect net-name。
docker允许用户自定义的三种网络:
1、桥接,系统默认的桥接是docker0,如果你想将多个容器隔离在一个新的容器中,可以使用一下命令:
docker network create --drive bridge mybridgenet
然后再创建容器时就可以使用–net将容器挂载到mybridgenet中。
2、overlay网络,该网络是一种虚拟交换技术,主要解决不同IP地址段之间的网络通讯问题。Docker 使用的 overlay 技术是 VXLAN,借助于 libnetwork 来实现的。Overlay 网络需要一个 K-V 的服务来存储相关的主机信息,目前 Docker 支持的 K-V 存储服务有 Consul,Etcd 和 ZooKeeper,其中 Consul和 Etcd 都是用 Go 来进行开发的,ZooKeeper 是用 Java 开发的,由于 Go 的原生跨平台型,Consul
就成为了默认的发现服务。
对于 Overlay,主机还必须开放 UDP/4789 和 TCP/UDP/7946,分别用作数据通道和控制通道。
- nat网络。(默认,一般容器的网络都是172.17.0.1/16)
- 和宿主机共享网络,host网络
- none:容器内只有本地回环地址。
- container网络(两个容器共享一个网络)
- overlay网络:跨主机容器之间互通
nat网络:
[root@localhost docker]# docker run -it --name vm1 busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
/ # ping www.baidu.com
PING www.baidu.com (39.156.66.14): 56 data bytes
64 bytes from 39.156.66.14: seq=0 ttl=127 time=102.502 ms
^C
host网络:
[root@localhost docker]# docker run -it --name vm1 --net=host busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:00:59:1b brd ff:ff:ff:ff:ff:ff
inet 192.168.0.124/24 brd 192.168.0.255 scope global ens33
None网络:只有一个回环地址
[root@localhost docker]# docker run -it --name vm1 --net=none busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
container网络:
[root@localhost docker]# docker run -it --name vm1 busybox sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@localhost ~]# docker run -it --name vm2 --net=container:vm1 busybox sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
overlay网络请查看下面四篇文章
docker overlay网络跨主机通信——路由机制打通网络
docker overlay网络跨主机通信——使用(OVS)打通网络
docker overlay网络跨主机通信——使用flannel来打通网络
docker overlay网络跨主机通信——使用Quagga来实现自动学习路由