ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

docker容器网络

2021-10-23 11:31:56  阅读:173  来源: 互联网

标签:容器 00 bridge 网络 forever lft ff docker


docker的四种网络模式

基于docker run创建容器时,可以使用--net选项指定容器的网络模式:Docker默认有以下4种网络模式:

  1. bridge模式,使用--net=bridge指定,默认设置
  2. host模式,使用--net=host指定
  3. none模式,使用--net=none指定
  4. container模式,使用--net=container:NAME_or_ID指定

常用的是bridge模式和host模式

bridge模式网络拓扑图如下:

 docker bridge网络模式会为每个容器分配地址,当docker启动时会自动创建一个docker0的网卡,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和宿主机都放到同一个二层网络。

网桥工作在二层(OSI堆栈),是通用网络设备的一种,可以设置IP地址。有了IP地址,Linux便可通过路由表或IP表,在网络层定位网桥,这就相当于有了一个虚拟网卡,即docker0。

[root@node1 ~]# ip a show docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:78:8c:4b:0c brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:78ff:fe8c:4b0c/64 scope link 
       valid_lft forever preferred_lft forever

  

当docker容器启动时会在宿主机上创建一对虚拟网卡veth pair设备。veth pair设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth pair设备会连接容器和docker0网桥。

在容器启动时,Docker引擎将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在宿主机中,以veth***这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过bridge link命令查看。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

 

查看docker的网络模式

docker network  ls

[root@node1 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
27658af758a0   bridge    bridge    local
6fb339ac4884   host      host      local
cabb999b64f2   none      null      local

查看连接到bridge网桥的容器信息

docker network inspect bridge

[root@node1 ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "27658af758a0f0636924199eb34cc9893833bb185ff48f654618c2c778906f61",
        "Created": "2021-10-20T21:28:08.694911039+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,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "b713aabd323d03a2d158dacdad210a13335e35c81f73fa63347d073b964dcc41": {
                "Name": "dazzling_raman",
                "EndpointID": "7bfb04c7f54eb298a7e8ee47a1c7f8f1adc2a63628d04b40dfba9e017c3134bd",
                "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": {}
    }
]

总结:docker的bridge网络模式采用的是linux bridge,veth pair ,iptables

docker的host网络模式

host模式网络拓扑如下:

docker的host网络模式其实就是容器和主机host共享一个网络,容器完全使用主机的网络,不对网络容器做任何隔离,优点是性能好,缺点是容器网络缺少隔离性,增加风险,由于容器和宿主机使用同一网络,当宿主机容器多时,网络资源会受到限制。

运行一个容器时使用--network host可以指定网络模式,默认是bridge模式。

[root@node1 ~]# docker run -dt --name centos1 --network host centos
329d642084839644edee52d9cfcf9e0e3401d27715e03ab116ff6ff809c813d1

 当我们进入容器后使用ip a 查看网卡信息的时候跟宿主机是一样的

[root@node1 ~]# docker exec -it centos1 bash
[root@node1 /]# ip a
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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ea:64:2c brd ff:ff:ff:ff:ff:ff
    inet 192.168.41.140/24 brd 192.168.41.255 scope global dynamic noprefixroute ens33
       valid_lft 1278sec preferred_lft 1278sec
    inet6 fe80::5451:a974:cdec:42fa/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:78:8c:4b:0c brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:78ff:fe8c:4b0c/64 scope link 
       valid_lft forever preferred_lft forever
21: veth3a1fcf0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 02:b0:f3:7d:59:58 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::b0:f3ff:fe7d:5958/64 scope link 
       valid_lft forever preferred_lft forever

docker的none网络模式

docker的none网络模式会使容器禁用网络功能,只保留一个回环网卡。none模式不参与网络配置,如果想针对none模式做网络配置,需要第三方的服务。none模式使容器不再局限于docker自带的网络模式。

创建一个容器指定网络模式是none

[root@node1 ~]# docker run -dt --name centos2 --network none centos
ec1ff13482af75689039dbc8d02678c4bf38c8dceb298f5f6f37e8932eda8650

  进入容器查看网卡信息,只有一个lo网卡

