【云原生】· 一文了解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。

                         

相关文章
|
3月前
|
Docker 容器
Docker网关冲突导致容器启动网络异常解决方案
当执行`docker-compose up`命令时,服务器网络可能因Docker创建新网桥导致IP段冲突而中断。原因是Docker默认的docker0网卡(172.17.0.1/16)与宿主机网络地址段重叠,引发路由异常。解决方法为修改docker0地址段,通过配置`/etc/docker/daemon.json`调整为非冲突段(如192.168.200.1/24),并重启服务。同时,在`docker-compose.yml`中指定网络模式为`bridge`,最后通过检查docker0地址、网络接口列表及测试容器启动验证修复效果。
|
4月前
|
Kubernetes Cloud Native 区块链
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
145 0
|
9月前
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
335 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
6月前
|
负载均衡 容灾 Cloud Native
云原生应用网关进阶:阿里云网络ALB Ingress 全面增强
云原生应用网关进阶:阿里云网络ALB Ingress 全面增强
164 6
|
7月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
199 20
|
10月前
|
安全 网络安全 数据安全/隐私保护
利用Docker的网络安全功能来保护容器化应用
通过综合运用这些 Docker 网络安全功能和策略,可以有效地保护容器化应用,降低安全风险,确保应用在安全的环境中运行。同时,随着安全威胁的不断变化,还需要持续关注和研究新的网络安全技术和方法,不断完善和强化网络安全保护措施,以适应日益复杂的安全挑战。
295 61
|
8月前
|
负载均衡 容灾 Cloud Native
云原生应用网关进阶:阿里云网络ALB Ingress 全能增强
在过去半年,ALB Ingress Controller推出了多项高级特性,包括支持AScript自定义脚本、慢启动、连接优雅中断等功能,增强了产品的灵活性和用户体验。此外,还推出了ingress2Albconfig工具,方便用户从Nginx Ingress迁移到ALB Ingress,以及通过Webhook服务实现更智能的配置校验,减少错误配置带来的影响。在容灾部署方面,支持了多集群网关,提高了系统的高可用性和容灾能力。这些改进旨在为用户提供更强大、更安全的云原生网关解决方案。
1170 25
|
9月前
|
安全 Docker 容器
docker的默认网络模式有哪些
Docker 默认网络模式包括:1) bridge:默认模式,各容器分配独立IP,可通过名称或IP通信;2) host:容器与宿主机共享网络命名空间,性能最优但有安全风险;3) none:容器隔离无网络配置,适用于仅需本地通信的场景。
402 6
|
9月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
912 7
|
10月前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。

热门文章

最新文章