Docker网络详解

一 docker网络基础

docker目前对单节点设备提供了将容器端口映射到宿主机和容器互联2个网络服务

1.1 端口映射

默认情况下docker容器时无法与外部进行通信的,需要在启动命令加入对于的参数才运行

使用-P 时默认是使用80和443进行映射,但是不能自定义宿主机端口,需要使用-p

-p指定时有3种写法:

local_port:container_port
local_ip:local_port:container_port
local_ip::container_port

sudo docker run -dit -p 127.0.0.1:8000:80 -p 4430:430 --name=nginx_test nginx /bin/bash
#指定传输协议
sudo docker run -dit -p 127.0.0.1:8000:80/tcp -p 4430:430/udp --name=nginx_test nginx /bin/bash

 1.2端口暴露

目前docker有2种方式可以用来暴露端口:要么用EXPOSE命令在dockerfile里定义,要么在docker运行时指定--expose=1234,  expose可以接受端口范围作为参数,--expose=2000~3000

1.3容器互联

端口映射的用途时宿主机与容器之间的通信,而容器互联时容器之间的通信

实现容器互联有2中方式,一种是把2个容器放进一个用户自定义的网络中,另一种使用-link参数

(已弃用)

sudo docker run -itd --name=container1 nginx
sudo docker run -itd --name=container2 nginx
sudo docker network create -d bridge --subnet 192.168.0.0/16 demo_net
sudo docker network ls
sudo docker run -itd --network=demo_net --ip 192.168.3.3 --name=container3 nginx
sudo exec -it container2 ping container3

#进入容器内部

sudo exec -it container3 /bin/bash
apt update
apt install -y curl


现象:

curl容器1卡住:

二 容器网络模式

docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker主要有以下4种网络模式。

bridge模式:--net=bridge 桥接模式(默认设置,自己创建也使用bridge 模式)

host模式:--net=host 和宿主即共享网络

container模式:--net=container:NAME_or_ID 容器网络连通!(很少用,局限性很大!)

none模式:--net=none 不配置网络

docker network ls:

2.1 bridge 网桥模式

Docker安装启动后会在宿主主机上创建一个名为 docker0 的虚拟网桥,处于七层网络模型的数据链路层,后续每当我们创建一个新的docker容器,在不指定容器网络模式的情况下,docker会通过 docker0 与主机的网络连接,docker0 相当于网桥。

使用 bridge 模式新创建的容器,容器内部都会有一个虚拟网卡,名为 eth0,容器之间可以通过容器内部的IP相互通信。

命令:

docker run -d -name tomcat01 --net=bridge -p 8085:80 tomcat:latest
说明:

  • --net=bridge 可省略 ,-p 指定端口映射
  • 网桥默认 IP 范围是一般都是 172.17.x.x

2.2 host 模式

如果指定的host模式容器不会拥有一个独立network namesace,而是与宿主主机共用network namesace。也就说明容器本身不会有的网卡信息,而是使用宿主主机的网络信息。容器除了网络,其他比如文件系统、进程等依然都是隔离的。

说明:

  • --net=host 指定
  • 容器和宿主主机共享 Network namespace
  • host模式因为和宿主主机共享network namespace,会有可能出现端口冲突的情况。

2.3 container模式

container模式和host模式很类似,host模式和宿主主机共享network namespace;container模式和指定的容器共享,两者之间除了网络共享(网卡、主机名、IP 地址),其他方面还是隔离的。

命令:

docker run -d -name tomcat02 --net=container:name/id -p 8000:80 tomcat:latest
说明:

  • –-net={容器id 或容器name} 指定
  • 当前容器和另外一个容器共享 Network namespace

2.4 none模式

如果dockers容器指定的网络模式为none,该容器没有办法联网,外界也无法访问它,可以用来本次测试。

命令:docker run -d -name tomcat02 --net=none -p 8000:80 tomcat:latest
说明:

  • --net=none 指定
  • 容器有独立的Network namespace,但并没有对其进行任何网络设置,如果需要的话,需要自定义配置网络

2.5 overlag模式

Docker Overlay 网络是一种用于跨主机通信的虚拟网络。它使用 VXLAN 技术将多个 Docker 主机上的容器连接到同一个网络中,使它们可以在不同的主机之间进行通信。在本文中,我们将深入探讨 Docker Overlay 网络的实现原理和底层原理。

2.5.1Docker Overlay 网络的实现原理

Docker Overlay 网络的实现原理主要基于两个核心技术:VXLAN 和 Swarm Mode。

2.5.1.1 VXLAN 技术

VXLAN(Virtual Extensible LAN)技术是一种用于创建虚拟网络的技术。它通过在物理网络之上创建一个虚拟网络,将多个物理网络连接到同一个网络中,从而实现跨主机通信。

在 Docker Overlay 网络中,每个 Docker 主机上都有一个 VXLAN 设备,用于将容器的网络流量封装在 VXLAN 报文中,然后通过物理网络发送到其他 Docker 主机上的 VXLAN 设备。通过使用 VXLAN,Docker Overlay 网络可以在多个 Docker 主机之间创建虚拟网络,并允许容器之间进行通信。

2.5.1.2Swarm Mode

Swarm Mode 是 Docker 引擎的集群管理工具,它可以将多个 Docker 主机组成一个集群,并管理集群中的容器。在 Docker Overlay 网络中,Swarm Mode 用于管理网络拓扑和容器之间的通信。

