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

                         

相关文章
|
25天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
82 2
|
23天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
2月前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
36 5
|
2月前
|
调度 Docker 容器
docker swarm创建覆盖网络
【10月更文挑战第16天】
35 5
|
1月前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
49 3
|
27天前
|
Docker 容器
【赵渝强老师】Docker的None网络模式
Docker容器在网络方面实现了逻辑隔离,提供了四种网络模式:bridge、container、host和none。其中,none模式下容器具有独立的网络命名空间,但不包含任何网络配置,仅能通过Local Loopback网卡(localhost或127.0.0.1)进行通信。适用于不希望容器接收任何网络流量或运行无需网络连接的特殊服务。
|
27天前
|
Docker 容器
【赵渝强老师】Docker的Host网络模式
Docker容器在网络环境中是隔离的,可通过配置不同网络模式(如bridge、container、host和none)实现容器间或与宿主机的网络通信。其中,host模式使容器与宿主机共享同一网络命名空间,提高性能但牺牲了网络隔离性。
|
27天前
|
Kubernetes Docker 容器
【赵渝强老师】Docker的Container网络模式
Docker容器在网络环境中彼此隔离,但可通过配置不同网络模式实现容器间通信。其中,container模式使容器共享同一网络命名空间,通过localhost或127.0.0.1互相访问,提高传输效率。本文介绍了container模式的特点及具体示例。
|
27天前
|
Linux Docker 容器
【赵渝强老师】Docker的Bridge网络模式
本文介绍了Docker容器的网络隔离机制及其四种网络模式:bridge、container、host和none。重点讲解了默认的bridge模式,通过示例演示了如何创建自定义bridge网络并配置容器的网络信息。文中还附有相关图片和视频讲解,帮助读者更好地理解Docker网络的配置和使用方法。
|
5天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。