Docker 网络
Docker 网络
docker 不启动时,执行 ifconfig 命令可以看到:ens33、lo、virbr0 三种网络模式
dokcer 启动时,执行 ifconfig 命令可以看到多了一个 docker0 网络模式:
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:2fff:fe35:8012 prefixlen 64 scopeid 0x20<link>
ether 02:42:2f:35:80:12 txqueuelen 0 (Ethernet)
RX packets 42079 bytes 12247762 (11.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 72707 bytes 51520535 (49.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Docker 网络的作用
- 容器间的互联和通信以及端口映射
- 容器 IP 变动时可以通过服务名直接网络通信而不受到影响
常用命令
查看 docker 网络
docker network ls
创建 docker 网络
docker network create 网络名称
删除 docker 网络
docker network rm 网络名称
查看 docker 网络具体信息
docker network inspect 网络名称
Docker 网络模式
- bridge
为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网桥,默认为该模式;使用 --network bridge 指定,默认使用 docker0;Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为 docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络,Docker 默认指定了 docker0 接口的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,说明:
Docker 使用 Linux 桥接,在宿主机虚拟一个 Docker 容器网桥(docker0),Docker 启动一个容器时会根据 Docker 网桥的网段分配给容器一个 IP 地址,称为 Container-IP,同时 Docker 网桥时每个容器的默认网关,因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信
整个宿主机的网桥模式都是 docker0,类似一个交换机有一堆接口,每个接口叫 veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫 veth pair)
每个容器实例内部也有一块网卡,每个接口叫eth0
docker0 上面的每个 veth 匹配某个容器实例内部的 eth0,两两配对,一一匹配
通过以上描述将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的 ip,此时两个容器的网络是互通的,如图:
- host
容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口;使用 --network host 指定;
容器启动时指定网络模式为 host,如果还指定了 -p 映射端口,会报以下警告:
WARNING: Published ports are discarded when using host network mode
并且通过 -p 设置的参数啊将不会起到任何作用,端口号会以主机端口号为主,重复时则递增(即端口号为默认端口号,比如 tomcat 默认端口号为 8080 则以 host 网络模式启动 tomcat 容器时,即使指定了 -p 也不生效,启动端口还是 8080)
解决方法:
使用 docker 的其他网络模式,例如 --network=bridge,这样就可以解决问题,或者直接无视警告
- none
容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,IP 等;使用 --network none 指定
- container
新创建的容器不会创建自己的网卡和配置自己的 IP,而是和一个指定的容器共享 IP,端口范围等;两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的;使用 --network container:NAME或容器 ID 指定
- 自定义网络
docker network create 网络名称
自定义网络本身就维护好了主机名和 ip 的对应关系(ip 和域名都可以 ping 通)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理