[root@node1 ~]# docker exec -it centos2 bash
[root@ec1ff13482af /]# ip a
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
[root@ec1ff13482af /]# 

docker的container模式 

container模式网络拓扑图如下:

 docker的container模式就是在容器创建时指定另一个容器,与它共享一个网络

[root@node1 ~]# docker run -dt --name centos3 --network container:centos1 centos
4a32d8865bcb570dad5f448f536acb47103e288466d3b8d33fd317c128e42e0b
[root@node1 ~]# docker exec -it centos3 ip a
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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ea:64:2c brd ff:ff:ff:ff:ff:ff
    inet 192.168.41.140/24 brd 192.168.41.255 scope global dynamic noprefixroute ens33
       valid_lft 1538sec preferred_lft 1538sec
    inet6 fe80::5451:a974:cdec:42fa/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:78:8c:4b:0c brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:78ff:fe8c:4b0c/64 scope link 
       valid_lft forever preferred_lft forever
21: veth3a1fcf0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 02:b0:f3:7d:59:58 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::b0:f3ff:fe7d:5958/64 scope link 
       valid_lft forever preferred_lft forever

  由于centos3与centos1共用一个网络,所以也是host模式

 

 通过docker inspect centos1 | grep NetworkMode查看 centos1的网络模式是host,同样查看centos3的网络模式是container模式,但是指向的是centos1的容器ID,所以centos1与centos3共用一个网络。

 docker的自定义网络和网络连接

docker network 命令用法

Commands:
  connect     Connect a container to a network                       #将容器连接到网络
  create      Create a network                                       #创建一个网络
  disconnect  Disconnect a container from a network                  #断开容器与网络的连接
  inspect     Display detailed information on one or more networks   #显示一个或多个网络的详细信息
  ls          List networks                                          #列出网络
  prune       Remove all unused networks                             #删除所有未使用的网络
  rm          Remove one or more networks                            #删除一个或多个网络

  创建一个网络

[root@node1 ~]# docker network create -d bridge --subnet 192.168.0.1/16 --gateway 192.168.1.0 mybr
54d8d1e974d4a454a67026ead4a4e53f633b6c708df69f1a6cc859183fb0893e
解析:
-d;--driver bridge 表示使用桥接模式,默认是桥接模式,也可以设置其他模式
--subnet 192.168.1.0/16 表示子网ip 可以分配 192.168.1.2 到 192.168.255.255 非必要指定,如不指定系统自动生成
--gateway 192.168.1.0 表示网关  非必要指定,同上
mybr 表示网络名

  查看网络

