zoukankan      html  css  js  c++  java
  • Docker学习笔记07_网络配置

     图来源:http://www.slideshare.net/janghoonsim/docker-container-and-lightweight-virtualization

    Docker的四种网络模式

    bridge 模式,使用 --net=bridge 指定,默认设置。
    host 模式,使用 --net=host 指定。
    container 模式,使用 --net=container:NAMEorID 指定。
    none 模式,使用 --net=none 指定。

    Bridge模式

    默认模式,容器和宿主机桥docker0连接,docker0在docker安装时自动产生。

     一般 Docker 会使用 172.17.0.0/16 这个网段,docker0的IP地址可以在宿主机ifconfig docker0查看。

     不加--net参数,启动一个后台驻留的centos7容器,查看一下容器内自动创建的eth0网卡,IP地址与宿主机docker0网卡在同一网段。

    docker run -d --name xj_centos1 centos /usr/sbin/init

     

     

    Host模式

    使用--net=host模式启动容器,将不会获得一个独立的 Network Namespace,而是和宿主机共用。容器内不会虚拟出自己的网卡,配置自己的 IP 等。

    docker run -d --name xj_centos2 --net=host centos /usr/sbin/init

    从shell提示符看起来,和在宿主机的前缀是一样的,但是事实上此时命令是在容器内执行的,运行docker ps会报错,ifconfig的输出和宿主机一样。

    Container模式

    这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

    docker run -d --name xj_centos3 --net=container:xj_centos1 centos /usr/sbin/init

    xj_centos1xj_centos3两个容器内,查看/etc/hostname、ifconfig -a是一样的,但是ps -ef可以看出运行的进程是不同的。

    None模式

    在这种模式下,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。

    docker run -d --name xj_centos4 --net=none centos /usr/sbin/init

    此容器内没有IP配置,而且连网卡都没有,该如何配置--net=none参数启动的容器网络呢,步骤如下:

    1、先确认该容器在宿主机上的PID

    docker inspect xj_centos4 | grep Pid

     2、创建软链接:(ip-netns的man page中建议/var/run/netns/$Pid作为namespace的管理对象)

    mkdir -p /var/run/netns

    ln -s /proc/29855/ns/net /var/run/netns/29855  

    3、创建一对虚拟网卡A和B,其中A加入到docker0网桥,并启动,另一个B放入容器内。

    ip link add A type veth peer name B    /* 创建一对虚拟网卡A和B

    brctl addif docker0 A    /* 将虚拟网卡A加入到网桥docker0,需提前安装bridge-utils

    ip link set A up    /*启动网卡A

    ip link set B netns 29855    /* 网卡B放入该容器对应的namespace

    4、配置容器内的网卡B的设置

    ip netns exec 29855 ip link set dev B name eth0    /* 容器内网卡名称重命名为eth0

    ip netns exec 29855 ip link set eth0 up    /* 启动eth0

    ip netns exec 29855 ip addr add 172.17.0.100/16 dev eth0    /* eth0的IP设置为172.17.0.100/16,与docker0的IP地址172.17.0.1同网段即可

    ip netns exec 29855 ip route add default via 172.17.0.1    /* eth0网卡的默认网关指向docker0的IP 172.17.0.1

    检验配置结果:

     容器配置固定IP

    如果不做额外设置,容器每次启动都是临时分配与网桥docker0同网段的IP,偶尔也希望能分配一个固定IP,步骤如下:

    1、新建一个自定义的network:

    docker network create --subnet 192.168.10.0/24 --gateway 192.168.10.254 Net_19216810

     docker network ls查看结果,已新增网络"Net_19216810"

    宿主机上运行ifconfig -a可以发现多了一个网桥br_05c76f963623,IP地址为192.168.10.254

     2、启动容器,指定桥接到新网段,并指定IP地址。

     docker run -d --name xj_centos5 --net Net_19216810 --ip 192.168.10.100 centos init

     此后停掉此容器再启动,IP依旧是192.168.10.100。

    补充一句,正式用途中,毕竟容器的设计和用途与虚拟机不同,容器讲究的是轻量,随需启动,可抛弃性,不建议长久化运行,所以在网络配置上,更多的利用宿主机的网络做映射即可,一般不会有太多的需求去修改容器内的设置,包括网络。

     容器内网络配置到本地网络环境中

    Docker 自身的网络功能比较简单,不能满足很多复杂的应用场景。因此,有很多开源项目用来改善 Docker 的网络功能,如 pipework  weave  flannel 

    接下来实验如何使用pipework将 Docker 容器配置到和宿主机同一网段。大致过程是配置一个IP地址与宿主机所在网络同网段的网桥,然后宿主机网卡与 Docker 容器内网卡都连接至此网桥。

    我的环境,宿主机IP是 10.9.41.112,网关为 10.9.41.254, 需要给 Docker 容器的地址配置为 10.9.41.150/24。

     宿主机上操作步骤如下:

    1、安装pipework

    git clone https://github.com/jpetazzo/pipework
    cp ~/pipework/pipework /usr/local/bin/

    2、创建网桥br0,并配置IP和默认网关。

    brctl addbr br0

    ifconfig br0 up

    ip addr del 10.9.41.112/24 dev ens18

    ip addr add 10.9.41.112/24 dev br0

    ip route del default

    ip route add default via 10.9.41.254 dev br0

    3、启动无网络的容器,然后使用pipework命令配置容器网络,桥接至br0

    docker run -d --name xj_centos6 --net='none'  centos /usr/sbin/init

    pipework br0 xj_centos6 10.9.41.150/24@10.9.41.254

    4、验证配置

    docker exec -it xj_centos6 /bin/bash

    ifconfig -a

  • 相关阅读:
    POJ 2236 Wireless Network(并查集)
    POJ 2010 Moo University
    POJ 3614 Sunscreen(贪心,区间单点匹配)
    POJ 2184 Cow Exhibition(背包)
    POJ 1631 Bridging signals(LIS的等价表述)
    POJ 3181 Dollar Dayz(递推,两个long long)
    POJ 3046 Ant Counting(递推,和号优化)
    POJ 3280 Cheapest Palindrome(区间dp)
    POJ 3616 Milking Time(dp)
    POJ 2385 Apple Catching(01背包)
  • 原文地址:https://www.cnblogs.com/xjcn/p/11549286.html
Copyright © 2011-2022 走看看