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
,并且您通常不希望一个项目允许多个项目单独启动并用于扩展容器。
请注意,在图像本身中包含数据库连接数据等配置是一种不好的做法。您需要将此逻辑移动到安装到容器、环境变量或组合文件中的外部配置文件中。
我有一个 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
,并且您通常不希望一个项目允许多个项目单独启动并用于扩展容器。
请注意,在图像本身中包含数据库连接数据等配置是一种不好的做法。您需要将此逻辑移动到安装到容器、环境变量或组合文件中的外部配置文件中。