小知识:docker 六种网络类型

Network driver 六种网络

Docker网络子系统支持以下网络驱动:

  • bridge:默认网络驱动,用于单宿主机的docker容器和主机通信;
  • overlay:叠加网络,用于连接多个宿主机Docker进程管理的容器和swarm services;
  • macvlan:将容器的虚拟网卡直接连接在主机所在的物理网络上;
  • host:Docker 17.06+ 创建swarm services时支持,容器直接使用docker主机的网卡和网络;
  • none:禁用容器的网络,不连接任何网络,swarm services不支持该类型;
  • Network plugins:安装第三方网络插件,实现自定义的网络类型

docker network命令

docker network提供容器网络的管理命令和选项。

    
    // 查看
    docker network ls  // 查看网络列表
    docker network ls -f driver=bridge // 查看bridge网络列表
    docker network ls -q  // 仅查看网络ID列表
    
    // 创建
    docker create  mynet  // 创建默认的网络mynet,类型为bridge
    docker create  -d bridge mynet // 指定网络类型
    docker create  --ipv6 mynet // 开启ipv6网络
    
    // 检查网络完整配置
    docker inspect mynet  // 查看mynet网络所有参数配置
    
    // 将容器连接到网络
    docker network connect  mynet mycontainer // 将容器连接到mynet网络
    docker network connect --ip 172.30.100.104 mynet mycontainer // 指定ipv4地址
    docker network connect --ip6  2001:db8::33 mynet mycontainer // 指定ipv6地址
    
    // 断开容器网络
    docker network disconnect mynet mycontainer // 将容器的mynet网络断开
    
    // 删除未使用网络
    docker network prune
    
    // 删除指定网络
    docker network rm  mynet
    

bridge

适用单台宿主机上的多个容器之间网络通信。

  • 自定义的bridge网络和默认的bridate网络行为不一样,具体见文档。
  • 建议使用自定义的bridge网络,默认的有诸多限制;
  • 连接在自定义的bridge网络上的不同容器之间所有端口互相暴露,可以访问;
  • 连接在自定义的bridge网络上的不同容器自动DNS解析,可以通过容器名称代替IP地址访问;
  • 默认网络会自动启用ipv6无法禁止,用户自定义网络通过–ipv6启用;
    // 创建,docker会在宿主机上创建一个桥接设备
    # docker network create my-net
    # ip a  // 查看新建的设备
    
    // 创建容器,连接到网络
    # docker create --name my-nginx \
        --network my-net \
        --publish 8080:80 \
        nginx:latest
    
    // 启动容器
    # docker start my-nginx
    # docker exec -it my-nginx /bin/bash
    
    // 断开和连接
    # docker network connect my-net my-nginx
    # docker network disconnect my-net my-nginx
    
    # docker network rm my-net 

Host

宿主机和容器共享网络栈(网卡和地址相同),容器直接使用宿主机的网络设备和网络,宿主机和容器网络不隔离;

    
    // 启动容器my_nginx,连接到host网络,--rm选项表明如果已存在容器,自动删除重建
    # docker run --rm -d --network host  --name my_nginx nginx 
    
    # curl localhost:80   // 可以在宿主机访问nginx首页
    # netstat -tulpn | grep :80     // 发现宿主机出现nginx进程在监听80端口,容器的nginx进程仿佛运行在宿主机上
    
    // 进入容器观察网络
    # docker exec -it my_ngnix /bin/bash
    // 安装ifconfig命令
    # apt-get update
    # apt-get install net-tools
    # ifconfig -a  // 可以看出网卡的mac地址和IP地址完全宿主机一样
    # exit
    
    # docker container stop my_ngnix
    

Overlay

用于不同主机的多个容器或多个swarm services之间通信。


    # docker swarm init  // 初始化swarm集群,master节点
    # docker swarm join-token worker // 查看worker节点的token
    # docker network ls  // 默认创建ingress overlay网络和docker_gwbridge网络
    
    // 创建overlay网络
    # docker network create -d overlay my-overlay
    
    // --attachable,支持手工连接单独的容器,否则只能swarm连接使用
    # docker network create -d overlay --attachable my-overlay
    
    // 创建支持应用数据加密的网络
    # docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network
    
    // ingress网络在docker中同时只能有一个
    # docker network rm ingress
    
    // 创建自己的ingress网络
    # docker network create \
        --driver overlay \
        --ingress \
        --subnet=10.11.0.0/16 \
        --gateway=10.11.0.2 \
        --opt com.docker.network.driver.mtu=1200 \
        my-ingress
        
    // 创建桥接网络
    # ip link set docker_gwbridge down
    # ip link del dev docker_gwbridge
    # docker network create \
        --subnet 10.11.0.0/16 \
        --opt com.docker.network.bridge.name=docker_gwbridge \
        --opt com.docker.network.bridge.enable_icc=false \
        --opt com.docker.network.bridge.enable_ip_masquerade=true \
        docker_gwbridge

macvlan

分配独立的mac地址给容器内每一个虚拟网络设备,该虚拟网络类似直接接到和宿主机一样的物理网络,相当于宿主机有了多个网络设备。

要点:

  • 需要指定一个宿主机的物理设备给macvlan使用;
  • 容易消耗大量的物理和IP地址、造成网络广播;
  • 宿主机的物理设备需要工作在混淆模式下,因为一块物理设备会被指定多个MAC地址;
  • macvaln可以工作在桥接模式或者 802.1q trunk桥接模式
    // 桥接模式,直接使用物理设备收发
    # docker network create -d macvlan \
        --subnet=172.16.86.0/24 \
        --gateway=172.16.86.1 \
        -o parent=eth0 pub_net
    
    // trunk
    # docker network create -d macvlan \
        --subnet=192.168.50.0/24 \
        --gateway=192.168.50.1 \
        -o parent=eth0.50 macvlan50

none

禁用容器的网络栈,容器内仅创建loopback设备。

    // 创建none网络的容器no-net-alpine
    # docker run --rm -dit --network none --name no-net-alpine alpine ash
    
    // 查看容器的网络设备,发现只有lo设备
    # docker exec no-net-alpine ip link show 
    
    // 路由表为空
    # docker exec no-net-alpine ip route
    
    # docker container rm no-net-alpine
    

Third-party network plugins

    // 安装插件
    # docker plugin install ...
    # docker network create --driver=....

你可能感兴趣的:(Docker容器)