五、Docker学习之容器虚拟化网络+docker容器网络及通信

引言

Linux名称空间:UTS、IPC、PID、Network、Mount、User
其中只有Network是隔离的,其它都是共享的,而且Network都是成对出现的,一头在主机,一头在交换机----虚拟化网络。
一个容器只运行一个镜像,那么容器之间是怎么通信的?

概述

请参考 Docker容器虚拟化网络

实操

容器的网络模式有三种:
bridge-桥接
host-主机
none
docker network ls #查看容器的网络列表

[root@docNode01 docK8S]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
fde10c8843b4        bridge              bridge              local
28f62010f1f3        host                host                local
9fe27c72eb37        none                null                local

1. 创建一对虚拟网络

  1. 查看ip命令包。验证是否安装
    rpm -q iproute
[root@docNode01 yum.repos.d]# rpm -q iproute
iproute-4.11.0-25.el7_7.2.x86_64

ip #查看ip命令 ip netns #网络名称空间 ip link #挪动网络名称空间
在这里插入图片描述

  1. 使用netns 创建网络名称空间,实现网络通信
       先创建网络名称空间r1、r2,创建一对网卡v1,v2(默认相连),先把v1放入r1,v2放入r2。使用ping命令,在r2中ping r1,若能接收数据则说明r1r2之间可以通信。
    ip netns help #查看命令帮助
    在这里插入图片描述
    ip netns add r1 #新增网络名称空间
    ip netns list #查看网络名称空间
    在这里插入图片描述
    ip netns exec r1 ipconfig -a #进入r1查看ip配置
    在这里插入图片描述
       激活步骤:
          1. 使用ip link 命令
    在这里插入图片描述
    在这里插入图片描述
         2. ip link add name veth1.1 type veth peer veth1.2 #创建一对网卡,默认未激活
          ip link show #查看刚刚创建的网卡

    在这里插入图片描述
          ifconfig #查看已激活的网卡信息
          ip link set dev veth1.2 netns r1 #把veth1.2放进r1的网络名称空间中
    在这里插入图片描述
          ip netns exec r1 ip link set dev veth1.2 name veth0 #将veth1.2改名为veth0
    在这里插入图片描述
          ifconfig veth1.1 10.0.1.1/24 up #激活veth1.1
    在这里插入图片描述
          ip netns exec r1 ifconfig veth0 10.0.1.2/24 up #激活r1 中的虚拟网卡
    在这里插入图片描述
          ip link set dev veth1.1 netns r2 #将veth1.1放入 r2中
          ip netns exec r2 ifconfig veth1.1 10.0.1.3/24 up #激活r2的网卡
          ip netns exec r2 ping 10.0.1.2 #在r2名称空间内去ping r1的ip,如果能通说明r1跟r2之间可以通信
    在这里插入图片描述

2. 容器之间的网络通信

  • 封闭式容器none
    docker network ls #查看docker网络列表
    docker run --name t1 -it --network none --rm busybox:latest #指定网络,docker有bridge、host、none三种网络
    在这里插入图片描述
  • 桥接式容器bridge
     可接在docker run 后
    --hostname HOSTNAME #为容器指定主机名
    --dns DNS_IP #为容器指定DNS服务器地址
    --add-host HOSTNAME_IP #为容器指定本地主机名解析项
    docker run --name t1 -it --network bridge -h t1.test --rm busybox:latest #指定主机名
    在这里插入图片描述
    cat /etc/hosts #查看主机名
    cat /etc/resolv.conf #查看DNS服务器的IP地址
    nslookup -type=A www.baidu.com #查询百度的域名解析
    在这里插入图片描述
    docker run --name t1 -it --network bridge -h t1.test --dns 114.114.114.114 --rm busybox:latest #设置dns
    在这里插入图片描述
    docker run --name t1 -it --network bridge -h t1.test --dns 114.114.114.114 --dns-search ilinux.io --rm busybox:latest #设置dns search
    在这里插入图片描述
    docker run --name t1 -it --network bridge -h t1.test --dns 114.114.114.114 --dns-search ilinux.io --add-host www.loe.cool:1.1.1.1 --rm busybox:latest #host注入主机名
    在这里插入图片描述
  • 联盟式容器 joined container
    1. 容器网络暴露
        -p <containerPort> #将指定的容器端口映射至主机所有地址的一个动态端口
        -p <hostPort>:<containerPort> #将容器端口映射至指定的主机端口
        -p <ip>:<hostPort>:<containerPort> #将指定的容器端口映射至主机指定ip的指定端口
        -p <ip>::<containerPort> #将指定的容器端口映射至主机指定ip的动态端口
        “动态端口”指随机端口,具体的映射结果可使用docker port 查看
        docker run --name myweb --rm -p 80 httpd #暴露80端口在宿主机
        docker inspect myweb #查看myweb容器的信息
      在这里插入图片描述
      那么怎么才能用其它主机访问呢?
        a.先查看本机ip,再查看虚拟网卡所映射在宿主机的端口,宿主机所映射端口为自动生成,容器停止宿主机自动生成的端口会自动删除
        b.在浏览器访问该端口,如果返回信息则表示暴露成功
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    2. host暴露
       可直接暴露宿主机的ip,相当于宿主机上的进程
      docker run --name b2 -it --network container:b1 --rm busybox #将b1容器的网络与b2容器共享,网络共享,但是文件系统不会共享(如在b1创建目录d,在b2下没有d目录)
      在这里插入图片描述
      在这里插入图片描述
      docker run --name b2 --network host -it --rm busybox #网络暴露在host
       测试 echo "hello container" > /tmp/index.html httpd -h/tmp
      在这里插入图片描述
      在这里插入图片描述

    3. 自定义docker网络
       先修改 daemon.json文件,再重启docker 用ifconfig 可查看docker0的ip
      在这里插入图片描述

{
  "bip": "192.168.1.5/24",#bridge ip,若bip修改,以下除了dns其它自计算
  "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"], 
  "fixed-cidr": "10.20.0.0/16",
  "fixed-cidr-v6": "2001:db8::/64",
  "mtu": 1500,
  "default-gateway": "10.20.1.1",
  "default-gateway-v6": "2001:db8:abcd::89",
  "dns": ["10.20.1.2", "10.20.1.3"], #最多三个
  "registry-mirrors": ["https://registry.docker-cn.com"]
  
}

在这里插入图片描述

  • 开放式容器 Opening inbound communication
      -P--publish-all 将容器的所有计划要暴露端口全部映射至主机端口
      --expose 指定计划要暴露的端口
       如:docker -d -P --expose 2222 --expose 3333 --name web busybox:latest /bin/httpd -p 2222 -f
       docker port web #查看映射结果

思考1:如何在本机控制阿里云服务器上的docker?

  请查阅下一篇

思考2:宿主机上的2个网络名称空间是否能够直接通信?

  请查阅下一篇

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值