Docker网络管理--原生网络(bridge host none)与自定义网络

本文介绍了Docker的默认网络模式,包括bridge、host和none模式,详细阐述了它们的工作原理及优缺点。此外,还探讨了如何创建和配置自定义网络,以实现不同网段容器间的通信,强调了Docker网络隔离和灵活性的重要性。

当开始大规模使用Docker时,会发现需要了解很多关于网络的知识。Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker 的网络知识,以满足更高的网络需求。本文首先介绍了Docker自身的4种网络工作方式,然后介绍一些自定义网络模式。

一 默认网路(bridge host none)

当安装Docker时,它会自动创建三个网络。你可以使用以下docker network ls命令列出这些网络

[root@server1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1ac95ee04680        bridge              bridge              local
7cc9b35549e8        host                host                local
087f79d6ce55        none                null                local

当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥
ip addr show docker0

 

Docker内置这三个网络,运行容器时,可以使用该--network标志来指定容器应连接到哪些网络。

bridge网络代表docker0所有Docker安装中存在的网络。除非你使用该docker run --network=<NETWORK>选项指定,否则Docker守护程序默认将容器连接到此网络。

我们在使用docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式:

host模式:使用 --net=host 指定。

none模式:使用 --net=none 指定。

bridge模式:使用 --net=bridge 指定,默认设置。

container模式:使用 --net=container:NAME_or_ID 指定。

下面分别介绍一下Docker的各个网络模式。

1.1 默认网络通信模式brigde网桥

当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物 理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网 段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般 Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是 可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。

开启容器后,自动添加brigde接口

Bridge 桥接模式的实现步骤主要如下:

    Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
    Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;
    Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性

<
<think>我们正在讨论`docker run --network host`命令的含义。根据用户提供的引用内容,我们可以总结如下: 引用[1]提到:使用`--network=host`可以让Docker容器共享主机的网络栈,容器直接使用主机的IP地址和端口。这种方法不推荐用于跨主机通信,因为会共享所有网络资源,可能导致冲突和安全问题。 引用[2]提到:默认情况下,Docker容器会分配独立的Network NameSpace(网络命名空间)以实现网络隔离。而使用host网络模式时,容器不会获得独立的Network NameSpace,而是和宿主机共用一个。 引用[3]提到:Docker网络模式包括bridge(桥接,默认模式)、none(不配置网络)、host(和宿主机共享网络)、container(容器网络连通)。其中host模式就是共享宿主机的网络。 因此,我们可以这样解释: ### `docker run --network host`命令的含义 1. **网络模式定义** `--network host`指定容器使用**host网络模式**,即容器宿主机共享同一个网络命名空间(Network Namespace)[^2][^3]。 2. **网络行为** - 容器直接使用宿主机的IP地址和端口,不进行网络隔离[^1]。 - 容器内运行的服务可以通过宿主机的IP和端口直接访问(例如,容器内运行的Web服务在80端口,则可通过宿主机IP:80访问)。 - 容器不会获得独立的虚拟网络接口,而是直接使用宿主机的网络接口。 3. **默认模式(bridge)的对比** - 默认情况下,Docker使用`bridge`模式,为容器创建虚拟网络接口,并通过NAT进行端口映射(如`-p 8080:80`)[^3]。 - 在`host`模式下,无需端口映射,容器服务直接绑定到宿主机端口。 4. **使用示例** ```bash # 运行Nginx容器并使用host网络模式 docker run --network host nginx ``` - 此时,Nginx将直接监听宿主机的80端口,无需`-p`参数映射。 5. **注意事项** - **端口冲突**:若宿主机已占用某端口,容器无法绑定相同端口(例如宿主机已运行SSH服务监听22端口,则容器内服务不能再用22端口)[^1]。 - **安全性**:容器宿主机网络无隔离,容器内进程可访问宿主机的所有网络服务(如数据库、本地API等),存在安全风险。 - **适用场景**:适用于高性能网络需求或临时测试,不推荐生产环境跨主机使用。 > **重要提示**:在Linux系统中,`host`模式可直接使用;在Windows/macOS的Docker Desktop中,该模式可能受限(因虚拟机层存在)。 §§相关问题§§ 1. Dockerhost网络模式bridge模式有何性能差异? 2. 如何解决host模式下的端口冲突问题? 3. 在Docker Swarm或Kubernetes中能否使用host网络模式? </think> ### `docker run --network host` 命令详解 #### 1. **核心概念** `--network host` 参数指定 Docker 容器**直接共享宿主机的网络命名空间**(Network Namespace)[^2]。这意味着: - 容器不会获得独立的虚拟网络接口 - 容器直接使用宿主机的 IP 地址和网络接口 - 容器内的服务通过宿主机的端口直接暴露 - **网络隔离被完全禁用** #### 2. **默认模式的对比** | 特性 | 默认模式 (`bridge`) | `host` 模式 | |--------------------|-----------------------------|----------------------------| | **网络隔离** | 独立网络命名空间 | 共享宿主机网络命名空间 [^2] | | **IP 地址** | 容器分配私有 IP (如 172.17.0.x) | 直接使用宿主机 IP | | **端口映射** | 需 `-p` 参数显式映射端口 | 无需映射,直接绑定宿主机端口 | | **性能** | 有 NAT 转换开销 | 接近原生网络性能 | | **安全性** | 网络层隔离 | 无网络隔离 | #### 3. **典型使用场景** ```bash # 运行容器并启用host网络模式 docker run --network host nginx ``` - **效果**:NGINX 容器直接监听宿主机的 80 端口 - **验证**:在宿主机执行 `curl localhost` 即可访问容器服务 - **对比默认模式**:默认需 `-p 80:80` 映射端口 #### 4. **技术原理** 当使用 `--network host` 时: 1. 容器跳过 Docker 的虚拟网络栈(veth pair) 2. 容器进程直接通过宿主机的网络接口收发数据 3. `ifconfig` 在容器内显示的是宿主机的网卡信息 4. 容器进程通过 `localhost` 访问宿主机服务[^4] #### 5. **注意事项** 1. **端口冲突** 容器无法绑定已被宿主机占用的端口(如宿主机已运行 SSH 则容器无法使用 22 端口) 2. **安全隐患** 容器可直接访问宿主机所有网络服务(数据库、API 等),需严格限制使用场景[^1] 3. **跨主机限制** 无法直接实现跨主机容器通信,需依赖宿主机网络配置 4. **适用系统** 在 Linux 原生 Docker 中完整支持,Windows/macOS 的 Docker Desktop 因虚拟机层存在限制 > **替代方案**:若需性能优化但保留隔离性,可使用 `macvlan` 或 `ipvlan` 网络驱动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值