docker网络

官方文档:https://docs.docker.com/network/

素材准备:

1.Dockerfile定义

From alpine:3.18
run apk add ethtool
run apk add ipvsadm
run apk add iptables

2.构建镜像

docker build -t myalpine .

网络解决什么问题

  1. 容器与外界通信

  2. 容器间通讯,跨主机容器间通讯

  3. 网络隔离(容器网络命名空间、子网隔离)

  4. 提供网络自定义能力

  5. 提供容器间发现功能

  6. 提供负载均衡能力

docker网络命令

//连接一个容器到一个网络
docker network connect Connect a container to a network

//创建一个网络
docker network create Create a network

//将容器从一个网络中断开
docker network disconnect Disconnect a container from a network

//查看网络的详细信息
docker network inspect Display detailed information on one or more networks

//查看网络列表
docker network ls List networks

//移除所有未使用的网络
docker network prune Remove all unused networks

//移除一个或多个网络
docker network rm Remove one or more networks

网络驱动

bridge(网桥网络)

什么是桥接网络
  1. bridge是docker默认的网络驱动程序。如果没有指定驱动程序,这就是正在创建的网络类型。当应用程序在需要与同一主机上的其他容器通信的容器中运行时,通常会使用桥接网络。

  2. 就联网而言,桥接网络是在网段之间转发流量的链路层设备,链路层设备Mac地址进行通信。桥接器可以是在主机内核运行的硬件设备或者软件设备。

  3. 就docker而言,网桥网络为软件网桥。允许连接到同一网桥的容器进行通讯,同时提供与未连接到该网桥的容器的隔离。不同网桥上的容器无法直接通讯。

  4. 启动docker是,会自动创建一个名为docker0的网桥网络,并且新启动的容器会默认连接到该网 络。

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

  2. 自定义网桥提供更好的网络隔离,因为所有未指定网络的容器都将连接到默认网桥,而自定义网桥 则必须显示指定容器网络后,方可加入该网络。

  3. 每个自定义网络都会创建一个可配置的网桥。如果使用默认网桥,对其配置将使得所有容器都使用 相同的设置,此外配置默认网桥发生在docker本身之外,需要重新启动docker。使用docker网络创建和配置自定义网桥网络,可以在创建是分别对不同的网桥做不同的配置。

查看默认网络
1.查看网络
docker network ls

安装docker后,会默认创建bridge、host、none 三个网络

2. 默认桥接网络
docker network inspect bridge

默认桥接网络子网为:172.17.0.0/16,网桥名称为docker0

3. 查看本机网卡信息
ip addr

4. linux内核路由表
route -n

所有以172.17开头并且子网掩码为255.255.0.0的IP地址的数据包都会被发送到docker0网桥

Overlay(覆盖网络)

什么是overlay网络
  1. overlay网络驱动程序在多个Docker守护进程主机之间创建分布式网络。该网络位于(覆盖)特定 于主机的网络之上,允许连接到该网络的容器(包括群集服务容器)在启用加密时安全通信。 Docker透明地处理每个数据包往返于正确的Docker守护进程主机和正确的目标容器的路由

  2. 初始化一个swarm集群或将Docker主机加入现有swarm集群时,会在该Docker主机上创建两个新网络:

  3. 名为ingress的overlay网络,处理与swarm service相关的控制和数据流量。创建一个service 没有指定自定义网络时,默认将连接到ingress网络。ingress网络提供对容器化应用程序的负 载均衡和路由功能。它允许外部流量通过单一入口点访问多个容器,并根据定义的规则将请求 转发到适当的后端容器

  4. 名为docker-gwbridge的bridge网络,用于将覆盖网络(包括ingress网络)连接到单个 Docker守护程序的物理网络。通过这个网络,容器可以连接到宿主机

  5. 可以使用docker network create创建自定义的overlay网络,方法与创建自定义bridge网络相同。 服务或容器一次可以连接到多个网络。服务或容器只能通过各自连接的网络进行通信。

overlay驱动使用案例
1. 初始化swarm集群,会默认创建ingress 网络和docker_gwbridge网络
docker swarm init

2. 添加两个worker节点到集群
# 获取加入集群的命令
docker swarm join-token worker
  1. 创建service,将加入默认ingress网络素材准备

    docker service create -p 8080:80 --replicas 3 --name nginx-svc nginx:latest

