设为首页 收藏本站
查看: 1099|回复: 0

[经验分享] docker 之网络配置

[复制链接]
发表于 2019-2-21 11:02:19 | 显示全部楼层 |阅读模式
Docker 网络实现
  首先,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)来收发数据包;此外,如果不同子网之间要进行通信,需要路由机制。
  Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势之一是转发效率较高。
Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中。对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多。

  
  Docker 容器网络就利用了这项技术。它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通(这样的一对接口叫做 veth pair)。
创建网络参数
  Docker 创建一个容器的时候,会执行如下操作:

  •   创建一对虚拟接口,分别放到本地主机和新容器中;
  •   本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 veth65f9;
  •   容器一端放到新容器中,并修改名字作为 eth0,这个接口只在容器的名字空间可见;
  •   从网桥可用地址段中获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 veth65f9。
  完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络。
  可以在 docker run 的时候通过 --net 参数来指定容器的网络配置,有4个可选值:

  •   --net=bridge 这个是默认值,连接到默认的网桥。
  •   --net=host 告诉 Docker
    不要将容器网络放到隔离的名字空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其
    它 root 进程一样可以打开低范围的端口,可以访问本地网络服务比如
    D-bus,还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 --privileged=true,容器会被允许直接配置主机的网络堆栈。

  •   --net=container:NAME_or_ID 让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 lo 环回接口通信。
  •   --net=none 让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置。
四种单节点网络模式
1、bridge 模式
  Docker 容器默认使用 bridge 模式的网络。其特点如下:

  •   使用一个 linux bridge,默认为 docker0
  •   使用 veth 对,一头在容器的网络 namespace 中,一头在 docker0 上
  •   该模式下Docker Container不具有一个公有IP,因为宿主机的IP地址与veth pair的 IP地址不在同一个网段内
  •   Docker采用 NAT 方式,将容器内部的服务监听的端口与宿主机的某一个端口port 进行“绑定”,使得宿主机以外的世界可以主动将网络报文发送至容器内部
  •   外界访问容器内的服务时,需要访问宿主机的 IP 以及宿主机的端口 port
  •   NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。
  •   容器拥有独立、隔离的网络栈;让容器和宿主机以外的世界通过NAT建立通信
  
2、Host 模式
  定义:
Host
模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络
namespace,故 Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker
Container的 IP 地址即为宿主机 eth0 的 IP 地址。其特点包括:


  •   这种模式下的容器没有隔离的 network namespace
  •   容器的 IP 地址同 Docker host 的 IP 地址
  •   需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突
  •   host 模式能够和其它模式共存
  

3、container 模式
  定义:
Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。  

  

4、none 模式
  定义:
网络模式为 none,即不为 Docker 容器构造任何网络环境。一旦Docker容器采用了none 网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。Docker
Container的none网络模式意味着不给该容器创建任何网络环境,容器只能使用127.0.0.1的本机网络。

  实验:
  rhel7.3  172.25.12.250(物理机)
  启动一个容器,不指定时,容器默认使用 bridge 模式
  [root@foundation12 ~]# docker run -it --name web ubuntu


  
  查看物理机
  
  物理机桥接情况

  
设定为none 模式
  [root@foundation12 ~]# docker run -it --name vm1 --net none ubuntu
  

  
  查看PID:
  [root@foundation12 ~]# docker inspect -f '{{.State.Pid}}' vm1
  
  
  
  虚拟化网络都是基于netns 实现,netns 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables等。总之,与网络有关的组件都是独立的。
ip [ OPTIONS ] netns  { COMMAND | help }

ip netns list - show all of the named network namespaces     列出所有名称空间
ip netns add NETNSNAME - create a new named network namespace     创建一个新的名称空间
ip netns delete NETNSNAME - delete the name of a network namespace     删除一个名称空间
ip netns exec NETNSNAME cmd ... - Run cmd in the named network namespace     在网络名称空间中执行系统命令

  eg:
  
  
  [root@foundation12 netns]# ip link add name veth0 type veth peer name veth1  添加网口到namespace(创建端口对)
  在当前namespace可以看到veth0和veth1   

  [root@foundation12 ~]# ip link list  查看端口对


  

  [root@foundation12 netns]# brctl addif docker0 veth0   将veth0加入docker0这个网桥
  

  默认网桥都是down的,置为up状态
  [root@foundation12 netns]# ip addr


  [root@foundation12 netns]#  ip link set up veth0
[root@foundation12 netns]# ip link set up veth1


  
  
  [root@foundation12 netns]# ip link set veth1 netns 4943  增加端口到namespace
  查看net namespace

  
  修改名字,添加IP和网关

  [root@foundation12 netns]# ip netns exec 4943 ip link set veth1 name eth0
[root@foundation12 netns]# ip netns exec 4943 ip link set up eth0
[root@foundation12 netns]# ip netns exec 4943 ip addr add 172.17.0.100/24 dev eth0
[root@foundation12 netns]# ip netns exec 4943 ip route add default via 172.17.0.1

  如下效果,none网络变得可以通信

  




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675262-1-1.html 上篇帖子: Docker 私有仓库搭建 下篇帖子: docker 仓库及镜像的上传下载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表