docker网络

一、docker网络简介

          docker网络从覆盖范围可分为单个host上的容器网络和跨多个host网络

      docker安装时会自动在host上创建三个网络,我们可以用docker network ls查看

docker network ls

 

  1.none网络

     none网络就是什么都没有的网络,挂在这个网络下的容器除了lo,没有其他任何网卡,容器创建时,可以通过--network=none指定none网络。

docker run -it --network=none busybox

   封闭意味着隔离,一些对安全性高并且不需要联网的应用可以使用none网络。

   比如某个容器的唯一用途是成成随机密码,就可以放到none网络中避免密码被窃取。

 2.host网络

    连接到host网络容器共享docker host的网络栈,容器的网络配置与host完全一样。可以通过--network=host指定使用host网络

docker run -it --network=host  busybox

 在容器中可以看到host的所有网卡,并且连hostname也是host的。host网络的使用场景又是什么呢

  直接使用docker host 的网络最大的好处就是性能。如果容器对网络传输效率有较高要求,则可以选择host网络,当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题。docker host上已经使用的端口就不能再用了。

  docker host的另一个用途是让容器可以直接配置host网络,比如某些跨host网络解决方案,其本身也就一容器方式运行的,这些方案需要对网络进行配置,比如管理iptables

  3.bridge网络

    docker安装时会创建一个命名docker0的Linux bridge。比如不指定--network,创建的容器默认都会挂到docker0上

brctl show

  

 注意:我是使用的阿里云服务器,由于阿里云服务器里边没有brctl命令,需要我们下载安装

yum install bridge-utils

当前docker0上没有任何其他网络,当运行容器时就会看到反应

查看网络配置

实际上eth0@if17和 brctl show 查看到的是一对 veth pair 。veth pair是一种成对出现的特殊网络设备,可以把他们想象成由一根虚拟网线连接起来的一对网卡。网卡的一头在容器中,一头挂在网桥docker0上,其效果就是将eth0if197也挂在了docker0上

 可以通过命令查看网络配置信息

docker network inspect bridge

   bridge网络配置的subnet就是172.17.0.0/16 并且网关是172.17.0.1.这个网关就是docker0

 当前容器网络拓扑结构图:

     

二、自定义容器网络

   处理none host  bridge 这三个自动创建的网络,用户也可以根据业务需求创建user-definde网络

     docker提供了三种user-definde网络驱动方式:bridge overlay  和macvian overlay和macvlan用于创建跨主机的网络

   1.通过bridge驱动创建类似默认的bridge网络:

docker network create --driver  bridge my_net

       

  查看当前host网络结构变化:

    

  查看my_net配置信息:

2.创建自己制定ip网段:

docker network  create --driver bridge  --subnet 192.168.1.0/24 --gateway  192.168.1.1 my_net2

   

 查看详细信息:

   

创建实例查看:

docker run -it --network=my_net2  busybox sh

 

3.可以指定一个静态ip

docker run -it --network=my_net2 --ip 192.168.1.50  busybox sh

 注意:只有使用--subnet创建的网络才能指定静态ip

如果my-net创建没有指定--subnet,指定静态ip会报错:

 

三、容器间的连通性

          两个busybox容器都挂在my_net2上能够互通,:

    1.启动第一台

docker run -it --network my_net2  busybox

   2.启动第二台

docker run -it --network my_net2  busybox

  3.ping下

 可见同一网络中的容器,网关之间都是可以通信的

   

   my_net2与默认bridge网络能通讯吗?

  正常情况下 两个网络属于不同的网桥,不能通信,如果让容器互通

   1.首先ping

     

   2.查看路由表

ip  r

  3.查看ip forwarding

sysctl net.ipv4.ip_forward

 4.查看iptables

iptables-save

  为什么还不能通讯的原因:

       iptables drop掉了网桥docker0与br-c2073之间的双向的流量

     从规则的命令docker-isolation可知docker在设计上就是要隔离不同的network

   注意:如何让容器之间通讯:

       为容器添加一块同样的网卡。就可以通过docker network connect命令实现                                                                             

ocker network  connect  my_net2 f87771

    

  添加网卡后 会发现容器会多一个网卡接口

   ping验证:

 

四、容器访问外部

 docker host是可以访问外网的。容器是否也能访问外网

     

    可见容器默认就能访问外网

  nat上iptables规则:

iptables -t nat -S

    

   

       

五、外部世界如何访问容器

           外部网络怎么才能访问容器  答案就是 端口映射

    docker 可将容器对外提供服务的端口映射到host的某个端口,外网通过改端口访问容器。容器启动时通过- 参数映射端口:

docker run -d -p 80 httpd

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值