docker - 从另一个容器访问一个容器的端口
问题描述
我在一个容器中有一个 postgres 数据库,在另一个容器中有一个 java 应用程序。Postgres 数据库可从 localhost 中的端口 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 ...
考虑command:
在docker-compose.yml
文件中设置 a 以在docker-compose up
. 如果--host
选项是您的代码并且不是来自框架,那么通过环境变量传递这样的设置可能比命令行参数更容易管理。
推荐阅读
- sql - 错误 1054 (42S22):尝试通过 cmd 在 sql 中创建序列时,“字段列表”中的未知列“sq.nextval”
- html - 更改 Web 表单中按钮输入的元素
- c# - 仅设置 TLS 1.3 时无响应
- ios - 与控制中心相同的当前 ViewController 在 iPhone 中工作
- javascript - 编辑条目时电子应用程序不更新条目
- ruby-on-rails - Rails 6 中的 Rails 红色开发错误页面在哪里?
- go - 如何在for-select循环中更改频道
- javascript - Javascript Fetch 没有服务器消息
- angular - 需要帮助才能使用 Orange Money 的 API
- javascript - React native 无需权限即可访问相机或照片库