Порт доступа одного контейнера из другого контейнера
У меня есть база данных postgres в одном контейнере и приложение Java в другом контейнере. База данных Postgres доступна через порт 1310 в localhost, но 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
Dockerfile для biggdb:
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)?
2 ответа
Два контейнера должны находиться в одной внутренней Docker-сети, чтобы иметь возможность общаться друг с другом. Docker Compose автоматически создает сеть для вас и присоединяет контейнеры к этой сети. Если вы docker run
контейнер вместе с этим, вам нужно найти имя этой сети.
Бегать
docker network ls
Это перечислит внутренние сети Docker, которые у вас есть. Один из них будет назван как-то bigg_default
где первая часть (вероятно) ваше текущее имя каталога. Затем, когда вы действительно запустите контейнер, вы можете подключиться к этой сети с помощью
docker run --net bigg_default ...
Рассмотрите возможность установки command:
в вашей docker-compose.yml
файл для передачи этих аргументов, когда вы docker-compose up
, Если --host
option - это ваш код, и он не исходит из фреймворка. Передача таких настроек через переменные среды может быть немного проще в управлении, чем аргументы командной строки.
Как вы используете docker-compose
чтобы вызвать два контейнера, они уже используют общую сеть. Чтобы иметь доступ к тому, что вы должны использовать docker-compose run
и нет docker run
, Также передайте название сервиса (java
), а не имя контейнера (modelpolisher_java
) в docker-compose run
команда.
Так что просто используйте следующую команду для запуска вашего jar:
docker-compose run java java -jar ModelPolisher-noDB-1.7.jar --host=biggdb --port=5432 --user=postgres --passwd=postgres --dbname=bigg