Docker 网络(一)

Docker 容器在创建时,虽然会通过 Linux 的命名空间完成与宿主机进程的网络隔离,但是却有没有办法通过宿主机的网络与整个互联网相连,这会对 Docker 的应用产生限制。为此,每一个使用 docker run 启动的容器都会为其分配单独的网络命名空间。Docker 提供了四种不同的网络模式,分别是 Host、Container、None 和 Bridge 模式。

Host 模式

在 Host 模式下,容器直接使用宿主机的网络栈,不进行网络隔离。这意味着容器的网络配置与宿主机完全相同,容器内的应用程序可以直接使用宿主机的 IP 地址和端口。

bash 复制代码
root@docker-host:~# docker run --network host nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2026/07/06 23:40:06 [notice] 1#1: using the "epoll" event method
2026/07/06 23:40:06 [notice] 1#1: nginx/1.31.2
2026/07/06 23:40:06 [notice] 1#1: built by gcc 14.2.0 (Debian 14.2.0-19)
2026/07/06 23:40:06 [notice] 1#1: OS: Linux 5.4.0-216-generic
2026/07/06 23:40:06 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2026/07/06 23:40:06 [notice] 1#1: start worker processes
2026/07/06 23:40:06 [notice] 1#1: start worker process 28
2026/07/06 23:40:06 [notice] 1#1: start worker process 29
bash 复制代码
root@docker-host:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
c85c56faec75   nginx     "/docker-entrypoint..."   3 minutes ago   Up 3 minutes             wonderful_pascal
root@docker-host:~#

root@docker-host:~# curl http://127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

如果在宿主机上访问 http://127.0.0.1:80,实际上访问的是容器内的 Nginx 服务。

Host 模式适用场景: 需要容器与宿主机共享网络栈,适用于对网络性能要求较高的场景,此时不需要端口映射,容器直接可以使用宿主机的端口。

为不影响后续实验,使用 docker container prune 删除已停止的容器。

Container 模式

在 Container 模式下,新创建的容器会共享另一个容器的网络命名空间。这意味着两个容器的网络配置完全相同,它们可以通过 localhost 直接通信。

bash 复制代码
root@docker-host:~# docker run -d --name nginx nginx
017a4ab5c7c22ca519df0472de4d8eaf48dcf06b5329edebf5f8b836f918007e
root@docker-host:~# docker run --network container:nginx alpine ping localhost
PING localhost (::1): 56 data bytes
64 bytes from ::1: seq=0 ttl=64 time=0.037 ms
64 bytes from ::1: seq=1 ttl=64 time=0.083 ms
64 bytes from ::1: seq=2 ttl=64 time=0.095 ms
64 bytes from ::1: seq=3 ttl=64 time=0.075 ms

root@docker-host:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
b7af4a785764   alpine    "ping localhost"         47 seconds ago  Up 46 seconds            nice_khorana
017a4ab5c7c2   nginx     "/docker-entrypoint..."    About a minute ago Up About a minute 80/tcp  nginx
root@docker-host:~#

通过 --network container:nginx 参数,alpine 容器就可共享 nginx 容器的网络命名空间,通过 localhost 就可直接访问 nginx 容器的网络服务。

Container 模式适用场景: 需要多个容器共享同一个网络栈,适用于需要紧密协作的容器组。例如,一个容器运行应用程序,另一个容器运行日志收集器,两者就可以通过 localhost 直接通信。

None 模式

在 None 模式下,容器不会配置任何网络栈,即容器内没有网络接口,无法与外界通信。

bash 复制代码
root@docker-host:~# docker run --network none alpine ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
root@docker-host:~#

使用 --network none 参数启动一个 Alpine 容器,在容器内执行 ip addr 命令,可以看到容器内没有任何网络接口。容器无法与外界通信,也无法被外界访问。

bash 复制代码
root@docker-host:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED        STATUS                     PORTS   NAMES
e8fd15bdf428   alpine    "ip addr" 2 seconds ago  Exited (0) 1 second ago            practical_mahavira
root@docker-host:~#

None 模式适用场景: 适用于不需要网络通信的场景,例如只进行本地数据处理或测试;安全性要求较高的场景,确保容器与外界完全隔离。

Bridge 模式

Bridge 模式是 Docker 的默认网络模式。在这种模式下,Docker 会为每个容器创建一个虚拟网络接口,并将其连接到 Docker 的虚拟网桥(通常是 docker0)。容器通过这个网桥与宿主机和其他容器进行通信。

bash 复制代码
root@docker-host:~# docker run -d --name nginx -p 8080:80 nginx
0ec98a6971ec5390c3f06c4099914e6a00f1d21b15409bb97f8374b3de4b9a78
root@docker-host:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS        PORTS                                     NAMES
0ec98a6971ec   nginx     "/docker-entrypoint..."    6 seconds ago  Up 5 seconds  0.0.0.0:8080->80/tcp, :::8080->80/tcp     nginx
root@docker-host:~#

使用 -p 8080:80 参数启动一个 Nginx 容器,将容器的 80 端口映射到宿主机的 8080 端口。Docker 会自动创建一个虚拟网络接口,并将其连接到 docker0 网桥。通过 curl http://localhost:8080 就能访问容器内的 Nginx 服务。

bash 复制代码
root@docker-host:~# curl http://localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

Bridge 模式适用于大多数需要容器与宿主机或其他容器通信的场景。通过端口映射,容器内的服务可以被外部网络访问。

相关推荐
时间售卖铺4 小时前
Nginx 反向代理
运维·nginx·云原生
life码农4 小时前
Nginx location 优先级详解:匹配规则、修饰符与完整代码示例
运维·nginx
别动我齐刘海5 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
Lsetea5 小时前
curl -I检查HTTPS返回405:HEAD、GET与证书验收分层排查
linux·http·https·ssl证书·curl
我命由我123455 小时前
Python 开发 - Python 虚拟环境
运维·开发语言·后端·python·http·https·java-ee
dlhto5 小时前
Windows 使用 Rufus 制作 AlmaLinux 10.2 启动 U 盘:从 ISO 下载到服务器安装
运维·服务器·windows
一直C5 小时前
嵌入式 Linux 驱动开发学习笔记:内核定时器、platform 总线与 I²C 驱动
linux·驱动开发·嵌入式硬件·学习·imx6ull
软件派5 小时前
Beam.Win 自动化办公与业务流程提效指南
运维·自动化
承渊政道5 小时前
Linux网络学习【传输层协议UDP】
linux·网络·网络协议·学习·ubuntu·udp
andrsted5 小时前
练题簿免费刷题小程序:和学习搭子共用一份题库,一起刷题复习
学习·面试·微信小程序·小程序·学习方法·刷题