Docker 网络

22 篇文章 0 订阅
14 篇文章 0 订阅

文章来源:WorkMap技术博客-Docker网络

简介

容器网络指的是容器之间(或容器与非Docker工作负载之间)连接和通信的能力。

容器不知道它连接到了什么样的网络,也不知道它的对等方是否也是Docker工作负载。容器只看到一个带有IP地址、网关、路由表、DNS服务和其他网络细节的网络接口。

默认情况下,使用docker create或docker run创建或运行容器时,容器不会将任何端口暴露给外部。

使用–publish或-p,将端口公开给Docker外部的服务。这会在主机上创建一个防火墙规则,将容器端口映射到主机上的一个端口,让外部访问。
以下是一些示例:

-p 8080:80
将容器中的 TCP 80 端口,映射到 Docker 主机的8080 端口 。

-p 192.168.1.100:8080:80
将容器中的 TCP 80 端口,映射到 IP 为 192.168.1.100 的Docker 主机 的8080 端口 。
> 只有ip是192.168.1.100的主机可以访问该容器;

-p 8080:80/udp
将容器中的 UDP 80 端口, 映射到 Docker 主机的8080 端口 。

-p 8080:80/tcp -p 8080:80/udp
将容器中的 TCP 80 端口,映射到 Docker 主机的 TCP 8080 端口 ,并将容器中的 UDP 80 端口,映射到 Docker 主机的 UDP 8080 端口 。

docker 网络驱动

Docker 的网络子系统是插件式架构的,通过不同的驱动程序来控制。默认提供下列驱动程序:

  • bridge:默认的网络驱动程序。如果不指定驱动程序,则创建的就是bridge网络。桥接网络通常用于同一主机上的多个容器间通信。

  • host:移除容器和 Docker 主机之间的网络隔离,直接使用主机的网络。用于系统类程序,需要访问主机网络。

  • overlay:将多个 Docker 主机连接在一起,使不同节点上的 Swarm 服务和独立容器可以通信。该方式可以解耦对操作系统级别路由的依赖。

  • ipvlan:IPvlan 网络使用户完全控制 IPv4 和 IPv6 寻址。VLAN 驱动程序在此基础上构建,可以完全控制layer 2 VLAN 标记甚至 IPvlan L3 路由。

  • macvlan:Macvlan 网络可以为容器分配 MAC 地址,使容器在主机网络上显示为物理设备。Docker 守护程序可以通过它们的 MAC 地址将流量路由到容器。用于期望直接连接到物理网络的传统应用程序。

  • none:完全隔离容器与主机和其他容器。

  • 网络插件:可以安装和使用第三方网络插件。

默认安装的docker Engine,执行docker network ls命令,可以列出所有网络。包括:bridge,host,none。

Bridge网络

桥接网络适用于在同一 Docker主机上运行的容器间通信。在不同 Docker 主机上运行的容器间通信,可以在操作系统级别管理路由,或者可以使用Overlay网络。
启动 Docker 时,会自动创建默认桥接网络(也称为 bridge),并且新启动的容器会默认连接到它。还可以创建用户定义的桥接网络。用户定义的桥接网络优先级高于默认桥接网络。

自定义桥接网路和默认桥接网络的区别

  • 用户定义的桥接网络提供容器之间的自动 DNS 解析。
    默认桥接网络上的容器只能通过 IP 地址相互访问,
    在用户定义的桥接网络上,容器可以通过名称或别名解析彼此。

  • 用户定义的桥接网络提供更好的隔离。
    所有没有指定 --network 的容器都附加到默认桥接网络上。这可能会存在风险,因为不相关的堆栈/服务/容器可以相互通信。
    使用用户定义的网络提供了一个作用域网络,只有附加到该网络的容器才能通信。

  • 容器可以随时连接和断开用户定义的网络。
    在容器的生命周期中,您可以随时连接或断开它与用户定义的网络的连接。
    要将容器从默认桥接网络中删除,需要停止容器并使用不同的网络选项重新创建它。

  • 每个用户定义的网络都创建一个可配置的桥接。
    可以对默认桥接网络进行配置,但所有容器都使用相同的设置,例如 MTU 和 iptables 规则。默认桥接网络的配置需要重新启动 Docker。
    使用 docker network create 创建和配置用户定义的桥接网络。如果不同组应用程序具有不同的网络要求,则可以在创建时单独配置每个用户定义的桥接。

