zoukankan      html  css  js  c++  java
  • 第 5 章 网络

    自定义容器网络

    除了 none, hostbridge 这三个自动创建的网络,用户也可以根据业务需要创建 user-defined 网络。

    Docker 提供三种 user-defined 网络驱动:

    • bridge
    • overlay
    • macvlan

    overlay 和 macvlan 用于创建跨主机的网络,我们后面有章节单独讨论。

    我们可通过 bridge 驱动创建类似前面默认的 bridge 网络,例如:

    1 root@ubuntu:~# docker network create --driver bridge my_net
    2 150e61912b36901d8b884e58c322186e9462933b8f87f5d7ac5531cb2d232291
    3 root@ubuntu:~# 

    查看一下当前 host 的网络结构变化:

    1 root@ubuntu:~# brctl show
    2 bridge name    bridge id        STP enabled    interfaces
    3 br-150e61912b36        8000.02426da65730    no        
    4 docker0        8000.0242841fd925    no        vetha0836f4
    5                             vethe1126ec
    6 root@ubuntu:~# 

    新增了一个网桥 br-150e61912b36,这里 150e61912b36 正好新建 bridge 网络 my_net 的短 id。执行 docker network inspect 查看一下 my_net 的配置信息:

     1 root@ubuntu:~# docker network inspect my_net 
     2 [
     3     {
     4         "Name": "my_net",
     5         "Id": "150e61912b36901d8b884e58c322186e9462933b8f87f5d7ac5531cb2d232291",
     6         "Created": "2019-02-21T03:51:25.067138843-05:00",
     7         "Scope": "local",
     8         "Driver": "bridge",
     9         "EnableIPv6": false,
    10         "IPAM": {
    11             "Driver": "default",
    12             "Options": {},
    13             "Config": [
    14                 {
    15                     "Subnet": "172.18.0.0/16",
    16                     "Gateway": "172.18.0.1"
    17                 }
    18             ]
    19         },
    20         "Internal": false,
    21         "Attachable": false,
    22         "Ingress": false,
    23         "ConfigFrom": {
    24             "Network": ""
    25         },
    26         "ConfigOnly": false,
    27         "Containers": {},
    28         "Options": {},
    29         "Labels": {}
    30     }
    31 ]
    32 root@ubuntu:~# 

    这里 172.18.0.0/16 是 Docker 自动分配的 IP 网段。

    也可以自己指定 IP 网段,只需在创建网段时指定 --subnet 和 --gateway 参数:

     1 root@ubuntu:~# docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2
     2 30f89dcc5e69a6887c8139054f39b2347c790de6da1d0460f657c7467307754b
     3 root@ubuntu:~# 
     4 root@ubuntu:~# docker network inspect my_net2 
     5 [
     6     {
     7         "Name": "my_net2",
     8         "Id": "30f89dcc5e69a6887c8139054f39b2347c790de6da1d0460f657c7467307754b",
     9         "Created": "2019-02-21T03:53:06.250744749-05:00",
    10         "Scope": "local",
    11         "Driver": "bridge",
    12         "EnableIPv6": false,
    13         "IPAM": {
    14             "Driver": "default",
    15             "Options": {},
    16             "Config": [
    17                 {
    18                     "Subnet": "172.22.16.0/24",
    19                     "Gateway": "172.22.16.1"
    20                 }
    21             ]
    22         },
    23         "Internal": false,
    24         "Attachable": false,
    25         "Ingress": false,
    26         "ConfigFrom": {
    27             "Network": ""
    28         },
    29         "ConfigOnly": false,
    30         "Containers": {},
    31         "Options": {},
    32         "Labels": {}
    33     }
    34 ]
    35 root@ubuntu:~# 

    这里我们创建了新的 bridge 网络 my_net2,网段为 172.22.16.0/24,网关为 172.22.16.1。与前面一样,网关在 my_net2 对应的网桥 br-30f89dcc5e69 上:

    1 root@ubuntu:~# ifconfig br-30f89dcc5e69
    2 br-30f89dcc5e69 Link encap:Ethernet  HWaddr 02:42:fd:21:c8:7e  
    3           inet addr:172.22.16.1  Bcast:172.22.16.255  Mask:255.255.255.0
    4           UP BROADCAST MULTICAST  MTU:1500  Metric:1
    5           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    6           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    7           collisions:0 txqueuelen:0 
    8           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

    容器要使用新的网络,需要在启动时通过 --network 指定:

     1 root@ubuntu:~# docker run -it --network=my_net2 busybox
     2 / # 
     3 / # ip a
     4 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
     5     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
     6     inet 127.0.0.1/8 scope host lo
     7        valid_lft forever preferred_lft forever
     8 80: eth0@if81: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
     9     link/ether 02:42:ac:16:10:02 brd ff:ff:ff:ff:ff:ff
    10     inet 172.22.16.2/24 brd 172.22.16.255 scope global eth0
    11        valid_lft forever preferred_lft forever
    12 / # 

    容器分配到的 IP 为 172.22.16.2。

    到目前为止,容器的 IP 都是 docker 自动从 subnet 中分配,可以通过--ip指定一个静态IP。

     1 root@ubuntu:~# docker run -it --network=my_net2 --ip 172.22.16.8 busybox
     2 / # 
     3 / # ip a
     4 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
     5     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
     6     inet 127.0.0.1/8 scope host lo
     7        valid_lft forever preferred_lft forever
     8 82: eth0@if83: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
     9     link/ether 02:42:ac:16:10:08 brd ff:ff:ff:ff:ff:ff
    10     inet 172.22.16.8/24 brd 172.22.16.255 scope global eth0
    11        valid_lft forever preferred_lft forever
    12 / # 

    注:只有使用 --subnet 创建的网络才能指定静态 IP

    my_net 创建时没有指定 --subnet,如果指定静态 IP 报错如下:

    1 root@ubuntu:~# docker run -it --network=my_net --ip 172.18.0.8 busybox
    2 docker: Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets.
    3 ERRO[0000] error waiting for container: context canceled 
    4 root@ubuntu:~# 

     

    当前 docker host 的网络拓扑结构

     

    --------------------------------引用来自---------------------------------

    https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587686&idx=1&sn=10f799f4b4c4a552871e751615b56880&chksm=8d3080ffba4709e9926d137a4cdb2a5907c96e0107481de297b071f3aabe37dbeeb0d34ef7d9&scene=21#wechat_redirect

  • 相关阅读:
    get 请求 请求参数超出请求链接最大数 解决办法
    请求被中止: 未能创建 SSL/TLS 安全通道 .NET
    <![CDATA[解析 XML 出错 (位置: /body): <unspecified file>(1): expected <]]> 微信支付统一下单
    js之new一个对象原理
    键盘事件keydown、keypress、keyup
    mongo的runCommand与集合操作函数的关系
    (3.2)狄泰软件学院C++课程学习剖析三
    PAL制式和NTSC制式的区别
    入门视频采集与处理(BT656简介)
    视频内同步与外同步有什么区别
  • 原文地址:https://www.cnblogs.com/gsophy/p/10414253.html
Copyright © 2011-2022 走看看