在 Swarm Mode 中,每个 Docker 主机都有一个网络管理代理程序,用于管理 Docker Overlay 网络。当容器被创建时,Swarm Mode 会根据容器的网络配置将其连接到 Docker Overlay 网络中,并将网络流量转发到正确的目标容器。

通过使用 Swarm Mode,Docker Overlay 网络可以实现多个 Docker 主机之间的容器通信,并确保容器之间的网络流量能够正确路由和转发。

2.5.2 Docker Overlay 网络的底层原理

Docker Overlay 网络的底层原理主要基于 Linux Bridge 和 VXLAN 技术。

2.5.2.1 Linux Bridge

Linux Bridge 是一种 Linux 内核提供的虚拟网络设备,它可以用于连接多个容器或虚拟机。在 Docker Overlay 网络中,每个 Docker 主机上都有一个 Linux Bridge 设备,用于将容器连接到虚拟网络中。

当容器被创建时,Docker 引擎会为容器创建一个虚拟网络接口,并将其连接到 Linux Bridge 设备上。容器之间的网络流量可以通过 Linux Bridge 设备进行交换和路由。

2.5.2.2VXLAN

VXLAN 技术是一种用于创建虚拟网络的技术。在 Docker Overlay 网络中,VXLAN 技术被用于将容器的网络流量封装在 VXLAN报文中,并在物理网络之上传输。

当容器之间需要进行通信时,容器会将网络流量发送到自己所在 Docker 主机的 VXLAN 设备。VXLAN 设备会将网络流量封装在 VXLAN 报文中,并将报文发送到物理网络上。接收端的 VXLAN 设备会解析 VXLAN 报文,并将网络流量发送给目标容器。

通过使用 VXLAN,Docker Overlay 网络可以在多个 Docker 主机之间创建虚拟网络,并允许容器之间进行通信。当容器之间需要进行通信时,Docker 引擎会将网络流量封装在 VXLAN 报文中,并将报文发送到物理网络上。接收端的 VXLAN 设备会解析 VXLAN 报文,并将网络流量发送给目标容器。

2.5.3Docker Overlay 网络的实现步骤

要创建 Docker Overlay 网络,需要按照以下步骤进行操作:

2.5.3.1创建 Overlay 网络

在 Swarm Mode 中,使用以下命令创建一个名为 my-overlay 的 Overlay 网络:

代码语言:javascript

代码运行次数:0

运行

AI代码解释

$ docker network create --driver overlay my-overlay
2.5.3.2启动服务

在 Docker Swarm 集群中,使用以下命令启动服务:

代码语言:javascript

代码运行次数:0

运行

AI代码解释

$ docker service create --network my-overlay --replicas 3 my-service

该命令将在 Overlay 网络中启动一个名为 my-service 的服务,并创建 3 个副本。在启动过程中,Swarm Mode 会自动将容器连接到 Overlay 网络中。

2.5.3.3检查网络

使用以下命令可以查看 Overlay 网络中的容器:

代码语言:javascript

代码运行次数:0

运行

AI代码解释

$ docker network inspect my-overlay

该命令将返回一个 JSON 格式的字符串,其中包含 Overlay 网络中的所有容器的信息。

总结

Docker Overlay 网络是一种用于跨主机通信的虚拟网络,它使用 VXLAN 技术将多个 Docker 主机上的容器连接到同一个网络中。在实现上,Docker Overlay 网络主要基于 VXLAN 和 Swarm Mode 技术,并使用 Linux Bridge 和 VXLAN 技术来实现容器之间的通信。

2.6 Docker 网络桥接模式和 Host 模式的区别

首先,我们需要了解一下 Docker 的两种网络模式之间的区别。在桥接网络模式下,Docker 将为每个容器创建一个独立的网络命名空间,并为容器分配一个|P 地址。而在 Host 网络模式下,容器将直接使用主机的网络栈,与主机共享网络接口和 IP 地址,这意味着容器可以直接访问主机上的所有网络服务,同时也会导致容器与主机网络之间的隔离性降低。

2.7 Docker 网络桥接改 Host

在使用 Docker 运行容器时,经常会涉及到网络配置。默认情况下,Docker 使用桥接网络模式来为容器提供网络连接。但有时候,我们可能需要将容器直接连接到主机的网络,这时就需要将 Docker 网络模式改为 Host 模式。在本文中,我们将介绍如何通过改变 Docker 网络桥接模式为 Host 模式来实现容器直接连接到主机网络的配置。

Docker 容器不能直接修改已创建的网络模式为 host。但是,你可以通过以下步骤来实现你的需求:

1. 停止当前运行的容器。
2. 删除原有的容器。
3. 重新创建并指定网络模式为 host。

以下是一些可能的解决方案:

解决方案1:使用命令行

# 停止当前运行的容器
docker stop <container_id>
 
# 删除原有的容器
docker rm <container_id>
 
# 重新创建并指定网络模式为 host
docker run --net=host --name=<container_name> <image_name>

解决方案2:使用Docker Compose
如果你使用Docker Compose来管理你的容器,你可以在你的docker-compose.yml文件中更改网络模式,然后重新创建你的服务。

version: '3'
services:
  your_service:
    image: your_image
    network_mode: host

然后运行以下命令来重新创建服务:

docker-compose up -d

注意:使用 host 网络模式的容器将会使用宿主机的网络,这意味着容器的网络配置和DNS设置将与宿主机相同。这可能会导致网络配置冲突,因此在使用 host 网络模式前,请确保这是你想要的行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值