我的 docker 图像可以在没有网络配置的情况下与同一台机器上的数据库 运行 连接吗?
Can my docker image connect with a database running on same machine without network configuration?
我已经创建了我的 Web 应用程序的 docker
图片。我的笔记本电脑上有一个 cassandra
数据库 运行,我正在从同一台笔记本电脑启动我的 Web 应用程序的 container
。连接数据库的 uri
是 localhost: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
此域是在 docker
在 windows
中的 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
我已经创建了我的 Web 应用程序的 docker
图片。我的笔记本电脑上有一个 cassandra
数据库 运行,我正在从同一台笔记本电脑启动我的 Web 应用程序的 container
。连接数据库的 uri
是 localhost: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
此域是在 docker
在 windows
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