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

相关推荐
知已难寻6 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
默|笙6 小时前
【Linux网络】网络层协议 IP(1)理解报头、网段划分
linux·网络·tcp/ip
修己xj8 小时前
nslookup 使用指南:两种模式与常用查询技巧
linux
唠玖馆11 小时前
文件系统详解
linux·文件系统·ext2
GeW11 小时前
当Linux内核开始“确定性”,制造高端化才有了底层语法
linux
星恒随风12 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio13 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
StarsGreen14 小时前
libva在intel平台上的前端流程简介
linux
西风测评17 小时前
安全的自动更新怎么做:minisign 签名、先验签后解析与防回滚
rust·ssh
坤坤子吖17 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json