Docker 容器无法连接到我知道的另一个容器 运行

Docker container cannot connect to another container that I know is running

我有一个 MySQL 容器,我用 docker-compose.yml 文件定义如下:

version: "3.7"
services:
  mydb:
    image: mysql:8
    container_name: my_db_local
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: 12345
      MYSQL_DATABASE: my_db_local
      MYSQL_USER: someuser
      MYSQL_PASSWORD: somepassword
    volumes:
      - ./my-db-data:/var/lib/mysql

如果我 运行 docker-compose up -d 我看到它旋转得很快,我可以从我主机上的 SQL 客户端 运行ning 连接到它机器(我在 0.0.0.0:3306 连接到它)。

我还有一个容器化的 Java Spring 引导应用程序,我使用以下 Dockerfile:

管理
FROM openjdk:8-jdk-alpine as cce


COPY application.yml application.yml
COPY build/libs/myservice.jar myservice.jar

HEALTHCHECK CMD curl --fail https://localhost:9200/healthCheck || exit 1

EXPOSE 443

ENTRYPOINT [ \
    "java", \
    "-Dspring.config=.", \
    "-Ddb.hostAndPort=0.0.0.0:3306", \
    "-Ddb.name=my_db_local", \
    "-Ddb.username=someuser", \
    "-Ddb.password=somepassword", \
    "-jar", \
    "cim-service.jar" \
]

我可以像这样构建这个图像:

docker build . -t myorg/myservice

然后运行像这样:

docker run -d -p9200:9200 myorg/myservice

当我 运行 它时,它在启动时很快就死掉了,因为它无法连接到 MySQL 容器(它用作数据库)。显然 MySQL 容器是 运行ning,因为我可以使用 SQL 客户端从我的主机连接到它。所以很明显,我的 network/port 设置在 Docker Compose 文件中或更可能在我的 Spring 启动应用程序的 Dockerfile 中出错。我只是对 Docker 了解不够,无法弄清楚我可能在哪里配置错误。 有什么想法吗?

数据库主机不是 0.0.0.0,该地址是用于“监听所有接口”的 IPv4,一些 OS 将其解释为连接回本地接口,none 其中将在容器中工作。容器网络是命名空间的,因此容器有自己的网络接口,与主机分开,也与其他容器分开。

要在容器之间进行连接,您需要 运行 同一 docker 网络上的容器,该网络需要由用户创建(不是名为“bridge”的默认桥接网络),您通过容器名称或网络别名连接,您连接到容器端口,而不是主机发布的端口。

看起来像什么:

ENTRYPOINT [ \
    "java", \
    "-Dspring.config=.", \
    "-Ddb.hostAndPort=mydb:3306", \
    "-Ddb.name=my_db_local", \
    "-Ddb.username=someuser", \
    "-Ddb.password=somepassword", \
    "-jar", \
    "cim-service.jar" \
]

和:

docker run -d -p9200:9200 --net $network_name_of_mysql myorg/myservice

mydb 会起作用,因为 compose 会自动为服务名称创建一个别名。为此,无需在 compose 中定义 container_name,并且您通常不希望一个项目允许多个项目单独启动并用于扩展容器。

请注意,在图像本身中包含数据库连接数据等配置是一种不好的做法。您需要将此逻辑移动到安装到容器、环境变量或组合文件中的外部配置文件中。