【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信

一、Docker网络基本命令

docker network ls查看网络
docker network inspect 网络查看网络内部信息
docker network create 网络新建网络
docker network connect 网络 容器````将容器加入到该网络中 docker network disconnect 网络 容器断开网络
docker network rm 网络移除网络(需要断开连接到该网络的所有容器)
docker network prune 网络移除未使用的网络

二、原生网络

docker安装后会自动创建3种网络:bridge、host、none
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。

01_bridge模式(默认)

  • bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。 容器通过宿主机的NAT规则后可以访问外网。
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第1张图片【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第2张图片
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第3张图片
  • docker run -d --name nginx 172.25.2.1:5000/webserver
    宿主机可以直接访问
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第4张图片外部主机不可访问
    在这里插入图片描述
    容器IP地址会变化 但是容器之间不能通过域名解析
  • IP递增且自动替补
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第5张图片

02_host模式

  • host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
    –network=host

【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第6张图片

【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第7张图片 - docker run -d --name nginx --network=host webserver
宿主机可以访问
【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第8张图片外部主机可以访问

【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第9张图片

03_ none模式

–network=none

  • none模式是指禁用网络功能,只有lo接口,在容器创建时使用
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第10张图片

三、自定义网络

  • 自定义网络模式,docker提供了三种自定义网络驱动:
    bridge
    overlay
    macvlan
  • bridge驱动类似默认的bridge网络模式,但增加了一些新的功能, overlay和macvlan是用于创建跨主机网络

01_自定义网桥

  • 创建网络
    docker network create mynet1
    在这里插入图片描述
  • 创建容器并指定网络类型为自定义mynet1:同一网络中直接ping容器名称即可
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第11张图片
  • ip addr其容器的网关172.18.0.1
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第12张图片
  • IP递增且自动替补

【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第13张图片
【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第14张图片

02_自定义网段、网关

  • 创建网络:指定网段、网关
    docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 net1
    –subnet:网段
    –gateway:网关
  • 创建容器:指定IP、网络类型
    docker run -it --name demo1 --ip 172.20.0.10 --network net1 busybox
    docker run -it --name demo2 --ip 172.20.0.20 --network net1 busybox
    –ip:指定容器ip
    –network:指定网络
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第15张图片

03_不同网桥之间通信

docker network connect 网络 容器
【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第16张图片

  • 创建容器
    docker run -it --name demo3 busybox
  • 连接网络
    docker network connect net1 demo3
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第17张图片【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第18张图片

四、容器通信

01_Joined容器与link 链接

Joined容器

  • 容器创建时使用 --network=container:容器名指定
  • 共一个享网络栈,可以高效快速通信

【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第19张图片

  • 创建容器web_demo(webserver包含nginx服务)
    docker run -d --name web_demo webserver
  • joined容器到busybox上(busybox包含shell及基本命令的小版本环境)
    docker run -it --network container:web_demo busybox
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第20张图片

link 链接容器
--link name:alias
name:可以是源容器的名称或id
alias:源容器在link下的别名

  • 创建容器
    docker run -d --name demo nginx

  • link容器
    docker run -it --link demo:nginx busybox
    当释放掉demo,开启一个demo1占用172.17.0.2后
    再开demo(IP为172.17.0.4),发现解析随之变化
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第21张图片【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第22张图片

【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第23张图片

02_容器访问外网

SNAT(地址转发:MASQUERADE)
【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第24张图片

03_外网访问容器

  • 使用docker-proxy进程通信
  • DNAT地址转发
  • 存在其中一个就可访问,双冗余机制

docker run -d --name demo1 -p 80:80 nginx
在这里插入图片描述
【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第25张图片
内部访问:
【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第26张图片
外部访问
【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第27张图片
测试

  • iptables -t nat -D DOCKER 3
    删除后发现依然可以访问(docker-proxy进程存在的前提下)
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第28张图片内部访问正常

【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第29张图片
【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第30张图片

  • kill掉docker-proxy进程
    kill 进程id,发现依然可以访问 (在地址转发正常的前提下)
    在这里插入图片描述
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第31张图片
    kill 17040
    内部访问正常
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第32张图片
    外部访问正常
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第33张图片
  • 关闭地址转发和docker-proxy
    iptables -t nat -D DOCKER 3
    内部访问拒绝
    在这里插入图片描述外部访问拒绝
    在这里插入图片描述

04_跨主机通信

添加物理网卡

两台主机:server1,server2

  • 两台主机各添加一块网卡
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第34张图片
  • 开启新添加的网卡(所有主机)
    ip link set up eth1
  • 开启混杂模式(所有主机)
    ip link set eth1 promisc on
    在这里插入图片描述
  • 创建 macvlan 类型网络(所有主机)
    docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=eth1 mac_net1
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第35张图片
  • server1:创建容器
    docker run -it --rm --network mac_net1 --ip 172.21.0.11 busybox
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第36张图片
  • server2:创建容器
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第37张图片上述操作的缺点是容器会独占网卡
    添加子接口
  • 创建子接口:父接口.1父接口.2等等(所有主机)
    docker network create -d macvlan --subnet 172.22.0.0/24 --gateway 172.22.0.1 -o parent=eth1.1 mac_net2
  • server1:创建容器
    docker run -it --rm --network mac_net2 --ip 172.22.0.21 busybox
  • server2:创建容器
    docker run -it --rm --network mac_net2 --ip 172.22.0.22 busybox
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第38张图片实现跨主机通信
    【Docker】Docker原生网络(host、bridge、none)、自定义网络、容器通信_第39张图片

你可能感兴趣的:(Docker)