通过实验带你了解:docker是如何创建并打通容器网络的

本文通过实验介绍了docker如何创建并打通容器网络,涉及network namespace的隔离,veth pair连接两个namespace,bridge实现多个namespace互通,以及容器如何访问外网的原理。通过对docker网络的深入理解,有助于更好地掌握容器网络通信机制。
摘要由CSDN通过智能技术生成

作者介绍:严霞,负责产品云内DNS和云解析的架构搭建、关键功能研发工作与难点问题攻关,负责组内两套kubernetes的集群搭建与维护。对 权威DNS服务、kubernetes、spring boot、基础网络、linux底层感兴趣,欢迎一起探讨,共同进步。

概要:容器之间的网络端口是怎样隔离的?容器之间、容器与宿主机之间网络又是如何通信的?本文用实验带着大家一起了解

1. docker网络概览

首先让我们对docker网络有一个整体的了解。

docker安装完成后,都会默认分配一个172.17.0.0/16的网段。一台机器上新创建的第一个容器,一般都会给172.17.0.2这个地址。并且会创建一个docker0的网桥, 刚安装时,网桥上没有挂网卡。

[root@fnc05 ~]# brctl show docker0
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02420217fbb1       no

没经过特殊配置时,docker0这个网桥挂的地址都是172.17.0.1

[root@fnc05 ~]# ip addr
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:02:17:fb:b1 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:2ff:fe17:fbb1/64 scope link
       valid_lft forever preferred_lft forever

启动一个bridge类型的容器

[root@fnc05 ~]# docker run -dt --net=bridge --name siege-bridge1 -p 10081:80 quay.io/centminmod/docker-centos6-siege
d78665d0c7357166349c95315e89799902d6ce14f8b043ae0a71f4a7be2d3a2b

查看docker0网桥上,挂了一个veth pair的一端

[root@fnc05 ~]# brctl show docker0
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02420217fbb1       no              veth641364e

查看容器内部的network namespace情况

[root@fnc05 ~]# docker exec -it d78665d0c7357166349c95315e89799902d6ce14f8b043ae0a71f4a7be2d3a2b /bin/sh
sh-4.1# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

接下来让我们开始用实验来复盘docker创建容器网络并打通网络的过程吧

2. network namespace创建

namespace是Linux提供的一个用于隔离的技术。容器之间互相无感知,都是它的功劳。为了支持网络协议栈的多个实例(为了网络隔离),Linux在网络协议栈中引入了network namespace的概念,并提供了clone函数。docker 和 k8s就是直接调用clone函数来实现容器网络创建的。

network namespace : 隔离网络资源的一个概念。 每个network namespace都有自己的一套网络设备 ( 网卡IP、路由表、端口范围、防火墙、/proc/net目录 )。
同一个network namespace内的进程能够相互访问到, 端口不允许冲突。两个ns之间, ns与宿主机之间,网络是完全隔离的。

docker和k8s怎么处理network namespace的呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值