[root@node1 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
27658af758a0   bridge    bridge    local
6fb339ac4884   host      host      local
54d8d1e974d4   mybr      bridge    local
cabb999b64f2   none      null      local

  查看自定义网络信息

[root@node1 ~]# docker network inspect mybr
[
    {
        "Name": "mybr",
        "Id": "54d8d1e974d4a454a67026ead4a4e53f633b6c708df69f1a6cc859183fb0893e",
        "Created": "2021-10-21T23:16:48.884388011+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.1/16",           #这个是我们自定义网络的IP
                    "Gateway": "192.168.1.0"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

  使用自定义网络中的网桥创建容器

[root@node1 ~]# docker run -dt -P --name centos4 --net mybr centos 
8c84d24b4a3493d8f6c68877a80e848ca57fc030637304fac4f05512aeae60da

  进入容器查看网卡信息

[root@node1 ~]# docker exec -it centos4 bash
[root@8c84d24b4a34 /]# ip a
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
27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
link/ether 02:42:c0:a8:00:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.0.1/16 brd 192.168.255.255 scope global eth0
valid_lft forever preferred_lft forever

  容器间网络连通

 首先创建一个名为lizf的容器

[root@node1 ~]# docker run -dt --name lizf centos bash
f462aa750e0fa301afc711e19785ca700578fdf94966659d16580fe6976a9569

  然后将lizf容器连接到mybr网桥上

[root@node1 ~]# docker network connect mybr lizf

  然后查看mybr网桥的信息,发现lizf容器已经连接上了

[root@node1 ~]# docker network inspect mybr
[
    {
        "Name": "mybr",
        "Id": "54d8d1e974d4a454a67026ead4a4e53f633b6c708df69f1a6cc859183fb0893e",
        "Created": "2021-10-21T23:16:48.884388011+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.1/16",
                    "Gateway": "192.168.1.0"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "8c84d24b4a3493d8f6c68877a80e848ca57fc030637304fac4f05512aeae60da": {
                "Name": "centos4",
                "EndpointID": "73dccbaf3dc6a9f24d8d7d930a26ebb3629184cd7bbbb5553f4331ac7759ec0d",
                "MacAddress": "02:42:c0:a8:00:01",
                "IPv4Address": "192.168.0.1/16",
                "IPv6Address": ""
            },
            "f462aa750e0fa301afc711e19785ca700578fdf94966659d16580fe6976a9569": {
                "Name": "lizf",
                "EndpointID": "2462af6ff408950ec0dbeb2d902987a9b2bb8b6b660dcb74da1918adb075692c",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

  目前centos4和lizf这两个容器都连接到了mybr这个网桥上了,可以实现网络间的互通,登陆centos4容器ping一下lizf

[root@node1 ~]# docker exec -it centos4 ping -c 2 lizf
PING lizf (192.168.0.2) 56(84) bytes of data.
64 bytes from lizf.mybr (192.168.0.2): icmp_seq=1 ttl=64 time=0.277 ms
64 bytes from lizf.mybr (192.168.0.2): icmp_seq=2 ttl=64 time=0.097 ms

--- lizf ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.097/0.187/0.277/0.090 ms

 将lizf这个容器从mybr网桥上断开

docker network disconnect  mybr  lizf

[root@node1 ~]# docker network disconnect mybr lizf
[root@node1 ~]# docker network inspect mybr
[
    {
        "Name": "mybr",
        "Id": "54d8d1e974d4a454a67026ead4a4e53f633b6c708df69f1a6cc859183fb0893e",
        "Created": "2021-10-21T23:16:48.884388011+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.1/16",
                    "Gateway": "192.168.1.0"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "8c84d24b4a3493d8f6c68877a80e848ca57fc030637304fac4f05512aeae60da": {
                "Name": "centos4",
                "EndpointID": "73dccbaf3dc6a9f24d8d7d930a26ebb3629184cd7bbbb5553f4331ac7759ec0d",
                "MacAddress": "02:42:c0:a8:00:01",
                "IPv4Address": "192.168.0.1/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

  此时容器lizf已经从mybr网桥断开了

端口映射(容器可以被外部访问)

这里要注意的一点是,如果是nat网桥必须开启核心转发功能

[root@jiaqi211 ~]# cat /proc/sys/net/ipv4/ip_forward
1

第一种 随机映射

docker run -p PORT 

示例,我们把容器的80端口随机映射到宿主机上,我们可以看到映射到的宿主机端口为32769

[root@jiaqi211 ~]# docker run --name mynginx -p 80 -itd --rm nginx
5bea3c77aaee1c4a3d7e7617838697a3745b9ae3e74e7088e30ad86fe7cdbecc
[root@jiaqi211 ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
5bea3c77aaee        nginx               "nginx -g 'daemon of…"   4 seconds ago       Up 3 seconds        0.0.0.0:32769->80/tcp   mynginx

我们来验证一下,打开浏览器HOST:PORT

 

 

第二种 指定映射

-p hostPort:containerPort
-p ip:hostPort:containerPort
-p ip::containerPort
-p hostPort

我们也可以指定映射,比如,映射宿主机的80端口对应容器的80端口

[root@jiaqi211 ~]# docker run --name mynginx -p 80:80 -itd nginx                
2326a68c58546ec19c4c5c971662f45d5166cb13bbc56f11d849f146fba6f473
[root@jiaqi211 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2326a68c5854 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp mynginx

验证

 

标签:容器,00,bridge,网络,forever,lft,ff,docker
来源: https://www.cnblogs.com/xiaozhi1223/p/15431415.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有