美文网首页
Docker的网络模式bridge、host、container

Docker的网络模式bridge、host、container

作者: 沈祥佑 | 来源:发表于2019-04-28 23:55 被阅读0次

    原文链接

    docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下5种网络模式:
    bridge模式:使用–net =bridge指定,默认设置;
    host模式:使用–net =host指定;
    none模式:使用–net =none指定;
    container模式:使用–net =container:指定容器名;

    overlay模式:使用--net=overlay

    bridge模式网络

    在该模式(见下图)中,Docker守护进程创建了一个虚拟以太网桥docker0,附加在其上的任何网卡之间都能自动转发数据包。默认情况下,守护进程会创建一对对等接口,将其中一个接口设置为容器的eth0接口,另一个接口放置在宿主机的命名空间中,从而将宿主机上的所有容器都连接到这个内部网络上。同时,守护进程还会从网桥的私有地址空间中分配一个IP地址和子网给该容器。

    <pre style="box-sizing: border-box; outline: 0px; margin: 0px 0px 24px; padding: 8px; position: relative; font-family: Consolas, Inconsolata, Courier, monospace; white-space: pre-wrap; overflow-wrap: break-word; overflow-x: auto; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">docker run -d -P --net=bridge nginx:1.9.1 docker ps
    CONTAINER ID IMAGE COMMAND CREATED
    STATUS PORTS NAMES
    17d447b7425d nginx:1.9.1 nginx -g 19 seconds ago
    Up 18 seconds 0.0.0.0:49153->443/tcp,
    0.0.0.0:49154->80/tcp trusting_feynman
    </pre>

    因为bridge模式是Docker的默认设置,所以你也可以使用docker run -d -P nginx:1.9.1。如果你没有使用-P(发布该容器暴露的所有端口)或者-p
    host_port:container_port(发布某个特定端口),IP数据包就不能从宿主机之外路由到容器中。

    图2 bridge模式网络设置

    host模式网络

    该模式将禁用Docker容器的网络隔离。因为容器共享了宿主机的网络命名空间,直接暴露在公共网络中。因此,你需要通过端口映射(port mapping)来进行协调。

    <pre style="box-sizing: border-box; outline: 0px; margin: 0px 0px 24px; padding: 8px; position: relative; font-family: Consolas, Inconsolata, Courier, monospace; white-space: pre-wrap; overflow-wrap: break-word; overflow-x: auto; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">docker run -d --net=host ubuntu:14.04 tail -f /dev/null ip addr | grep -A 2 eth0:
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 06:58:2b:07:d5:f3 brd ff:ff:ff:ff:ff:ff
    inet 10.0.7.197/22 brd 10.0.7.255 scope global dynamic eth0

    docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b44d7d5d3903 ubuntu:14.04 tail -f 2 seconds ago Up 2 seconds jovial_blackwell docker exec -it b44d7d5d3903 ip addr
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 06:58:2b:07:d5:f3 brd ff:ff:ff:ff:ff:ff
    inet 10.0.7.197/22 brd 10.0.7.255 scope global dynamic eth0
    </pre>

    我们可以从上例中看到:容器和宿主机具有相同的IP地址10.0.7.197

    在下图中,我们可以看到:当使用host模式网络时,容器实际上继承了宿主机的IP地址。该模式比bridge模式更快(因为没有路由开销),但是它将容器直接暴露在公共网络中,是有安全隐患的。

    03.png

    图3 host模式网络设置

    container-none模式


    container network

    container1.png

    先会有一个容器使用的是nat模式,相当于这有一个ip会连接到docker0上,然后通过eth1转发出去。nat模式直接使用的是宿主机的模式,container 启动一个容器,会使用另外一个容器的网络,它们会共享空间,新的容器,它们的网络容器是一模一样的,那么这个容器,是通过host容器出去的。


    none network

    container2.png

    none 模式就是container 没有任何的网络,不给它创建网络,我们可以自己去实现自己想要的网络模式。


    示例

    container 模式

    创建一个nat模式,看一下这个容器ip。

    container3.png

    创建一个container网络模式的ip,创建完成后,可以看到这两个ip地址是一模一样的,并且是可以直接通信的。

    container4.png

    确认是两个容器

    container5.png

    None,不会创建网络,里面就不会有ip,最常用的是nat模式和container网络模式,container网络模式用于容器和容器直接频繁交流的情况。

    container6.png

    overlay 网络模式


    overlay network

    overlay1.png

    容器在两个跨主机进行通信的时候,是使用overlay network这个网络模式进行通信,如果使用host也可以实现跨主机进行通信,直接使用这个物理的ip地址就可以进行通信。overlay它会虚拟出一个网络比如10.0.9.3这个ip地址,在这个overlay网络模式里面,有一个类似于服务网关的地址,然后把这个包转发到物理服务器这个地址,最终通过路由和交换,到达另一个服务器的ip地址。

    在docker容器里面overlay 是怎么实现的呢?

    我们会有一个服务发现,比如说是consul,会定义一个ip地址池,比如10.0.9.0/24之类的,上面会有容器,容器的ip地址会从上面去获取,获取完了后,会通过eth1进行通信,贼这实现跨主机的东西。

    overlay2.png

    需要创建一个consul的服务容器

    docker run -d -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h consul progrium/consul -server -bootstrap -ui-dir /ui

    修改它的启动参数

    ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://192.168.59.100:8500 --cluster-advertise=enp0s8:2376 --insecure-registry=0.0.0.0/0

    hostA和hostB都需要修改

    示例

    两台主机

    overlay3.png overlay4.png

    通过这个网卡出去

    overlay5.png

    修改它的启动参数,这里的ip等要修改成自己的。

    overlay6.png

    第二个服务器也一样

    overlay7.png

    修改完后,需要重启。

    overlay8.png

    查看重启后是否启动成功

    overlay9.png

    这边也一样

    overlay10.png

    在第一台主机上创建一个consul

    overlay11.png

    查看启动是否成功

    overlay12.png

    创建完后通过浏览器访问一下,可以看到这两台会自动注册上来,这样的话这两个主机之间就会进行通信。

    overlay13.png

    相关文章

      网友评论

          本文标题:Docker的网络模式bridge、host、container

          本文链接:https://www.haomeiwen.com/subject/kpasnqtx.html