Docker 与 K8S学习笔记(七)—— 容器的网络

简介: 本节我们来看看Docker网络,我们这里主要讨论单机docker上的网络。当docker安装后,会自动在服务器中创建三种网络:none、host和bridge,接下来我们分别了解下这三种网络: $ sudo docker network ls NETWORK ID NAME DRIVER SCOPE

Docker 与 K8S学习笔记(七)—— 容器的网络


本节我们来看看Docker网络,我们这里主要讨论单机docker上的网络。当docker安装后,会自动在服务器中创建三种网络:none、host和bridge,接下来我们分别了解下这三种网络:


$ sudo docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
528c3d49c302   bridge    bridge    local
464b3d11003c   host      host      local
faa8eb8310b4   none      null      local


一、none网络


none网络就是什么都没有的网络,使用此网络的容器除了lo没有其他任何网卡,所以此容器不提供任何网络服务,也无法访问其它容器,那么这种封闭网络有什么用呢?这个一般会用于对网络安全要求较高并且不需要联网的应用。


$ sudo docker run -it --network=none busybox
/ # ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


二、host网络


使用host网络的容器将共享docker host的网络栈,容器的网络配置与host一样。大家可以发现,使用此网络的容器能看到服务器所有网卡,这种网络模式的使用场景是那些对网络传输效率要求较高的应用,当然此模式也存在不够灵活的问题,例如端口冲突问题。


$ sudo docker run -it --network=host busybox
/ # ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:6B:5A:FC:54
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:1526 (1.4 KiB)
ens33     Link encap:Ethernet  HWaddr 00:0C:29:D5:73:1C
          inet addr:172.16.194.135  Bcast:172.16.194.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fed5:731c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:32097 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20666 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:24596169 (23.4 MiB)  TX bytes:9708382 (9.2 MiB)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:270 errors:0 dropped:0 overruns:0 frame:0
          TX packets:270 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:24089 (23.5 KiB)  TX bytes:24089 (23.5 KiB)


三、bridge网络


Docker安装时会创建一个名为docker0的网桥(使用brctl工具可以查看Linux下所有网桥),容器启动时如果不指定--network则默认都是bridge网络。


$ brctl show
bridge name  bridge id    STP enabled  interfaces
docker0    8000.02426b5afc54  no


此时我们启动一个Nginx容器看看该网桥的变化:


$ sudo docker run -d nginx
27644bd64114482f58adc47a52d3f768732c0396ca0eda8f13e68b10385ea359
$ brctl show
bridge name  bridge id    STP enabled  interfaces
docker0    8000.0242cef1fc32  no    vethe21ab12


我们可以看到此时一个新的网络接口vethe21ab12挂到docker0上,vethe21ab12就是Nginx容器的虚拟网卡。我们接着去Nginx容器中看看网络配置情况:


$ sudo docker exec -it 27644bd64114 bash
root@27644bd64114:/# 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
45: eth0@if46: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever


我们看到容器中有一个网卡eth0@if46,为什么不是vethe21ab12呢?实际上,eth0@if46和vethe21ab12是一对veth-pair,那什么是veth-pair呢?


veth-pair是一种虚拟设备接口,它是成对出现的,一端连着协议栈,一端彼此相连着,在本例中大家可以想象成它们是由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if46)在容器里,另一头(vethe21ab12)挂在网桥docker0上,最终的效果就是把eth0@if46也挂在docker0上。


我们还能看到这个容器中eth0@if46配置的ip是172.17.0.2,为什么是这个网段呢?我们看下网桥的网络配置:


$ sudo docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "6f0087fd32cd0e3b4a7ef1133e2f5596a2e74429cf5240e42012af85d1146b9f",
        "Created": "2021-10-17T06:43:11.849460184Z",
        "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": {
            "27644bd64114482f58adc47a52d3f768732c0396ca0eda8f13e68b10385ea359": {
                "Name": "lucid_moore",
                "EndpointID": "b6c9de5a52e2f0b858a6dbf6c8e51b535aec3500fca7d1f1dcca98613e57dabd",
                "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": {}
    }
]
$ ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:ceff:fef1:fc32  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ce:f1:fc:32  txqueuelen 0  (Ethernet)
        RX packets 2827  bytes 115724 (115.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3853  bytes 10144700 (10.1 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


原来网桥的网络配置的subnet就是172.17.0.0,网关则是172.17.0.1。这个网关就在docker0上,所以当前容器网络拓扑图如下:


 

四、后记


大家在进行本篇的实验时,可能会遇到如下问题:


1、进入Nginx容器后,没有ip命令?

这个命令需要自行在容器中安装:apt-get install iproute2


2、安装iproute2时发现容器无法连接网络。


首先我们需要重建docker0网络:


$ sudo pkill docker
$ sudo iptables -t nat -F
$ sudo ifconfig docker0 down
$ sudo btctl delbr docker0
$ sudo systemctl restart docker


接着启动容器并进入容器,更新软件源:


root@27644bd64114:/# apt-get update
Get:1 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Get:2 http://deb.debian.org/debian buster InRelease [122 kB]
Get:3 http://security.debian.org/debian-security buster/updates/main amd64 Packages [307 kB]
Get:4 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Get:5 http://deb.debian.org/debian buster/main amd64 Packages [7906 kB]
Get:6 http://deb.debian.org/debian buster-updates/main amd64 Packages [15.2 kB]
Fetched 8467 kB in 14s (603 kB/s)
Reading package lists... Done


最后安装iproute2即可。

分类: 容器技术

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
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地址、网络接口列表及测试容器启动验证修复效果。
1964 39
|
存储 Linux 容器
【Container App】在容器中抓取网络包的方法
本文介绍在Azure Container App中安装tcpdump抓取网络包,并通过Storage Account上传抓包文件的方法。内容包括使用curl和nc测试外部接口连通性、长Ping端口、安装tcpdump、抓取网络包、以及通过crul命令上传文件至Azure Storage。适用于需要分析网络请求和排查网络问题的场景。
355 0
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
651 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
602 12
|
监控 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
624 20
|
Kubernetes Cloud Native 区块链
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
485 0
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
1195 2
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
1543 8
|
安全 Docker 容器
docker的默认网络模式有哪些
Docker 默认网络模式包括:1) bridge:默认模式,各容器分配独立IP,可通过名称或IP通信;2) host:容器与宿主机共享网络命名空间,性能最优但有安全风险;3) none:容器隔离无网络配置,适用于仅需本地通信的场景。
772 6

相关产品

  • 容器服务Kubernetes版