Docker-12-容器网络

要构建具有安全的一致行为的web应用程序,可以使用Docker网络特性.根据定义,网络为容器实现了完全隔离.因此,控制应用程序所在的网络很重要,Docker容器网络为您提供了这种控制能力.

默认网络

docker提供了三种网络,可以通过docker network ls命令去查看,结果如下:

image

前面三个就是docker默认提供的,运行容器的时候可以通过--net来指定网络,先来看下这三个默认的网络分别是怎样的

  • bridge: 表示所有Docker安装中都存在的docker0网络. 除非使用docker run --net=选项另行指定,否则Docker守护进程默认情况下会将容器连接到此网络,在主机上使用ifconfig命令,可以看到此网桥是主机的网络堆栈的一部分
  • none: 意味着不指定网络,使用这个网络的容器中没有网卡.
  • host: 会将容器加入宿主机所在的网络中,在使用这个网络的容器中其网络配置和宿主机一样

bridge网络详解

查看bridge网络的详细信息,命令如下:

docker network inspect bridge

返回值:

[
    {
        "Name": "bridge",
        "Id": "e73fffb9d7ea78c02f9fdcabd33377054ae1f391ed883d8b4c6141f2ee99b101",
        "Created": "2019-04-23T09:36:04.07923852+08:00",
        "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,
        "Attachable": false,
        "Containers": {
            "dc37d28c293f8568e396f2c788b43f1fc1e293b88f85232a6c5ae550a099493e": {
                "Name": "registry",
                "EndpointID": "8d31b605406c7aa857366af422eca1e859cbb6610bb4a166c61c893866f006df",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/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": {}
    }
]

看一下返回值中的Containers,就是所有使用这个网络的容器的信息,上面这个返回值里面的容器就是我们上文中搭建docker仓库的那个容器

在这个网络中的容器,互相之间可以通过ip进行通信,Docker不支持默认的bridge网络上的服务发现(automatic service discovery),如果你希望默认的bridge网络上的容器之间能够通过名字互相通信,需要在docker run命令中指定--link标识

默认的docker0网络上支持通过端口映射或是使用--link来进行通信,但这种方法很笨重且容易出错,不建议在以后的应用中使用.

自定义网络

为了很好的实现容器之间的网络隔离,可以使用自定义网络,Docker提供了一些网络驱动器(network driver)来方便用户自定义网络,你可以创建bridge networkoverlay network,也可以通过创建自己的网络插件.

你可以创建许多网络,Docker支持将一个容器加入多个网络,只有在同一个网络中的容器之间才可以相互通信,而不能跨网络通信.

创建bridge网络

创建自定义网络最简单的方式就是创建一个bridge网络.这样创建的网络和之间介绍的docker0网络很像. 命令如下:

docker network create --driver bridge isolated_nw
image

创建完成之后,容器就可以使用了.在docker run命令中加入参数,--net=isolated_nw就ok了

同时在容器运行过程中,也可以指定网络,命令如下:

docker network connect 网络名/id 容器名/id 

我们上面创建的这个网络中,加入这个bridge网络的容器必须在同一个宿主机上,同一个网络中的容器之间可以直接通信,但不能和不同网络的容器通信.其示意图如下:

image

在用户自定义的bridge网络中,--link是不支持的,如果你希望外部网络可以访问容器中的应用,可以通过对外暴露端口(expose port)的方式完成.

如果你希望在单个宿主机上创建一个小型网络,bridge网络是很有用的.但如果想创建更大的网络,尤其是跨越多个宿主机的网络,那就需要创建overlay网络

overlay网络这里先不做介绍,想了解的同学可以看这里:原文地址

你可能感兴趣的:(Docker-12-容器网络)