Docker 里很容易遇到一种情况:

两个容器都正常运行,但是一个容器就是访问不到另一个容器。

例如:

Java
  ↓
MySQL

Java 容器本身能够正常启动,但是连接 MySQL 时一直失败。

最容易犯的错误,是在 Java 配置里写:

localhost:3306

因为在 Docker 容器内部,localhost 指向的是当前容器自己

也就是说:

Java 容器
localhost
   ↓
Java 容器自己

而不是:

Java 容器
   ↓
MySQL 容器

如果两个容器加入了同一个 Docker Network,那么通常应该直接使用 MySQL 容器的服务名访问:

mysql:3306

于是网络关系变成:

Java 容器
   ↓
mysql
   ↓
MySQL 容器

所以 Docker 环境里看到 localhost 的时候,最好先确认一下:

这个 localhost 到底是谁的 localhost?