4. 查看ingress 网络明细
docker network inspect ingress
5. 查看docker_gwbridge网络详情
docker network inspect docker_gwbridge
6. 查看iptables网络转发
sudo iptables -nvL -t nat

Host(主机网络)

什么是Host网络
  1. Host模式,即容器网络不会与宿主机产生网络隔离,而是使用主机的网络栈,容器不会分配自己的 IP地址。运行容器是所有端口映射的选项都将失效,并且在使用时产生警告信息。主机模式可以用 于性能优化,因为主机模式下无需网络地址转换(NAT),并且不会为每个端口创建userland-proxy(在默认情况下,Docker使用Userland Proxy作为默认的端口转发机制。Userland Proxy基 于iptables规则进行转发,将容器内部的网络流量通过宿主机上的特定端口进行转发。)

  2. Host模式,仅适用于linux主机,Mac和windows主机不支持

  3. docker run 或docker service create 通过指定--network host 来使用主机网络。该模式下集群节点上运行容器将受到限制(例如:容器端口为80端口,由于使用主机网络,则每个集群节点仅能运行 一个80端口的容器)

IPvlan

什么是IPvlan
  1. IPvlan驱动程序为用户提供了对IPv4和IPv6寻址的完全控制。VLAN驱动程序在此基础上构建,使运 营商能够完全控制第2层VLAN标记,甚至为对底层网络集成感兴趣的用户提供IPvlan L3路由。

  2. ipvlan网络驱动程序可以用于创建IPVLAN网络,它允许将容器连接到现有的物理网络接口,并通过 共享主机内核栈来实现高性能和低延迟

  3. 创建ipvlan驱动网络,--option选项:

  4. ipvlan_mode:设置IPvlan模式默认值为 l2,可选值为:l2(容器和主机共享相同的MAC地 址,但拥有不同的IP地址)、l3、l3s。

  5. ipvlan_flag:设置IPvlan模式flag,默认值为 bridge,可选值为:bridge,private,vepa (Virtual Ethernet Port Aggregator)

  6. parent:指定需要使用的父级网卡

内核要求
  1. linux 内核版本 v4.2+ 2. unname -r 查看内核版本

Macvlan

什么是Macvlan
  1. 一些应用程序,特别是遗留应用程序或监控网络流量的应用程序,期望直接连接到物理网络。在这 种情况下,您可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配一个MAC地址,使其 看起来像是直接连接到物理网络的物理网络接口。在这种情况下,您需要在Docker主机上指定一个 物理接口用于Macvlan,以及网络的子网和网关。您甚至可以使用不同的物理网络接口隔离您的 Macvlan网络

  2. 注意一下几点:

  3. 由于IP地址耗尽或"VLAN扩散"(当您的网络中有大量不适当的唯一MAC地址时会出现这种情 况),您可能会无意中降低网络性能。

  4. 您的网络设备需要能够处理"混杂模式",即一个物理接口可以分配多个MAC地址。

  5. 如果您的应用程序可以使用bridge(在单个Docker主机上)或overlay(在多个Docker主机之 间进行通信)来工作,那么从长远来看,这些解决方案可能会更好。

  6. 创建macvlan驱动网络,--option选项:

  7. macvlan_mode:默认为bridge,可选项有:bridge, vepa, passthru, private

  8. parent:指定需要使用的父级网卡

None

如果要完全隔离容器的网络堆栈,可以在启动容器时使用--network-none标志。在容器中,只创建 环回设

相关推荐
A陈雷8 分钟前
springboot整合elasticsearch,并使用docker desktop运行elasticsearch镜像容器遇到的问题。
spring boot·elasticsearch·docker
小han的日常10 分钟前
接口自动化环境搭建
运维·自动化
小扳13 分钟前
Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
运维·spring boot·后端·mysql·spring cloud·docker·容器
运维小文17 分钟前
服务器硬件介绍
运维·服务器·计算机网络·缓存·硬件架构
是安迪吖27 分钟前
nfs服务器
运维·服务器
鱼骨不是鱼翅29 分钟前
模拟回显服务器
运维·服务器
politeboy1 小时前
关于k8s中镜像的服务端口被拒绝的问题
云原生·容器·kubernetes
weixin_438197381 小时前
K8S创建云主机配置docker仓库
linux·云原生·容器·eureka·kubernetes
Elastic 中国社区官方博客1 小时前
使用真实 Elasticsearch 进行更快的集成测试
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·集成测试
舞动CPU7 小时前
linux c/c++最高效的计时方法
linux·运维·服务器