一、docker原生网络

docker安装后会自动创建3种网络:bridge,host,none

可以使用以下命令查看:

docker inspect列出所有的端口 docker列出当前主机所有网络_docker


docker安裝时会自动创建一个名为docker0的Linux bridge,新建的容器会自动桥接到这个接口。

docker inspect列出所有的端口 docker列出当前主机所有网络_自定义_02

例如,现在运行一个容器,查看它的ip:

docker inspect列出所有的端口 docker列出当前主机所有网络_自定义_03

由于已有一个容器,所以这个新建的容器ip不是2,而是3.

docker inspect列出所有的端口 docker列出当前主机所有网络_docker_04


docker inspect列出所有的端口 docker列出当前主机所有网络_自定义_05

bridge 模式下容器没有一个公有ip,只有宿主机才可以直接访问,外部主机是不可见的。

容器通过宿主机的NAT规则后则可以访问外网。

docker inspect列出所有的端口 docker列出当前主机所有网络_自定义_06

host网络

需要运行容器的时候指定

docker inspect列出所有的端口 docker列出当前主机所有网络_桥接_07

docker inspect列出所有的端口 docker列出当前主机所有网络_自定义_08

容器内外看到的一样。

host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。比如宿主机用了80端口,容器就不能使用。

docker inspect列出所有的端口 docker列出当前主机所有网络_docker_09

none模式

none模式是指禁用网络功能,只有lo接口,在容器创建时使用–network=none指定。比如有些数据比较敏感,不适合网络连接就适合用此模式。

docker inspect列出所有的端口 docker列出当前主机所有网络_桥接_10

二、docker自定义网络

自定义网络模式,docker提供了三种自定义网络驱动:

  • bridge
  • overiay
  • macvian
    bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,overiay和macvian是用于创建跨主机网络。
    建议使用自定义的网络来控制哪些容器可以相互通信,bridge还可以自动DNS解析容器名称到iP地址。
    1.使用自定义的网络驱动
    2.自己指定网段
    在创建的时候指定参数:–subnet、–gateway
    inspect查看:
    自己创建容器查看:
    3.自己指定容器ip地址,但必须是在自定义网桥上(通过–gateway和–subnet创建的才可以使用–ip),同一网桥上的容器是可以互通的。

    桥接到不同网桥上的容器,彼此是不通信的。docker在设计上就是要隔离不同network的。

    现在的ip状况:

vm1

172.18.0.2

vm2

172.22.0.2

vm3

172.22.0.10

在vm2里只能和vm3通信(一块网桥),如何能与my
通信呢?
答:将vm2连接到my_net1上。

[root@node2 ~]# docker network connect my_net1 vm2
[root@node2 ~]# docker attach vm2
root@f0744f90a37d:/# 
root@f0744f90a37d:/# ip addr   #两个ip
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:16:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.22.0.2/24 brd 172.22.0.255 scope global eth0   #本来的ip
       valid_lft forever preferred_lft forever
26: eth1@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1   #连接到my_net1网桥后分配的ip
       valid_lft forever preferred_lft forever

docker inspect列出所有的端口 docker列出当前主机所有网络_桥接_11

docker inspect列出所有的端口 docker列出当前主机所有网络_自定义_12