非常教程

Docker 17参考手册

引擎: 教程 | Engine: Tutorials

网络容器 | Network containers (Engine)

如果您正在按您的方式完成用户指南,您只需构建并运行一个简单的应用程序。你也建立了自己的形象。本节教您如何将容器联网。

在默认网络上启动容器

Docker通过使用网络驱动程序默认情况下,Docker为您提供两个网络驱动程序,bridgeoverlay司机。您还可以编写一个网络驱动程序插件,以便您可以创建自己的驱动程序,但这是一个高级任务。

Docker引擎的每个安装都会自动包含三个默认网络。你可以列出它们:

$ docker network ls

NETWORK ID          NAME                DRIVER
18a2866682b8        none                null
c288470c46f6        host                host
7b369448dccb        bridge              bridge

名为bridge是一个特殊的网络。除非您另有说明,否则Docker总是在此网络中启动您的容器。现在试试这个:

$ docker run -itd --name=networktest ubuntu

74695c9cea6d9810718fddadc01a727a5dd3ce6a69d09752239736c030599741

二次

网络容器  |  Network containers (Engine)

二次

检查网络是查找容器IP地址的一种简单方法。

$ docker network inspect bridge

[
    {
        "Name": "bridge",
        "Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.1/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c": {
                "Name": "networktest",
                "EndpointID": "647c12443e91faf0fd508b6edfe59c30b642abb60dfab890b4bdccee38750bc1",
                "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": "9001"
        },
        "Labels": {}
    }
]

您可以通过断开容器从网络中删除容器。要做到这一点,您可以同时提供网络名称和容器名称。还可以使用容器ID。但是,在这个例子中,名称更快。

$ docker network disconnect bridge networktest

当您可以将容器从网络断开时,您不能删除内置的bridge网络名bridge.网络是将集装箱与其他集装箱或其他网络隔离开来的自然方式。因此,当您在Docker方面获得更多经验时,您将希望创建您自己的网络。

创建自己的桥梁网络

Docker引擎本机支持桥接网络和覆盖网络。桥网络仅限于运行Docker引擎的单个主机。覆盖网络可以包括多个主机,是一个更高级的主题。对于本例,您将创建一个桥网络:

$ docker network create -d bridge my_bridge

-d标志告诉Docker使用bridge新网络的驱动程序。你本可以把这面旗子bridge此标志的默认值。继续列出您机器上的网络:

$ docker network ls

NETWORK ID          NAME                DRIVER
7b369448dccb        bridge              bridge
615d565d498c        my_bridge           bridge
18a2866682b8        none                null
c288470c46f6        host                host

如果你检查这个网络,你会发现它里面什么都没有。

$ docker network inspect my_bridge

[
    {
        "Name": "my_bridge",
        "Id": "5a8afc6364bccb199540e133e63adb76a557906dd9ff82b94183fc48c40857ac",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

将容器添加到网络中

要构建协同工作但安全可靠的web应用程序,请创建一个网络。根据定义,网络为容器提供了完全的隔离。您可以在第一次运行容器时将容器添加到网络中。

启动运行PostgreSQL数据库的容器,并将--net=my_bridge标志将其连接到新网络:

$ docker run -d --net=my_bridge --name db training/postgres

如果你检查你的my_bridge你会看到它有一个容器。还可以检查容器的连接位置:

$ docker inspect --format='{{json .NetworkSettings.Networks}}'  db


{"my_bridge":{"NetworkID":"7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99",
"EndpointID":"508b170d56b2ac9e4ef86694b0a76a22dd3df1983404f7321da5649645bf7043","Gateway":"10.0.0.1","IPAddress":"10.0.0.254","IPPrefixLen":24,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02"}}

现在,继续并启动您现在熟悉的web应用程序。这次不要指定网络。

$ docker run -d --name web training/webapp python app.py

二次

网络容器  |  Network containers (Engine)

二次

哪个网络是你的web应用程序运行在?检查应用程序,您会发现它在默认情况下运行bridge网络。

$ docker inspect --format='{{json .NetworkSettings.Networks}}'  web


{"bridge":{"NetworkID":"7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
"EndpointID":"508b170d56b2ac9e4ef86694b0a76a22dd3df1983404f7321da5649645bf7043","Gateway":"172.17.0.1","IPAddress":"10.0.0.2","IPPrefixLen":24,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02"}}

然后,获取您的ip地址web

$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web


172.17.0.2

现在,打开一个运行的shell。db集装箱:

$ docker exec -it db bash

root@a205f0dd33b2:/# ping 172.17.0.2
ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
^C
--- 172.17.0.2 ping statistics ---
44 packets transmitted, 0 received, 100% packet loss, time 43185ms

过了一会儿,用CTRL-C结束ping你会发现ping失败了。这是因为这两个容器在不同的网络上运行。你能修好的。然后,使用exit命令关闭容器。

Docker网络允许您将容器附加到任意数量的网络上。您还可以附加一个已经在运行的容器。去吧,把你的跑步web应用程序到my_bridge...

$ docker network connect my_bridge web

二次

网络容器  |  Network containers (Engine)

二次

打开一个外壳到db再次应用程序并尝试ping命令。这一次只需使用容器名。web而不是IP地址。

$ docker exec -it db bash

root@a205f0dd33b2:/# ping web
PING web (10.0.0.2) 56(84) bytes of data.
64 bytes from web (10.0.0.2): icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from web (10.0.0.2): icmp_seq=2 ttl=64 time=0.060 ms
64 bytes from web (10.0.0.2): icmp_seq=3 ttl=64 time=0.066 ms
^C
--- web ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.060/0.073/0.095/0.018 ms

ping显示它正在联系一个不同的IP地址,该地址位于my_bridge的地址不同。bridge网络。

下一步

现在您已经知道了如何对容器进行网络连接,请参见如何管理容器中的数据...

示例,用法,体积,码头,文档,用户指南,数据,卷

引擎: 教程 | Engine: Tutorials相关

Docker 17

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

主页 https://docker.com/
源码 https://github.com/docker/docker
版本 17
发布版本 17.06