You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docker Compose Profiles时的容器网络连通性问题排查

Docker Compose网络连通性问题排查

问题描述

Docker Compose配置

services:
  service:
    build:
      context: ../service
      dockerfile: ../service/Dockerfile
    depends_on:
      - database
    ports:
      - "8080:8080"
    networks:
      - mynetwork

  database:
    image: mcr.microsoft.com/mssql/server:2022-latest
    ports:
      - "14333:1433"
    networks:
      - mynetwork
    command: /bin/bash -c "/opt/mssql/bin/sqlservr"

  init-db:
    profiles: [initdb]
    image: mcr.microsoft.com/mssql-tools:latest
    build:
      context: ../database
      dockerfile: ./initdb.Dockerfile
    depends_on:
      - database
    networks:
      - mynetwork

networks:
  mynetwork:

服务说明

  • database:SQL数据库服务
  • service:调用database的Golang REST API服务(已成功连通)
  • init-db:用于偶尔初始化数据库的一次性脚本服务,包含Shell脚本

操作流程

  1. 执行以下命令启动service和database服务,二者连通正常:
    docker compose up
    
  2. 随后执行以下命令启动init-db服务:
    docker compose --profile initdb up --build
    

问题现象

init-db的Shell脚本中以database为主机名ping数据库容器时提示“host not found”;执行docker network inspect local-infra_mynetwork查看网络,发现init-db未加入该网络,仅service和database容器在网络中。

疑问

  1. 该连通性问题是否源于使用Profiles并分步骤执行启动操作?
  2. 是否因为init-db不是持续运行的服务(与service、database不同)导致?
  3. 是否与我的Docker网络配置有关?

问题解答

  1. 是,分步骤使用不同Profile启动是核心原因
    第一次执行docker compose up(无Profile)时,Compose会创建mynetwork并将service、database加入该网络。第二次执行docker compose --profile initdb up时,Compose仅处理initdb Profile下的服务(即init-db),默认不会将其关联到之前由其他服务集创建的mynetwork,导致init-db无法加入到database所在的网络,进而无法解析database主机名。

  2. 不是,临时服务不会导致网络加入失败
    一次性的初始化脚本服务是Docker Compose中常见的场景,只要启动方式正确,临时服务完全可以正常加入指定网络并访问其他服务。问题的核心是启动时的Profile使用方式,而非服务是否持续运行。

  3. 网络配置本身无问题
    你的mynetwork是标准的Docker bridge网络,三个服务都明确配置了加入该网络,配置逻辑是正确的。问题出在启动命令的Profile组合方式,而非网络定义。


解决方法

推荐使用以下两种方式之一:

  • 方式1:启动init-db时同时启用默认Profile
    这样Compose会识别到已运行的service和database,并将init-db加入已存在的mynetwork:
    docker compose --profile initdb --profile default up --build
    
  • 方式2:使用docker compose run命令启动init-db
    run命令会自动将容器加入到Compose定义的网络中,无需额外配置,同时--rm参数会在脚本执行完成后自动删除容器:
    docker compose --profile initdb run --rm init-db
    

内容的提问来源于stack exchange,提问作者slatermorgan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:23:27