zoukankan      html  css  js  c++  java
  • Docker(四):Docker基本网络配置

    1、Libnetwork

      Libnetwork提出了新的容器网络模型简称为CNM,定义了标准的API用于为容器配置网络。

      CNM三个重要概念:

        沙盒:一个隔离的网络运行环境,保存了容器网络栈的配置,包括了对网络接口、路由表、DNS的配置。

        Endpoint:Endpoint将沙盒加入到一个网络中,一个Endpoint只能属于一个沙盒。

        网络:网络包括一组能互相通信的Endpoint。

      CNM的五种驱动:

        bridge:Docker默认的网络驱动,Container通过一对veth pair链接到Dokcer网桥上,由Docker为容器动态分配IP及路由规则等。

        host:容器与主机共享同一Network Namespace。

        null:容器内网络配置为空,需要用户手动配置网络。

        remote:Docker网络插件的实现,使CNM通过HTTP RESTful API对接第三方的网络方案。

        overlay:Docker原生跨主机多子网网络方案,需要内核>=3.16才可正常使用。

    2、基本网络配置

      none:不为容器配置任何网络参数

        启动容器:docker run --net=none -ti ubuntu:latest ip addr show

        可以看到容器仅有一个lo环回接口,可以为手动容器配置网络。

      container:与另一个容器共享Network Namespace

        首先启动一个名为dockerNet的容器,dns为8.8.4.4

          docker run -h dockerNet --dns 8.8.4.4 -tid ubuntu:latest bash

          进入到容器并查看网络配置

          docker exec -ti dockerNetID bash

        再次启动共享网络的docker容器

          docker run --net=container:dockerNetID -ti ubuntu:latest bash

        再次查看网络配置,其IP地址、DNS、hostname都继承了dockerNet

      host:与主机共享Root Network Namespace,容器可以完全操纵主机的协议栈、路由表,所以一般避免使用host模式

        docker run --net=host -ti ubuntu:latest bash

        查看网络配置与主机一样

      bridge:Docker设计的NAT网络模型

        docke run -ti --net=bridge ubuntu:latest ip addr show

        该容器会从172.17.42.1/16子网内分配IP

      overlay:Docker原生的跨主机多子网模型

        overlay网络比较复杂,底层需要类似consul或etcd的KV存储系统进行消息同步,核心是通过Linux网桥与vxlan隧道实现跨主机划分子网。

        overlay网络创建步骤:

          获取实验版Docker:

            curl -sSL https://experimental.docker.com/ | sh

          主机1以bootstrap模式运行consul server

            consul agent -server -bootstrap -data-dir /tmp/consul -bind Host-1-IP

          主机2启动consul client

            consul agent -data-dir /tmp/consul -bind HOST-2-IP

            consul join HOST-1-IP

          主机1启动Docker daemon

            docker daemon --kv-store=consul:localhost:8500 --label=com.docker.network.driver.overlay.bind_interface=eth0

          主机2启动daemon

            docker daemon --kv-store=consul:localhost:8500 --label=com.docker.network.driver.overlay.bind_interface=eth0

            --label=com.docker.network.driver.overlay.neighbor_ip=Host-1-IP

          在主机1上创建overlay网络

            docker network create -d overlay dev

          查看创建的网络:docker network ls

          在主机1上运行一个容器

            docker run -tid --publish-service test.dev ubuntu:latest bash

            test.dev:为容器在dev网络上绑定一个test的服务

          在主机2上运行一个容器

            docker run -tid --publish-service test1.dev.overlay ubuntu:latest bash

            test1.dev.overlay:绑定名为test1的服务,test1服务所在的网络是dev,网络类型是overlay

          此时主机1和主机2上的容器是可以通信的

        overlay网络详情查看

          沙盒保存在/var/run/docker/netns

          创建软连接:ln -s  /var/run/docker/netns/OverLayNetID /var/run/netns/OverLayNetID

          创建软连接是为了能够使用IP命令操纵名字空间

          查看端口详细信息:

            ip netns exec OverLayNetID ip addr show

          查看网桥信息:  

            ip netns exec OverLayNetID brctl show  

          查看vxlan信息:

            ip netns exec OverLayNetID ip -d link show vxlan1 (vxlan1为网桥信息显示的interfaces)

            # vxlan id表示为占用的vxlan隧道,一般为256~1000

    3、Docker相关网络参数

      Daemon相关:

        查看帮助:docker daemon --help

        -b,--bridge=  #指定docker使用的网桥,默认为docker0

        --bip=      #指定docker0网桥的IP,不能与-b一起使用

        --default-gateway=  #设置容器的默认网关

        --default-gateway-ipv6 #设置容器的ipv6网关

        --dns=[]    #设置容器的dns

        --dns-search=[]  #设置容器的search domain

        --fixed-cidr=  #定义容器的网段

        --fixed-cidr-ipv6=

        -H,--host=[]  #指定docker client和docker daemon通信的socket地址,可以是tcp地址、unix socket地址或socket文件描述符,可同时指定多个

               #如:docker daemon -H tcp://10.10.10.10:60000 -H unix:///var/run/docker.sock

               #代表docker同时监听60000端口和docker.sock文件

        --icc=true    #允许/禁止容器间通信

        --ip=0.0.0.0   #容器暴露端口时绑定的主机IP,默认为0.0.0.0

        --ip-forward=true  #开启转发功能

        --userland-proxy=true  #生产环境建议设置为false

      Client相关:

        查看帮助:docker run --help

        --add-host=[]    #在容器内的hosts文件添加一行解析

        --dns=[]

        --dns-search=[]

        --expose=[]    #暴露容器的端口,而不映射到主机端口

        -h,--hostname=  #设置容器的主机名

        --link=[]       #链接到另一个容器,在容器中可以通过ID或主机名访问到其他容器

        --max-address=

        -net=bridge    #设置容器的网络运行模式,模式为上述介绍

        -P,--publish-all=false  #将容器所有暴露出的端口映射到主机随机端口

        -p,--publish=[]   #将容器一段范围内的端口映射到主机指定的端口

      Docker Daemon实例:

        docker daemon -H tcp://10.10.10.10:50000 -H unix:///var/run/docker.sock --fixed-cidr=172.17.55.0/24 --icc=false --userland-proxy=false

        # --fixed-cidr指定容器将从172.17.55.0网段分配IP,--icc 禁止容器间通信,

      Dokcer Client示例1:

        docker run -tid --net=bridge -p 10000:22/tcp -h docker ubuntu:latest bash

        # 启动一个主机名为docker 网络模式为bridge的容器,将10000映射到22端口,此容器会获取一个55.0网段的IP

      Docker Client示例2:

        docker run -tid --name=c1 ubuntu:latest bash

        docker run -tid --link=c1:alias_c1 --name=c2 ubuntu:latest bash

        # 首先启动了一个名为c1的容器,然后启动了一个连接到c1的名叫c2的容器,c1别名起为alias_c1,此时容器c2可通过c1别名与c1通信

  • 相关阅读:
    Servlet
    Web服务器和Tomcat
    DOM文档对象模型
    JavaScript总结
    CSS总结
    商城——购物车模块
    用户注册登录认证模块
    P2P技术之STUN、TURN、ICE详解
    P2P中的NAT穿越(打洞)方案详解
    NAT技术详解
  • 原文地址:https://www.cnblogs.com/dukuan/p/7535879.html
Copyright © 2011-2022 走看看