服务公告

服务公告 > Linux命令 > docker网络配置-IP主机名hosts配置

docker网络配置-IP主机名hosts配置

发布时间:2026-01-08 00:02

蓝易云:docker-compose 网络配置(IP / 主机名 / hosts)一文打通🙂

在 Compose 里,把网络一次性配置好,核心就三件事:
1)用 自定义网络 做隔离与可控;2)用 服务名DNS 做稳定寻址;3)确实需要固定时再上 静态IP 与 extra_hosts(别一上来就“手搓IP”,后期维护会很痛)。


1)你需要先搞清楚:Compose 的“默认寻址”不是靠 /etc/hosts

  • 同一网络内,容器之间默认用 服务名 互相访问(例如 http://db:3306)。这是 Docker 内置 DNS 在发挥作用,比手写 hosts 更稳、更可扩展。
  • <span style="color:red;">/etc/hosts</span> 适合“固定映射”,但它是静态文本:IP 一变就失效,适合少量、明确、不变的映射场景(例如指向宿主机、第三方固定地址)。

2)实战模板:自定义网络 + 静态IP + hostname + hosts 映射 ✅

services:
  api:
    image: nginx:alpine
    hostname: api-01
    networks:
      app_net:
        ipv4_address: 172.30.0.10
        aliases:
          - backend
    extra_hosts:
      - "host.docker.internal:host-gateway"
      - "legacy-db:10.10.10.20"

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: "ChangeMe_123"
    hostname: db-01
    networks:
      app_net:
        ipv4_address: 172.30.0.11

networks:
  app_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/24
          gateway: 172.30.0.1

逐段解释(每一行都讲清楚)

  • services::定义你要交付的业务组件(容器)。
  • api / db::服务名;在同一网络里,它也是默认的 DNS 名称(比如 db)。
  • image::镜像来源;这里分别示例 Web 与数据库。
  • hostname::容器内部看到的主机名(影响 hostname 命令与提示符等),更偏“内部标识”。
  • networks: app_net::把服务加入名为 app_net 的用户自定义网络。
  • ipv4_address::在该网络里给容器分配 静态IP(前提:网络配置了 ipam.subnet)。
  • aliases::为同一服务增加“别名DNS”,同网段内可用 backend 解析到 api
  • extra_hosts::向容器内 /etc/hosts 写入静态映射:
    • "host.docker.internal:host-gateway":把一个固定名字指向“宿主机网关”,容器访问宿主机服务更顺手。
    • "legacy-db:10.10.10.20":把遗留数据库固定到某个 IP(适合对方 IP 不变的情况)。
  • networks:(顶层):定义网络本身。
  • driver: bridge:最常用的单机桥接网络模式。
  • ipam::IP 地址管理;只有定义了 subnet,静态IP才有可控范围。
  • gateway::该网络的网关地址(通常不需要业务侧关心,但建议明确,便于排障)。

3)什么时候该用静态IP?什么时候坚决别用?😄

  • 适合:对接“只能认 IP 的老系统”、某些安全设备白名单、必须固定点对点联调。
  • 不适合:需要水平扩容(api 起多个副本)、频繁变更环境、追求低维护成本。
    更推荐的常态做法是:用 服务名(db、redis、mq)做寻址,这才是 Compose 的“正道”。

4)速查对比表(看完就不会混用)📌

能力点 hostname container_name aliases extra_hosts
作用范围 容器内部标识 Docker 对外容器名 同网络 DNS 别名 写入 /etc/hosts
是否适合扩容 适合 不适合(会冲突) 适合 一般不适合
是否自动跟随IP变化 是(不依赖IP) 不涉及 是(DNS解析) 否(静态文本)
典型用途 提示符、日志识别 仅少数固定场景 多域名/多入口 指向宿主机/遗留固定IP

直白结论:别把 extra_hosts 当“服务发现系统”;它更像“手工刻在石头上的记录”。


5)验证与排错命令(带解释)🔎

docker compose up -d
  • 启动并后台运行整套服务;网络会按 networks: 配置自动创建并挂载到容器。
docker network inspect <项目名>_app_net
  • 查看网络详情:subnet、gateway、已加入的容器与它们的 IP;排查“IP是否按预期分配”最有效。
docker compose exec api cat /etc/hosts
  • 进入 api 容器读取 hosts 文件,确认 extra_hosts 是否写入成功(这是“落地验收点”)。
docker compose exec api getent hosts db
  • 用系统解析库验证 db 是否能解析到容器 IP;比 ping 更贴近真实“解析链路”。
docker compose exec api ping -c 2 backend
  • 验证 aliases 是否生效;backend 应解析到 api(同一个服务的别名)。

6)工作流程图(Mermaid,vditor 可用)✅

 
 
 
 
 
 
 
定义 services
定义 networks + ipam
服务加入 app_net
是否必须固定IP?
使用服务名DNS互访
配置 ipv4_address
运行并验证解析 getent
是否需要静态hosts?
交付上线
extra_hosts 写入 /etc/hosts

最后给你一个“务实建议”

如果你是做生产交付:优先把寻址标准化为 服务名 + 网络隔离;只有在“外部系统/合规白名单/设备限制”逼你用固定地址时,再上 静态IP 与 extra_hosts。这样网络方案既专业,也不容易把自己未来逼进维护死胡同。

已经是第一篇啦!

下一篇: 服务器路由命令有哪些常用技巧?