【云原生】· 一文了解docker中的网络

简介: 【云原生】· 一文了解docker中的网络

       根据前面的学习,已经对docker有了一些简单的概念。这里在啰嗦一句,容器是一个独立的环境,可以理解为一个小型的linux系统(但不要把它当真正的系统),而docker的网络分为三种分别为bridge、host、none。

bridge:默认网络,可以ping通外网,但是外网无法访问内网。

host:跟本地主机host使用的同一个网络。

none:没有网络,挂载网络下的容器除了lo,没有其他网卡。

查看docker网络

docker安装时会自动在网络中创建三个网络,通过下面命令查看,默认网络是bridge。

1. [root@doc11 ~]# docker network ls
2. NETWORK ID     NAME      DRIVER    SCOPE
3. 7d96a5075951   bridge    bridge    local
4. 32cea9efbc61   host      host      local
5. 4341e5f3526d   none      null      local

bridge网络

       docker安装的时候会创建一个名为docker0的linux bridge。如果不指定network,创建容器默认都挂在docker0上。

1. [root@doc11 ~]# brctl show
2. bridge name     bridge id               STP enabled     interfaces
3. docker0         8000.0242c661a50d       no

       当docker0上没有任何网络设备,我们创建一个容器看看有什么变化。这里以httpd为例,没有镜像的话使用docker pull httpd下载一个。

1. [root@doc11 ~]# docker run -d httpd
2. dbd6e608e12332df931f8b010e8ea0c2404856d06b24c500bbf1bd551e590a70
3. [root@doc11 ~]# brctl show
4. bridge name     bridge id               STP enabled     interfaces
5. docker0         8000.0242c661a50d       no              vethd3c5074

       通过上面的命令可以看到,一个新的网络接口vethd3c5074被挂到了docker0上,vethd3c5074就是新创建容器的虚拟网卡。

none网络

       我们看一下none网络,它就是一个完全隔离的网络。对于安全性要求高且不需要联网的应用可以使用none网络,比如某个容器的唯一用途就是生成随机密码,就可以放到none网络中避免密码被窃取。

1. [root@doc11 ~]# docker run -it --network=none busybox
2. / # ifconfig 
3. lo        Link encap:Local Loopback  
4.           inet addr:127.0.0.1  Mask:255.0.0.0
5.           UP LOOPBACK RUNNING  MTU:65536  Metric:1
6.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
7.           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
8.           collisions:0 txqueuelen:1000 
9.           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
10. 
11. / #

host网络

       连接到host网络的容器共享docker host的网络,容器的网络配置与host完全一样。容器中可以看到host的所有网卡,hostname也是host的。

1. [root@doc11 ~]# docker run -it --network=host busybox
2. / # ip a
3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
4.    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5.     inet 127.0.0.1/8 scope host lo
6.        valid_lft forever preferred_lft forever
7.     inet6 ::1/128 scope host 
8.        valid_lft forever preferred_lft forever
9. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
10.    link/ether 00:0c:29:74:01:52 brd ff:ff:ff:ff:ff:ff
11.     inet 192.168.8.11/24 brd 192.168.8.255 scope global noprefixroute ens33
12.        valid_lft forever preferred_lft forever
13.     inet6 fe80::62ba:6b5b:2f04:4aef/64 scope link noprefixroute 
14.        valid_lft forever preferred_lft forever
15. 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue 
16.    link/ether 02:42:c6:61:a5:0d brd ff:ff:ff:ff:ff:ff
17.     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
18.        valid_lft forever preferred_lft forever
19.     inet6 fe80::42:c6ff:fe61:a50d/64 scope link
20.        valid_lft forever preferred_lft forever
21. / # hostname
22. doc11
23. / #

那么host网络的使用场景是什么呢?

       直接使用host的网络最大的好处就是性能,如果容器对网络传输效率有较高的要求,可以选择host网络。当然也是有一些缺点的,比如要考虑端口冲突问题,如果host上已经使用的端口,容器内就不能使用了。

自定义容器网络

       除了上面三种网络,用户也可以根据也无需求创建user-defined网络。docker提供了三种user-defined网络驱动 :bridge,overlay和macvlan。overlay和macvlan用于创建跨主机网络。

我们通过bridge驱动创建类似bridge网络。

1. [root@doc11 ~]# docker network create --driver bridge my_net
2. ce55c3cfefb5138572dcf58a8a1a81805415543b69893f2899ba37f18c2641fb
3. [root@doc11 ~]# brctl show
4. bridge name     bridge id               STP enabled     interfaces
5. br-ce55c3cfefb5         8000.0242c21d4aba       no
6. docker0         8000.0242c661a50d       no

       新增一个网桥br-ce55c3cfefb5,这里br-ce55c3cfefb5正好新建bridge网络my_net的短id。下面命令查看my_net的配置信息。