常用命令

  • 创建网络
    docker network create my-net
    

    创建自定义网络时,可以指定配置,可以通过docker network create --help命令查看参数。

  • 删除网络
    docker network rm my-net
    
  • 启动容器时,连接到自定义网路
    docker create --name my-nginx \
    --network my-net \
    --publish 8080:80 \
    nginx:latest
    
  • 将正在运行中的容器,连接到自定义网络
    docker network connect my-net my-nginx
    
  • 将容器从自定义网络中断开连接
    docker network disconnect my-net my-nginx
    

Host网络

使用主机网络模式时,该容器的网络堆栈与 Docker 主机不隔离(容器共享主机的网络命名空间),并且容器不会分配自己的 IP 地址。

注意:使用主机模式网络时,由于容器没有自己的 IP 地址,因此端口映射不起作用,-p、–publish、-P 和 --publish-all 选项被忽略,并产生警告。

主机模式网络可用于优化性能,在需要处理大量端口的情况下非常有用,因为它不需要网络地址转换(NAT),并且不会为每个端口创建“用户空间代理”。

主机网络驱动程序仅适用于 Linux 主机,并不支持 Docker Desktop for Mac、Docker Desktop for Windows 或 Docker EE for Windows Server。

创建容器时使用host网络模式

docker run --rm -d --network host --name my_nginx nginx

通过http://localhost:80 访问该服务。

Overlay网络

Overlay网络驱动程序,在多个 Docker 主机之间创建分布式网络。该网络层位于主机网络之上,支持加密通信。
初始化一个 swarm集群 或将 Docker 主机加入现有 swarm 集群时,Docker 宿主机上会创建两个新网络:

  • 一个名为ingress的Overlay网络,处理与 swarm 服务相关的控制和数据流量。创建 swarm 服务时,会默认连接到 ingress 网络。
  • docker_gwbridge 桥接网络,用于连接多个Docker主机。

可以使用 docker network create 创建自定义的Overlay网络,就像创建自定义的桥接网络一样。服务或容器可以同时连接到多个网络。服务或容器只能在它们各自连接的网络之间进行通信。
虽然可以将 swarm 服务和独立容器都连接到覆盖网络,但默认行为和配置注意事项是不同的。

前置条件

  • 加入到Overlay网络的 Docker 主机需要打开以下端口:

    • 用于集群管理的 TCP 端口 2377
    • 用于节点之间通信的 TCP 和 UDP 端口 7946
    • 用于Overlay网络通信的 UDP 端口 4789
  • 在创建Overlay网络之前,必须通过 docker swarm init 将 Docker主机初始化为集群管理节点,或使用 docker swarm join 将其加入到现有的swarm集群中。这两个操作都会创建默认的供Swarm服务使用的ingress。

使用方式

  • 创建Swarm 服务使用的Overlay网络
    docker network create -d overlay my-overlay
    
  • 创建Swarm服务和独立容器间通信的Overlay网络
    docker network create -d overlay --attachable my-attachable-overlay
    
  • 创建加密网络
    docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network
    

使用自定义的ingress

  • 删除默认ingress
    docker network rm ingress
    
  • 创建自定义ingress(可以自定义名字,但只能创建一个)
    docker network create \
    --driver overlay \
    --ingress \
    --subnet=10.11.0.0/16 \
    --gateway=10.11.0.2 \
    --opt com.docker.network.driver.mtu=1200 \
    my-ingress
    

自定义docker_gwbridge(在加入到Swarm集群之前)

  • 停止Docker引擎
  • 删除docker_gwbridge
    sudo ip link set docker_gwbridge down
    sudo ip link set docker_gwbridge down
    
  • 启动docker引擎
  • 创建自定义docker_gwbridge
    docker network create \
    --subnet 10.11.0.0/16 \
    --opt com.docker.network.bridge.name=docker_gwbridge \
    --opt com.docker.network.bridge.enable_icc=false \
    --opt com.docker.network.bridge.enable_ip_masquerade=true \
    docker_gwbridge
    
  • 加入到swarm集群

Overlay网络的缺陷

由于 Linux 内核的限制,当1000个容器共存于同一主机上时,覆盖网络变得不稳定,容器间通信可能会中断。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值