Docker Compose容器间通信疑问:未配置网络为何adminer可访问db?
为什么未配置自定义网络时Adminer仍能连接MySQL容器?
核心原因:Docker Compose的默认网络机制
Docker Compose会自动为你的项目创建一个默认桥接网络(命名规则为<项目目录名>_default),所有在services块里定义的容器都会自动加入这个网络。在这个网络内:
- 容器之间可以通过**服务名称(比如
db)**直接解析通信,无需手动配置IP - Adminer能连接到MySQL,正是因为它配置的MySQL主机名是
db(Adminer默认支持通过服务名访问同网络的数据库服务),而不是127.0.0.1
为什么你的Ubuntu容器用127.0.0.1访问不到?
每个Docker容器都有独立的网络命名空间,容器内的127.0.0.1只指向容器自身,和其他容器完全隔离。你要访问MySQL,得用服务名db作为目标地址,比如执行:
docker-compose run ubuntu nmap db
这样就能扫到MySQL的3306端口了。
额外验证小技巧
- 执行
docker network ls,能看到自动生成的默认网络条目 - 进入Adminer容器执行
ping db,会发现能直接解析到db容器的IP地址 - 如果非要用
127.0.0.1访问其他容器,需要给Ubuntu服务配置network_mode: service:db,让它和db共享网络栈,但这种方式破坏了容器隔离性,不推荐日常使用。
内容的提问来源于stack exchange,提问作者nowox
相关产品推荐
相关产品推荐

