从另一个容器访问一个容器的访问端口
从另一个容器访问一个容器的访问端口
我有一个postgres数据库在一个容器中,另一个容器中有一个java应用程序。Postgres数据库可以通过本地主机的1310端口访问,但是java容器无法访问它。
我尝试了以下命令:
docker run modelpolisher_java java -jar ModelPolisher-noDB-1.7.jar --host=biggdb --port=5432 --user=postgres --passwd=postgres --dbname=bigg
但是它报错java.net.UnknownHostException: biggdb
。
这是我的docker-compose.yml
文件:
version: '3'
services:
biggdb:
container_name: modelpolisher_biggdb
build: ./docker/bigg_docker
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=bigg
ports:
- "1310:5432"
java:
container_name: modelpolisher_java
build: ./docker/java_docker
stdin_open: true
tty: true
biggdb的Dockerfile:
FROM postgres:11.4 RUN apt update &&\ apt install wget -y &&\ # Create directory '/bigg_database_dump/' and download bigg_database dump as 'database.dump' wget -P /bigg_database_dump/ https://modelpolisher.s3.ap-south-1.amazonaws.com/bigg_database.dump &&\ rm -rf /var/lib/apt/lists/* COPY ./scripts/restore_biggdb.sh /docker-entrypoint-initdb.d/restore_biggdb.sh EXPOSE 1310:5432
请问有人可以告诉我在docker-compose.yml文件中需要做哪些更改,或者在命令中需要做哪些更改,以使java容器能够访问biggdb(postgres)容器的端口吗?
问题的原因是,两个容器需要在相同的Docker内部网络上才能相互通信。Docker Compose会自动为您创建一个网络,并将容器连接到该网络。如果您使用docker run
命令在旁边运行一个容器,则需要找到该网络的名称。
解决方法是,首先运行docker network ls
命令,以列出您拥有的Docker内部网络。其中一个网络的名称将类似于bigg_default
,其中第一部分(可能)是您当前的目录名称。然后,当您实际运行容器时,可以使用docker run --net bigg_default ...
命令连接到该网络。
考虑在docker-compose.yml
文件中设置一个command:
,以在docker-compose up
时传递这些参数。如果--host
选项是您的代码而不是来自框架,则通过环境变量传递设置可能比命令行参数更容易管理。
问题的原因是使用了错误的命令和容器名称。解决方法是使用正确的命令和服务名称。
在使用docker-compose
启动两个容器时,它们已经共享一个公共网络。为了能够访问该网络,应该使用docker-compose run
命令,而不是docker run
命令。此外,在docker-compose run
命令中传递服务名称java
,而不是容器名称modelpolisher_java
。
所以,只需使用以下命令运行您的jar包:
docker-compose run java java -jar ModelPolisher-noDB-1.7.jar --host=biggdb --port=5432 --user=postgres --passwd=postgres --dbname=bigg