云计算百科
云计算领域专业知识百科平台

Docker 网络(一)

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

Host 模式

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

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
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 直接通信。

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 模式下,容器不会配置任何网络栈,即容器内没有网络接口,无法与外界通信。

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 命令,可以看到容器内没有任何网络接口。容器无法与外界通信,也无法被外界访问。

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)。容器通过这个网桥与宿主机和其他容器进行通信。

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 服务。

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

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

赞(0)
未经允许不得转载:网硕互联帮助中心 » Docker 网络(一)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!