1. [root@doc11 ~]# docker network inspect my_net
2. [
3.     {
4.        "Name": "my_net",
5.        "Id": "ce55c3cfefb5138572dcf58a8a1a81805415543b69893f2899ba37f18c2641fb",
6.        "Created": "2023-06-19T02:46:15.02356553-04: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. ]

上述172.18.0.0/16是docker自动分配的IP网段,我们可以自己指定网段。

只需要创建的时候指定--subnet和--gateway参数

1. [root@doc11 ~]# docker network create --driver bridge --subnet 172.66.66.0/24 --gateway 172.66.66.1 my_net2
2. 0f463941f2aa09619d41ccde1adb96a04af9228851c7c6eea5ddd0c24b54700b
3. [root@doc11 ~]# docker network inspect my_net2
4. [
5.     {
6.        "Name": "my_net2",
7.        "Id": "0f463941f2aa09619d41ccde1adb96a04af9228851c7c6eea5ddd0c24b54700b",
8.        "Created": "2023-06-19T02:50:57.224944386-04:00",
9.        "Scope": "local",
10.        "Driver": "bridge",
11.        "EnableIPv6": false,
12.        "IPAM": {
13.            "Driver": "default",
14.            "Options": {},
15.            "Config": [
16.                 {
17.                    "Subnet": "172.66.66.0/24",
18.                    "Gateway": "172.66.66.1"
19.                 }
20.             ]
21.         },
22.        "Internal": false,
23.        "Attachable": false,
24.        "Ingress": false,
25.        "ConfigFrom": {
26.            "Network": ""
27.         },
28.        "ConfigOnly": false,
29.        "Containers": {},
30.        "Options": {},
31.        "Labels": {}
32.     }
33. ]

       上面新建的bridge网络my_net2,网段为172.66.66.0/24,网关为172.66.66.1,网关在my_net2对应的网桥br-0f463941f2aa上面。

1. [root@doc11 ~]# brctl show
2. bridge name     bridge id               STP enabled     interfaces
3. br-0f463941f2aa         8000.02426b2b8eb7       no
4. br-ce55c3cfefb5         8000.0242c21d4aba       no
5. docker0         8000.0242c661a50d       no
6. [root@doc11 ~]# ifconfig br-0f463941f2aa
7. br-0f463941f2aa: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
8.         inet 172.66.66.1  netmask 255.255.255.0  broadcast 172.66.66.255
9.         ether 02:42:6b:2b:8e:b7  txqueuelen 0  (Ethernet)
10.         RX packets 0  bytes 0 (0.0 B)
11.         RX errors 0  dropped 0  overruns 0  frame 0
12.         TX packets 0  bytes 0 (0.0 B)
13.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

       我们来看看网络怎么使用吧,大概可以猜到想到,使用方法和上面的相同,使用--network参数指定网络。(因为使用的虚拟机环境恢复快照了,重新下载了一下busybox)

1. [root@doc11 ~]# docker run -it --network=my_net2 busybox
2. Unable to find image 'busybox:latest' locally
3. latest: Pulling from library/busybox
4. 5cc84ad355aa: Pull complete 
5. Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
6. Status: Downloaded newer image for busybox:latest
7. / # ip a
8. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
9.    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
10.     inet 127.0.0.1/8 scope host lo
11.        valid_lft forever preferred_lft forever
12. 6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
13.    link/ether 02:42:ac:42:42:02 brd ff:ff:ff:ff:ff:ff
14.     inet 172.66.66.2/24 brd 172.66.66.255 scope global eth0
15.        valid_lft forever preferred_lft forever
16. / #

可以看到上面的网络是172.66.66.2/24,也可以通过--ip指定一个静态ip。

1. [root@doc11 ~]# docker run -it --network=my_net2 --ip 172.66.66.66 busybox
2. / # ip a
3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
4.    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5.     inet 127.0.0.1/8 scope host lo
6.        valid_lft forever preferred_lft forever
7. 8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
8.    link/ether 02:42:ac:42:42:42 brd ff:ff:ff:ff:ff:ff
9.     inet 172.66.66.66/24 brd 172.66.66.255 scope global eth0
10.        valid_lft forever preferred_lft forever

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

                         

相关文章
|
22天前
|
Linux 应用服务中间件 虚拟化
一文了解Docker之网络模型
Docker是一种容器化平台,它提供了一种轻量级的虚拟化解决方案,使得应用程序能够以容器的形式运行。在Docker中,每个容器都有自己的网络栈,可以与其他容器或主机进行通信。Docker网络模型为容器提供了灵活的网络配置和连接选项。 Docker网络模型基于Linux内核的网络命名空间和虚拟以太网桥技术。每个Docker容器都有自己的网络命名空间,这意味着每个容器都有自己的网络接口、IP地址和路由表。Docker还提供了一些网络驱动程序,用于实现容器之间的通信和与外部网络的连接。
|
1月前
|
存储 网络协议 Linux
深入剖析docker核心技术(namespace、cgroups、union fs、网络)(二)
深入剖析docker核心技术(namespace、cgroups、union fs、网络)(二)
31 0
|
1月前
|
Linux 调度 虚拟化
深入剖析docker核心技术(namespace、cgroups、union fs、网络)(一)
深入剖析docker核心技术(namespace、cgroups、union fs、网络)(一)
87 0
|
1月前
|
网络协议 Unix Linux
docker网络模式详解及容器间网络通信
docker网络模式详解及容器间网络通信
54 0
|
1月前
|
Linux 网络架构 Docker
Docker 网络详解
Docker 网络详解
|
1月前
|
Ubuntu 应用服务中间件 nginx
Docker 网络
Docker 网络
37 0
|
2月前
|
网络协议 关系型数据库 MySQL
docker网络和docker compose
docker网络和docker compose
|
2月前
|
存储 监控 数据安全/隐私保护
Docker网络模式:深度理解与容器网络配置
Docker 的网络模式是容器化应用中一个关键而复杂的方面。本文将深入讨论 Docker 的网络模式,包括基本概念、常用网络模式以及高级网络配置,并通过更为丰富和实际的示例代码,帮助读者全面掌握如何理解和配置容器网络。
|
2月前
|
存储 Cloud Native 数据安全/隐私保护
[云原生] Docker 入门指南:镜像、容器、卷和网络解析
[云原生] Docker 入门指南:镜像、容器、卷和网络解析
|
2月前
|
NoSQL Java 应用服务中间件
docker基本命令学习 | Docker网络、Docker镜像发布
docker基本命令学习 | Docker网络、Docker镜像发布
69 0