我的 docker 图像可以在没有网络配置的情况下与同一台机器上的数据库 运行 连接吗?

Can my docker image connect with a database running on same machine without network configuration?

我已经创建了我的 Web 应用程序的 docker 图片。我的笔记本电脑上有一个 cassandra 数据库 运行,我正在从同一台笔记本电脑启动我的 Web 应用程序的 container。连接数据库的 urilocalhost:9042。但是,图像无法连接到数据库。我需要为容器做一些网络配置才能连接到数据库吗?

[trace] CassandraRepositoryComponents - database will connect using parameters uri: cassandra://localhost:9042/, cluster name: myCluster
[trace] s.d.c.CassandraConnectionUri - created logger Logger[services.db.cassandra.CassandraConnectionUri]
[trace] s.d.c.CassandraConnectionManagementService - creating session with uri CassandraConnectionUri(cassandra://localhost:9042/) and cluster name myCluster
[trace] s.d.c.CassandraConnectionManagementService - exception in connecting with database com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/127.0.0.1:9042 (com.datastax.driver.core.exceptions.TransportException: [localhost/127.0.0.1:9042] Cannot connect))
Oops, cannot start the server.

docker 文件

FROM openjdk:8
RUN mkdir deploy
WORKDIR deploy
COPY target/universal/myapp-1.0.zip .

COPY conf/logback_dev.xml ./logback.xml
COPY conf/application_dev.conf ./application.conf
RUN unzip myapp-1.0.zip
RUN chmod +x myapp-1.0/bin/myapp
EXPOSE 9000
ENTRYPOINT myapp-1.0/bin/myapp -Dplay.http.secret.key=changemeplease -Dlogger.file=/deploy/logback.xml -Dconfig.file=/deploy/application.conf

Cassandra 运行 作为一个独立的应用程序

运行 您的 docker 容器具有 host 网络模式,使该容器能够使用主机网络。

docker run --network="host" -p 9000:9000 IMAGENAME

然后在 http://localhost:9000 上访问您的应用程序,应该不会看到任何错误。

1 条关于 Dockerfile 的建议,如果您指定 WORKDIR,则不必 mkdir,因为它会为您创建。

FROM openjdk:8
WORKDIR deploy
COPY target/universal/myapp-1.0.zip .

COPY conf/logback_dev.xml ./logback.xml
COPY conf/application_dev.conf ./application.conf
RUN unzip myapp-1.0.zip
RUN chmod +x myapp-1.0/bin/myapp
EXPOSE 9000
ENTRYPOINT myapp-1.0/bin/myapp -Dplay.http.secret.key=changemeplease -Dlogger.file=/deploy/logback.xml -Dconfig.file=/deploy/application.conf

参考From inside of a Docker container, how do I connect to the localhost of the machine?,我将连接到Cassandra的uri字符串更改为cassandra://host.docker.internal:9042/。申请现已上线!!!

此外,host.docker.internal似乎映射到主网络接口的IP地址。当我尝试 运行 cqlsh(在 运行ning cassandra 的另一个实验中以及通过 docker - Unable to start Cassandra docker image on Win10 Home)时,我注意到了这一点。

C:\Users\manuc>cqlsh host.docker.internal 9042
Connection error: ('Unable to connect to any servers', {'192.168.1.12': error(10061, "Tried connecting to [('192.168.1.12', 9042)]. Last error: No connection could be made because the target machine actively refused it")})

此外, 平 host.docker.internal

Pinging host.docker.internal [192.168.1.12] with 32 bytes of data:
Reply from 192.168.1.12: bytes=32 time<1ms TTL=128
Reply from 192.168.1.12: bytes=32 time<1ms TTL=128
Reply from 192.168.1.12: bytes=32 time<1ms TTL=128
Reply from 192.168.1.12: bytes=32 time<1ms TTL=128

此域是在 dockerwindows

中的 etc/hosts 安装时配置的
# Added by Docker Desktop
192.168.1.12 host.docker.internal
192.168.1.12 gateway.docker.internal
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
# End of section

您无法使用 127.0.0.1 访问在主机上打开的端口。您需要找到分配给 VM 网络接口的 IP(在 Mac 和 Linux 中,您可以使用 ifconfig 命令)。从您的 docker 容器使用相同的 IP 访问 Cassandra。

此外,检查 Cassandra 是否接受来自任何 ip 的连接。将此设置为 0.0.0.0 将监听所有网络接口。在 cassandra.yaml 配置文件中进行以下更改:

rpc_address: 0.0.0.0