文章目录
Docker 网络
Docker 网络实现原理
Docker 使用 Linux 桥接技术,在宿主机上虚拟一个名为 docker0
的 Docker 容器网桥。当 Docker 启动一个容器时,会根据 docker0
网桥的网段分配给容器一个 IP 地址(Container-IP)。由于同一宿主机内的容器都连接到同一个网桥,因此容器之间可以通过各自的 Container-IP 直接通信。
Docker 网桥是虚拟的,不是真实存在的网络设备,因此外部网络无法直接寻址到它,这意味着外部网络无法直接通过 Container-IP 访问容器。如果希望外部网络能够访问容器,可以通过端口映射将容器端口映射到宿主主机,即使用 docker run
命令的 -p
或 -P
参数。
端口映射示例
# 随机映射端口(从32768开始)
docker run -d --name test1 -P nginx
# 指定映射端口
docker run -d --name test2 -p 43000:80 nginx
通过 docker ps -a
可以查看容器的端口映射情况,例如:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d3c04f57a68 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:43000->80/tcp test2
b04895f870e5 nginx "/docker-entrypoint.…" 17 seconds ago Up 15 seconds 0.0.0.0:49170->80/tcp test1
可以通过浏览器访问 http://192.168.80.10:43000
和 http://192.168.80.10:49170
来访问对应的容器。
查看容器的输出和日志信息
使用 docker logs
命令可以查看容器的输出和日志信息:
docker logs 容器的ID/名称
Docker 的网络模式
使用 --net
或 --network
选项指定容器的网络模式
- Host 模式
- 相当于 Vmware 中的桥接模式,与宿主机在同一个网络中,但没有独立 IP 地址。
- 容器与宿主机共享同一个 Network Namespace,使用宿主机的 IP 和端口。
- 使用
--net=host
指定。
- Container 模式
- 新创建的容器与已存在的容器共享一个 Network Namespace。
- 共享 IP、端口范围等,但文件系统、进程列表等仍然隔离。
- 使用
--net=container:NAME_or_ID
指定。
- None 模式
- 容器拥有自己的 Network Namespace,但不进行任何网络配置。
- 只有 lo 回环网络,没有其他网卡。
- 无法联网,但保证了容器的安全性。
- 使用
--net=none
指定。
- Bridge 模式
- Docker 的默认网络模式。
- 容器使用独立的 Network Namespace,并连接到
docker0
虚拟网卡。 - 通过
docker0
网桥和 iptables nat 表配置与宿主机通信。 - 为每个容器分配 IP,并通过 veth pair 设备与
docker0
网桥连接。 - 默认设置,可省略或使用
--net=bridge
指定。
- 自定义网络
- 允许用户自定义网络配置,如指定子网、网关等。
- 可以使用
docker network create
命令创建自定义网络。 - 示例:
# 创建自定义网络 docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork #docker1 为执行 ifconfig -a 命令时,显示的网卡名,如果不使用 --opt 参数指定此名称,那你在使用 ifconfig -a 命令查看网络信息时,看到的是类似 br-110eb56a0b22 这样的名字,这显然不怎么好记。 #mynetwork 为执行 docker network list 命令时,显示的bridge网络模式名称。