zoukankan      html  css  js  c++  java
  • docker(二)--容器网络相关

    同一物理机上的两个容器通信

    可以在主机上建立一个虚拟交换机,在两个容器各自用纯软件方式建一对虚拟网卡,一个在容器上,一个在交换机上

    不同物理机上面的虚拟机通信

    桥接网络: 把物理网卡当作交换机来用。安全性低
    nat网络: 物理机上打开转发功能,容器c1 snat到物理机1->物理机2 snat容器c2,并且c1看不到c2。效率低
    Overlay Network 叠加网络:容器c1 通过隧道模式与物理机h1通信,并且c1和物理机2上的c2在同一网段。

    容器运行时,默认会为每个容器创建一对网卡,一半在容器中,一半在宿主机上,并且被关联到了docker0上面,docker0桥即nat桥

     docker ps 看到有3个容器运行

    ifconfig 看到有3个veth开头的虚拟网卡

     brctl show  

    可以查看到容器的网卡被关联到docker0

     

    同一主机上的容器之间能够互相访问

    例如:

     docker inspect web1 可以看到web1容器的ip 为172.27.0.2

     进入busybox这个容器中:

    docker exec -it t2 /bin/sh

    / # ifconfig
    eth0 Link encap:Ethernet HWaddr 02:42:AC:1B:00:03
    inet addr:172.27.0.4 Bcast:172.27.255.255 Mask:255.255.0.0

    / # wget -O - -q http://172.27.0.2    # 在t2容器中可以访问到web1容器中的nginx服务
    <!DOCTYPE html>
    ...
    <body>
    <h1>Welcome to nginx!</h1>

    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

    如果外部机器需要访问该主机上的容器web1,外部->主机->容器。需要通过主机dnat 转发到容器,才能使容器被外部访问到。

    docker的四种网络通信模型

     docker network inspect bridge  查看bridge的详细信息

    第一种:封闭式网络

      docker run --name t1 -it --network none --rm busybox:latest   

    / # ifconfig -a   查看只有一个lo网卡

     第二种,bridge桥接式,也就是默认的

     docker run --name t1 -it --network bridge --rm busybox:latest     (这里不指定network也默认是bridge)

     bridged containers 启动时还可以指定主机名和dns等:

    docker run --name t1 -it -h docker1.test.com --dns 114.114.114.114 --dns-search ilinux.io --rm busybox
    / # hostname
    docker1.test.com
    / # cat /etc/resolv.conf 
    search ilinux.io
    nameserver 114.114.114.114
    options rotate timeout:1

    使宿主机外部客户端能够访问容器

    -p <containerPort>   将指定容器端口映射到主机的一个动态端口

    -p <hostPort>:<containerPort>  将容器端口<containerPort>映射至主机指定端口<hostPort>

    -p <ip>::<containerPort>   将指定的容器端口<containerPort>映射至主机指定<ip>的动态端口

    -p <ip>:<hostPort>:<containerPort>   将指定的容器端口<containerPort> 映射到主机指定<ip>的指定端口<hostPort>

    例如:

    docker run --name boxweb --rm -p 80 abao/bbox:v0.2     启动一个httpd

    docker port boxweb   #动态端口是随机端口,docker port可以查看具体映射结果

     80/tcp -> 0.0.0.0:32768

    在外部可以通过宿主机ip:32768 访问到容器

    第三种:joined containers  联盟式容器

    联盟式容器是指使用某个已存在容器的网络接口的容器,接口被联盟内的各容器共享使用。

    联盟式容器彼此间虽然共享一个网络名称空间,但是其它名称空间:user、mount等还是隔离的

    联盟式容器彼此间存在端口冲突的可能性,因此,通常只会在多个容器上的程序需要程序loopback接口互相通信、或对已存在的容器的网络属性进行监控是才使用此种模式

    例如:

    启动一个c1容器

    docker run --name c1 -it --rm busybox

    启动一个c2

    docker run --name c2 --network container:c1 -it --rm busybox

    c1,c2查看ip主机名都是一样的,但是在创建文件互相看不到,启动httpd,能查看到监听的80端口

    第四种:Open container 开放式容器

      共享宿主机的网络名称空间

    docker run --name c3 --network host -it --rm busybox

    / # echo "hello container" >/tmp/index.html
    / # httpd -h /tmp

    在宿主机外部可以访问到 httpd服务

    # curl 172.27.0.3
    hello container

    管理network名称空间

    ip netns help
    Usage: ip netns list
           ip netns add NAME
           ip netns set NAME NETNSID
           ip [-all] netns delete [NAME]
           ip netns identify [PID]
           ip netns pids NAME
           ip [-all] netns exec [NAME] cmd ...
           ip netns monitor
           ip netns list-id

    创建network名称空间,除了network名称空间的其它名称空间是共享的

    # ip netns add r1
    # ip netns add r2
    # ip netns list
    r2
    r1
    # ip netns exec r1 ifconfig -a      # 查看r1和r2都只有一个lo

     添加虚拟网卡

    ip link add name veth1.1 type veth peer name veth1.2

    ip link show     可以看到网卡对,但是默认没有被激活,ifconfig看不到

    把veth1.2网卡 移到创建的r1 network 名称空间:

    ip link set dev veth1.2 netns r1

    再次查看,可以看到veth1.1在主机上,veth1.2 在r1 网络名称空间中:

    ip link show

    ip netns exec r1 ifconfig -a

     给r1的veth1.2 改名:

    ip netns exec r1 ip link set dev veth1.2 name eth0

    激活宿主机的veth1.1

    ifconfig veth1.1 10.1.0.1/24 up 

    激活r1中的另一半

    ip netns exec r1 ifconfig eth0 10.1.0.2/24 up

    测试ping可以互相通信

    将宿主机的veth1.1移到r2中,r1和r2两个网络名称空间中可以通过虚拟网卡互相进行通信:

    ip link set dev veth1.1 netns r2

    ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up

    ip netns exec r2 ping 10.1.0.2

    ---由于很长时间没用这台机器,网络中间配置混乱,导致主机和docker不通,后重新修改了docker网段,如下-------

    修改docker默认的网段

    第一步 删除原有配置

    service docker stop
    ip link set dev docker0 down
    brctl delbr docker0
    iptables -t nat -F POSTROUTING

    第二步 创建新的网桥

    brctl addbr docker0
    ip addr add 172.17.0.1/24 dev docker0
    ip link set dev docker0 up

    第三步 配置Docker的文件

    vi /etc/docker/daemon.json
    # cat /etc/docker/daemon.json  #可以自定义docker0桥的网络属性信息
    {"registry-mirrors": ["http://224ac393.m.daocloud.io"],
        "bip": "172.17.0.1/24"
    }
    # systemctl  restart  docker

    docker远程连接

    docker默认是监听在本地unix socket地址,/var/run/docker.sock,如果使用tcp套接字docker可以使外部能连接

    修改node1的配置

    /etc/docker/daemon.json
    "hosts":["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]

    在node2上面可以连接node1的docker

    docker -H 172.27.0.3:2375 image ls 

    创建docker桥

     docker network create -d bridge --subnet "172.16.0.0/16" --gateway "172.16.0.1" docker1

    3d11b7921e4810d2b728e1c1cafd3bac9c399ecf4f72ab6d6652b81906dcb69c

     

    docker run --name d1 -it --network docker1 busybox

    / # ifconfig
    eth0 Link encap:Ethernet HWaddr 02:42:AC:10:00:02
    inet addr:172.16.0.2 Bcast:172.16.255.255 Mask:255.255.0.0

  • 相关阅读:
    auto_ptr解析
    C++ auto_ptr智能指针的用法
    C++ 默认构造函数
    phpdisk 盲注 &前台任意用户登录
    冒泡排序
    关于C++中的友元函数的总结
    python中的闭包
    reverse Polish notation
    PostScript
    sqlite
  • 原文地址:https://www.cnblogs.com/xiaobaozi-95/p/12298674.html
Copyright © 2011-2022 走看看