Skip to content

Latest commit

 

History

History
446 lines (254 loc) · 13.8 KB

File metadata and controls

446 lines (254 loc) · 13.8 KB

DOCKER容器的网络基础

docker 安装后自动会创建一个软交换机docker0,他既可以扮演二层的交换设备也可以扮演二层的网卡设备,不给地址的话就是交换机,给地
址的话既能当交换机又能当网卡。每当创建一个容器的时候就会创建一段网卡,一半连到容器上一半连到宿主机上,并且关联到了docker0,相
当于用一根网线连接了容器和软交换机docker0,

每当创建一个容器并分配地址以后,就会在物理主机上生成一个iptables规则

docker有四种网络模型,若在容器创建时没有指定那么通通默认为第二种网络,桥接式网络,并且这个是nat桥不是物理桥。

a、closed container封闭式容器,只有回环口。

b、brdged container 桥接式容器,有虚拟网卡,连接到docker网桥上,默认网络地址为172.17.0.0/16 

c、joined container 联盟式容器,让容器一部分名称空间是隔离的。

d、open container 开放式容器,和物理机共享名称空间

创建容器的虚拟网段

DOCKER默认的网段  172.17.0.0

创建网段

你可以指定IP地址域来创建虚拟网段或不指定IP地址域来创建虚拟网段
[root]# docker network create --subnet 172.18.0.0/24 mynet1
[root]# docker inspect mynet1

{
        subnet: 172.18.0.0/24,
        gateway: 172.18.0.1
}

or 

[root]# docker network create mynet1
[root]# docker inspect mynet1

{
        subnet: 172.19.0.0/24.
        gateway: 172.19.0.1
}

删除网段

[root]# docker network rm mynet1
docker0网桥设备

DOCKER容器的互联

同一宿主机上不同容器的互连

默认允许所有容器互联 拒绝容器间互联 允许特定容器间的连接

容器的互联有三种方式

默认允许所有容器互联

     在同一宿主机下,容器联接是通过网桥连接的,docker 提供了一个设置选项来打开允许所有容器互联
 
     docker 守护进程的启动选项
     --icc=true   默认
     
     [root]# vi /etc/default/docker
     添加 --icc=true 到 DOCKER_OPTS 设置为允许所有容器互联
     DOCKER_OPTS-"--icc=true"
     
     实操举例
      
     1.1  启动同一宿主机下的两容器
     
          [root]# docker run -it -p 80 --name firstcentos centos
          [root]# docker run -it -p 80 --name secondcentos centos
          
          在两台容器上都安装Nginx
          
          然后在第一个容器中启动Nginx服务
          
          [root@firstcentos]# nginx
          
          取的在第一个容器的IP地址
          [root@firstcentos]# ip addr show
          eth12  172.17.0.2
          
          在第二个容器中启动Nginx服务
          [root@secondcentos]# nginx
          [root@secondcentos]# ip addr show
          eth14 172.17.0.3
          
          ping 第一个容器的IP地址
          [root@secondcentos]# ping 172.17.0.2
          succeful
          
          訪问第一个容器的Nginx服务
          [root@secondcentos]# curl http://172.17.0.2
          nginx 信息
          
          两容器是联通的

拒绝容器间互联

      docker 守护进程的启动选项
      --icc=false

      [root]# vi /etc/default/docker
      添加 --icc=false 到 DOCKER_OPTS 设置为拒绝所有容器互联
      DOCKER_OPTS-"--icc=false"

       [root]# systemctl restart docker

允许特定容器间的连接

      需要三个配置
  
      --icc=false
  
      --iptables=true
  
      --link
  
      修改docker默认配置文件
   
        [root]# vi /etc/default/docker
        
        添加 --icc --iptables 到DOCKER_OPTS中
        
        DOCKER_OPTS=" --icc=false --iptables=true"
   
        [root]# systmectl restart docker
   
        现在,容器间是不能互相訪问的
   
        我们利用 --link 创建第三个容器,允许它能訪问第一容器,但不能訪问第二个容器
   
        [root]# docker run -it --name threecentos --link=firstcentos:firsttest centos
        
        [root]# curl firsttest
        
        如果不能成功,检查防火墙
   
        [root]# iptables -L -n
        
        把iptables 清空
   
        [root]# iptables -F
   
        重新启动docker服务
   
        [root]# systemctl start docker
        
        启动容器
        
        [root]# docker restart firstcentos secondcentos threecentos
   
        启动firstcentos 的Nginx
        
        [root]# docker attache firstcentos
        
        [root@firstcentos]# nginx
   
        启动threecentos容器
        
        [root]# docker attach threecentos
   
        从第三容器訪问第一容器
   
        [root@threecentos]# curl firsttest
   
        显示NGINX 信息,訪问成功

DOCKER容器与外部网络的连接

ip_forward 和 iptables决定了容器与外部网络的连接

ip_forward iptables 端口映射訪问 限制IP訪问容器

ip_forward

  在Linux系统中如果要开启数据转发功能,可用以下的Linux命令来查看数据转发功能是否开发
  
  [root]# sysctl net.ipv4.conf.all.forwarding
  net.ipv4.conf.all.forwarding=0      // 0 就是关闭   1 就是开启
  
  如果在docker系统中启动Linux数据转发功能,就必须要配置/etc/default/docker默认配置文件
  
  [root]# vi /etc/default/docker
  
  添加 --ip-forward=true 到 DOCKER_OPTS
  
  DOCKER_OPTS=" --ip-forward=true"

  当设置 --ip-forward=true时,Linux的net.ipv4.conf.all.forwarding 就为 1

