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

                         

相关文章
|
1月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
95 2
|
1月前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
6天前
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
91 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
18天前
|
安全 Docker 容器
docker的默认网络模式有哪些
Docker 默认网络模式包括:1) bridge:默认模式,各容器分配独立IP,可通过名称或IP通信;2) host:容器与宿主机共享网络命名空间,性能最优但有安全风险;3) none:容器隔离无网络配置,适用于仅需本地通信的场景。
31 6
|
21天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
54 7
|
1月前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
|
28天前
|
安全 网络安全 数据安全/隐私保护
利用Docker的网络安全功能来保护容器化应用
通过综合运用这些 Docker 网络安全功能和策略,可以有效地保护容器化应用,降低安全风险,确保应用在安全的环境中运行。同时,随着安全威胁的不断变化,还需要持续关注和研究新的网络安全技术和方法,不断完善和强化网络安全保护措施,以适应日益复杂的安全挑战。
42 5
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Docker 容器
【赵渝强老师】Docker的None网络模式
Docker容器在网络方面实现了逻辑隔离,提供了四种网络模式:bridge、container、host和none。其中,none模式下容器具有独立的网络命名空间,但不包含任何网络配置,仅能通过Local Loopback网卡(localhost或127.0.0.1)进行通信。适用于不希望容器接收任何网络流量或运行无需网络连接的特殊服务。
|
1月前
|
Docker 容器
【赵渝强老师】Docker的Host网络模式
Docker容器在网络环境中是隔离的,可通过配置不同网络模式(如bridge、container、host和none)实现容器间或与宿主机的网络通信。其中,host模式使容器与宿主机共享同一网络命名空间,提高性能但牺牲了网络隔离性。
下一篇
DataWorks