【Docker】网络

Docker 网络是 Docker 容器之间、容器与宿主机之间以及容器与外部网络(如互联网)进行通信的虚拟化网络架构。它通过软件定义的方式,为容器提供隔离、安全且灵活的网络连接,解决了容器化环境中 "如何让不同容器 / 服务互联互通" 的核心问题。

总结

  1. 默认网络bridge(默认)、hostnone 、自定义满足基础场景。
  2. 自定义网络 :推荐用于生产环境,支持容器名解析和隔离
  3. 端口映射 :通过 -p-P 让外部访问容器,host 模式无需映射但需注意端口冲突

Docker 网络的核心作用

  1. 容器间通信:让同一主机或不同主机上的容器能够相互访问(如前端容器调用后端 API 容器)。
  2. 容器与宿主机通信:容器可以访问宿主机的服务(如宿主机的数据库),反之亦然。
  3. 容器与外部网络通信:容器可以访问互联网(如下载依赖),或对外提供服务(如 Web 容器暴露 80 端口)。
  4. 网络隔离:通过不同的网络环境,隔离不同业务的容器(如开发环境和生产环境容器不互通)。

命令

bash 复制代码
# 列出所有网络
docker network ls

# 创建自定义网络
docker network create [options] <network-name>

# 检查网络详情
docker network inspect <network-name>

# 将容器连接到网络
docker network connect <network-name> <container-name>

# 断开容器与网络的连接
docker network disconnect <network-name> <container-name>

# 删除网络
docker network rm <network-name>

# 删除所有未使用的网络
docker network prune

1 默认 bridge 网络

默认的bridge网络是Docker安装后自动创建的桥接网络 (名称为 bridge),是**容器启动时未指定网络模式(没有--network)**的默认选择,也是最常用的 Docker 网络模式之一。它通过软件虚拟的 "桥接设备"(类似物理交换机)实现同一宿主机内容器之间、容器与宿主机之间的网络通信。

默认的缺点

无法通过容器名称访问容器**(没有DHCP服务)**

例如下面第一条可以访问,第二条无法访问

bash 复制代码
# 进入容器1,尝试通过 IP 访问容器2
docker exec -it container1  curl http://172.17.0.3

# 通过容器名访问容器2
docker exec -it container1  curl http://container2 

例子

宿主机通过 docker run -p 宿主机端口:容器端口 映射端口,让外部访问容器( -p 8080:80 使宿主机 8080 端口映射容器 80 端口)。

bash 复制代码
# 启动一个 Nginx 容器,使用默认 bridge 网络,映射 8080 端口
docker run -d -p 8080:80 --name web-nginx nginx

2 自定义网络:更灵活的隔离与通信

  1. 首先用docker network create创建一个网络
  2. 之后启动run容器加入这个--network网络

例子

复制代码
# 创建一个自定义桥接网络(支持容器名解析)
docker network create my-network

# 启动两个容器加入该网络
docker run -d --name app1 --network my-network nginx
docker run -d --name app2 --network my-network nginx

# 在 app1 中可直接通过容器名访问 app2(无需记 IP)
docker exec -it app1 curl app2:80  # 成功访问 app2 的 80 端口

优势

  • 自动 DNS 解析:容器可通过名称(如 app2)而非 IP 通信。
  • 更好的隔离性:不同自定义网络的容器默认不互通,仅同一网络内可通信。

3 Host网络

移除了容器和主机之间的网络隔离,直接使用主机的网络(--netowrk host),不创建独立网络命名空间

特点

  • 容器没有独立IP,与宿主机共享IP
  • 性能最优 (无网络转发开销),牺牲了隔离性

例子

bash 复制代码
# 启动一个Nginx容器,使用host网络 (⚠️ 为了避免端口冲突, 容器1 启动alpine/curl即可)
#客户端(不监听端口,使用alpine构建,名叫host1,使用host网络,不缓存)
docker run -itd \
    --name host1 \
    --network host \
    alpine \
    sh -c "apk add --no-cache curl && sh"

#服务端(使用nginx构建容器名叫host2,使用host网络-默认监听80)
docker run -d \
    --name host2 \
    --network host \
    nginx

# 查询宿主机端口 eth0 是 HOST_IP
ifconfig 

# 登入容器1,通过宿主机ip访问容器2
docker exec -it host1 curl http://${HOST_IP}$:80


# 特别注意:因为容器使用主机的网络端口,而主机的端口一旦使用,就不能再被其他容器使用。否则会提示端口冲突。
docker run -d \
    --name host-3 \
    --network host \
    nginx
    
docker logs host-3

4 none 模式

容器禁用所有网络-network none ,只有 lo(本地回环)接口,无法与外部通信

  • 特点:完全隔离网络,适合不需要网络的容器(如离线数据处理)。

  • 适用场景:纯本地计算任务(如生成日志文件、处理本地数据)。

    复制代码
    # 启动一个无网络的容器
    docker run -d --network none --name offline-container alpine sleep 3600
相关推荐
刘晓倩2 小时前
Docker Desktop(Windows/Mac)零外网部署 Dify 极简指南
macos·docker·容器
Lucis__4 小时前
从基本用法到迭代器实现—list重难点突破
c++·容器·list
java_logo4 小时前
TOMCAT Docker 容器化部署指南
java·linux·运维·docker·容器·tomcat
百***07185 小时前
Node.js 与 Docker 深度整合:轻松部署与管理 Node.js 应用
docker·容器·node.js
Lxinccode5 小时前
docker(25) : 银河麒麟 V10离线安装docker
java·docker·eureka·银河麒麟安装docker·银河麒麟安装compose
hoiii1875 小时前
挂载配置文件以Docker启动Redis服务
redis·docker·eureka
令狐少侠20115 小时前
docker启动失败
运维·docker·容器
nvvas5 小时前
PHP安装ZSTD压缩库扩展
php
N 年 后6 小时前
单独Docker部署和Docker Compose部署
java·docker·容器