zoukankan      html  css  js  c++  java
  • Docker容器的网络连接:

    yw1989@ubuntu:~$ ifconfig
    docker0   Link encap:Ethernet  HWaddr 02:42:97:61:42:9f  
              inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
              inet6 addr: fe80::42:97ff:fe61:429f/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:2517 errors:0 dropped:0 overruns:0 frame:0
              TX packets:2635 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:105967 (105.9 KB)  TX bytes:18523253 (18.5 MB)
    Docker的守护进程是通过docker0为docker容器提供网络服务。Docker0是linux的虚拟网桥,网桥是数据链路层的设备。通过mac地址(网络设备的物理地址)对网络进行划分并且在不同的网络之间传递数据。Linux的虚礼网桥:1.可以设置ip地址2.相当于一个虚拟网卡。通常来讲ip地址是网络层设备才有的,但是linux的网桥是网络设备的一种,只要是网络设备就可以设置ip地址。当虚拟网桥有ip地址之后,linux就可以通过路由表或者ip表规则在网络层定位网桥,这个网卡的名字就是虚拟网桥的名字就是docker0。
    
    Docker0的地址划分:
    IP:172.17.42.1,子网掩码:255.255.0.0,通过子网掩码可以知道提供了65534个ip地址。Docker也会根据ip的范围为每一个容器提供mac地址,从而避免mac地址冲突,MAC:02:42:ac:11:00:00到02:42:ac:11:ff:ff。Docker守护进程在一个容器启动时会创建网络的2端,一端是在容器中的网络设备,另一端是在运行dokcer守护进程的主机上打开一个名为veth*的接口用来实现docker0网桥与容器的通信。

    yw1989@ubuntu:~$ sudo apt-get install bridge-utils  :安装网桥管理工具
    
    root@ubuntu:/# brctl show  :查看网桥
    bridge name    bridge id        STP enabled    interfaces
    docker0        8000.02429761429f    no        veth5ef7f82
    
    root@ubuntu:/# docker run -it --name bridge_1 ubuntu /bin/bash
    root@c97b96f74c0a:/#    :  创建一个容器并进来
    root@c97b96f74c0a:/# ifconfig  : 查看ip地址
    eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:03  
              inet addr:172.17.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
              inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:6542 errors:0 dropped:0 overruns:0 frame:0
              TX packets:5115 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:25377877 (25.3 MB)  TX bytes:281529 (281.5 KB)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
    
    修改docker0的地址:$sudo ifconfig docker0 192.138.200.1 netmask 255.255.255.0
    有时候不想使用docker0的网桥,需要添加虚礼网桥:
    $sudo brctl addbr br0
    $sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0
    更改docker守护进程的启动配置:
    /etc/default/docker中添加DOCKER_OPS
    -b=br0
    重启docker的守护进程:sudo service docker restart

    Docker容器间的互联:

    默认情况下允许所有容器的互联,可以拒绝容器间的连接和允许特定容器间的连接。
    同宿主机下的容器是通过默认网桥连接的,同一宿主机下的容器都是可以连接的,--icc=true
    启动第一个容器:
    $docker run -it --name 容器名1 镜像名(已经指定了命令不用在指定命令了)
    #nginx : 容器中启动ngin服务,ctrl+PQ 退出容器,保证容器一直运行
    启动第二个容器:
    $docker run -it --name 容器名2 镜像名(已经指定了命令不用在指定命令了)
    #ifconfig :查看容器2的ip地址,ctrl+PQ 退出容器,保证容器一直运行
    
    $docker attach 容器1
    #ifconfig  查看容器1的地址
    #ping 容器2的地址
    
    $docker attach 容器2
    #curl http://容器1 的地址来访问1提供的nginx服务。服务可以正常访问。
    
    停止容器并且重新起来的时候ip地址发生了变化。所以容器的ip地址是一个不可靠的连接。
    --link : 指定容器名和代号,就可以通过代号来访问容器。就避免了因为ip地址变化带来的影响。Docker会自动修改别名和ip的地址的映射。
    $docker run --link=[container_name]:[alias]  [image]  [command]
    $docker run -it --name yw3 --link=cct1:webtest3 yw
    #ping webtest3 :ping 容器的别名
    拒绝所有容器的互联:--icc=false
    修改docker的配置文件:$sudo vim /etc/default/docker,需要重启docker的服务$sudo service docker restart。
    重启3个容器:docker restart c1 c2 c3
    
    允许特定容器的访问:--icc=false  --iptables=true  --link (--icc=false表示拒绝访问,--iptables=true允许特定容器的访问, --link允许访问的地址)
    $sudo vim /etc/default/docker
    文件最后添加DOCKER_OPTS=”--icc=false  --iptables=true”
    重启docker的服务$sudo service docker restart。
    重启3个容器:docker restart c1 c2 c3
    $docker run  -it  --name  yw3  --link=cct4:webtest4  yw
    
    容器与外部网络的访问:ip_forward,iptables,允许端口映射访问,限制ip访问容器。
    ip_forward:是linux系统中的一个变量,他的值决定了系统是否会转发流量,docker守护进程的默认参数中也有ip_forward选项,默认是true,使用这个默认值时docker会在守护进程启动时将系统的ip_forward设置为1,也就是允许流量转发,可以使用系统自带的工具查看数据转发是否开启,$sysctl net.ipv4.conf.all.forwarding
    
    首先通过ps命令查看docker是否已经运行了:
    $ps -ef | grep docker
    查看ip_forward:
    yw1989@ubuntu:~$ sudo sysctl  net.ipv4.conf.all.forwarding
    net.ipv4.conf.all.forwarding = 1  :  已经被置为了1
    
    Iptables:是与linux内核集成的包过滤防火墙系统,几乎所有的linux发行版都会包含iptables功能。
    Iptables包含了图中所给出的功能,图给出了在iptables中网络的数据包是如何传递的。
    每一个大的方框就是iptables中的一个链(chain),每一个链就是数据处理的一个环节,在每个环节中又包含了不同的操作,prerouting就包含了nat,mangle,raw这3种操作。当一个数据包进入网卡时首先进入了prerouting链,如果数据包的目的是本机ip会进入下面的input链,然后交给本机处理。处理完之后发出,经过output链,然后达到postrouting链。当数据的目的地不是本机会经过forward链然后经过postrouting链发出。
    
    Iptables不同的层级:
    1.表(table): 链中的nat,mangle,raw,filter就是
    2.链(chain):数据处理中的不同环节,不同阶段
    3.规则(rule):每个链下的操作
    
    Filter表中包含的链:input,output,forward
    
    Iptables可以配置特定ip访问特定容器。Docker依赖了iptables这个防火墙设置来提供容器的访问限制。
  • 相关阅读:
    如何实现CSS限制字数,超出部份显示省略号
    html禁止手机页面放大缩小
    jQuery 获取屏幕高度、宽度
    谷歌api 二维码生成 实例
    java.security.NoSuchAlgorithmException: Cannot find any provider supporting RSA
    eclipse安装阿里开发规范
    tomcat下配置http和https
    linux安装redis
    修改java配置文件
    Linux下安装Mysql
  • 原文地址:https://www.cnblogs.com/yaowen/p/8431679.html
Copyright © 2011-2022 走看看