iptables

  查看forward output 等表
  [root]# iptables -L -n

端口映射訪问

 在第一台的虚拟机上
 [root]# docker run -it -p 32768:80 --name firstcentos centos
 [root@89087654]# nginx
 ctrl+P+Q 退出容器
 
 [root]# ip addr show
 ens33 192.168.28.128

 查看容器的端口映射
 [root]# docker port firstcentos
 80/tcp -> 0.0.0.0:32768
 
 从本虚拟机訪问容器firstcentos中的Nginx
 [root]# curl 127.0.0.1:32768
 
 显示nginx信息 

 启动第二台虚拟机
 
 从第二台虚拟机上远程訪问第一台虚拟机容器firstcentos上的Nginx服务
 [root]# curl 192.168.28.128:32768
 
 显示nginx信息 

限制IP訪问容器

例子
 在另一虚拟机上新建一个容器 fourcentos
 
 [root]# docker run -it -p 80 --name fourcentos centos
 [root@984746443]# nginx
 ctrl+P+Q 退出容器
 
 [root]# ip addr show
 ens33  10.200.55.3  
 
 现在设置: 不允许192.168.28.128的那一台机訪问本机
 
 在本机的iptables中添加一条新规则
 [root]# iptables -I docker -s 10.200.55.3 -d 192.168.28.128 -p TCP --dport 80 -j DROP
 
 
 -I docker           新加一条docker规则
 -s 10.200.55.3      源地址
 -d 192.168.28.128   目的地址
 -P TCP              使用的协仪
 --dport 80          目的端口
 -J DROP             所需要的操作

不同宿主机上容器跨网络的互连

使用网桥实现跨主机容器连接

281956582865851

 由于Docker容器通过docker0 网桥实现同一主机间中,容器的ip地址分配和访问,也就是说容器中的IP 是由docker0网桥分配的,所以,如果希望Docker
 跨主机访问,最简单的方式就是将不同主机的 docker0 网桥设置为同一网段。那么怎么实现跨主机呢?将本机网卡host eth0 端口也通过网桥来连接,
 但是通过这种桥接,所有网卡端口都要在一个网段下,所以要对每个Docker守护进程对ip的分配做出限制

   地址范围: 192.168.28.65~192.168.28.126

    Host2: 192.168.28.128/26

   地址范围: 192.168.28.129~192.168.28.190

需要的操作:

   以下,以Host1 为例,Host2 上操作相似,只是网卡名字不一样

方式一 使用默认的docker0网桥

1、删除旧网桥

      [root]# systemctl stop docker
      [root]# ip link set dev docker0 down
      [root]# brctl delbr docker0
      
 2、修改/etc/docker/daemon.json文件
 
    设置网桥docker0的IP 
    [root]# vi /etc/docker/daemon.json
    
    {
     "bip":"192.168.28.5",             //设置网桥docker0的IP
     “fixed-cidr”:“192.168.28.64/26”     //-fixed-cidr用来限定为容器分配的IP地址范围
    }

  3. 启动网桥docker0
  
     [root]# ip link set dev docker0 up
  
  4. 桥接本地网卡
  
     [root]# brctl addif docker0 ens33
      ens33  //本地网卡
           

  5. 重启docker服务
  
    [root]# systemctl daemon-reload
    [root]# systemctl start docker
    
  6.    

方式二 使用新建虚拟网桥

   1、删除旧网桥

      [root]# systemctl stop docker
      [root]# ip link set dev docker0 down
      [root]# brctl delbr docker0
      
    2、手动创建一个新的网桥名称为 bridge0  
    
       [root]# brctl addbr bridge0
       
       为网桥分配一个同网段ip
       [root]# ifconfig bridge0 192.168.28.5 netmask 255.255.255.0
       
       启动网桥bridge0
       [root]# ip link set dev bridge0 up
    
     3. 桥接本地网卡:
     
       [root]# brctl addif bridge0 ens33 
        ens33  //本地网卡

     4. 查看是否已经创建bridge0
    
       [root]# ifconfig bridge0
  
    这里,我们就准备好了网桥设置

    下面我们来修改Docker的配置
    5、创建dameon.json
    
       vim /etc/docker/dameon.json
         { 
           "bridge": "bridge0",                    //指定容器连接的网桥名字
           “fixed-cidr”:“192.168.28.65/26”        // 用来限定为容器分配的IP地址范围
         }
         
    6. 重启docker服务
    
      [root]# systemctl restart docker
      
    7. 分别在两个host上启动一个容器
    
        [root]# docker run -it --name host1-centtos centos
        [root@7383647908] ip addr show
        
        容器IP
        eth17  192.168.28.66
        
        退出容器host1-centtos
        
        网桥IP
        [root]# ip addr show
        
        bridge0  ip:  192.168.28.5/26    
        
        这证明该容器的IP是由网桥分配的并在分配的IP地址范围内
        
        [root]# ping ----------
        然后在容器中互相运行ping命令查看连接情况

使用Open vSwitch实现跨主机容器连接

1 建立OVS网桥

2 添加gre连接

3 配置docker容器虚拟网桥

4 为虚拟网桥添加ovs接口

5 添加不同docker容器网段路由

使用weave实现跨主机容器连接

有用的参考