Я думаю, что ответ на ваш первый вопрос положительный. Я отвечу на второй вопрос после того, как отвечу на первый. Я предполагаю, что когда вы спрашиваете о переадресации портов, вы имеете в виду публикацию портов Docker, чтобы внутренний порт был перенаправлен на порт, доступный с хоста? Если так, то этот ответ должен дать вам то, что вы ищете. Я продемонстрирую, как это работает, используя образ Apache Tomcat. Я начну с Docker run, но также покажу эквивалент docker-compose.
Из терминала запустите Tomcat, используя динамически публикуемый порт:
foo@bar:~$ docker run -dit -p 8080 --name tc01 tomcat:8-slim
Обратите внимание, что для параметра -p указан только внутренний порт Tomcat.
Список портов, динамически выделяемых для этого контейнера:
foo@bar:~$ docker port tc01
8080/tcp -> 0.0.0.0:32773
В этом случае порт 32773 является динамически публикуемым портом, поэтому с моего хоста я могу перейти к http://localhost:32773, чтобы показать домашнюю страницу Apache Tomcat.
Если я создаю другой контейнер с именем tc02, на котором выполняется Tomcat, в то время как первый контейнер (с именем tc01) работает:
foo@bar:~$ docker run -dit -p 8080 --name tc02 tomcat:8-slim
другой порт будет выделен динамически:
foo@bar:~$ docker port tc02
8080/tcp -> 0.0.0.0:32774
В этом случае посещение http://localhost:32774 отобразит домашнюю страницу Apache Tomcat.
Чтобы сделать подобное в docker-compose, вот простой docker-compose.yml, который будет динамически выделять порт для контейнера tc03:
version: '3.7'
services:
tomcat:
image: tomcat:8-slim
ports:
- "8080"
container_name: tc03
Создать контейнер с помощью docker-compose:
foo@bar:~$ docker-compose up -d
другой порт будет выделен динамически:
foo@bar:~$ docker port tc03
8080/tcp -> 0.0.0.0:32775
В этом случае посещение http://localhost:32775 отобразит домашнюю страницу Apache Tomcat.
Чтобы ответить на ваш второй вопрос, я думаю, вы можете использовать порт Docker, как я показал Итак, если вы называете свой контейнер в docker-compose, вы можете вернуть значение порта, как я показал в примерах.
Если вы создавали эти контейнеры, как я обрисовал в общих чертах, вы можете удалить их следующим образом:
foo@bar:~$ docker rm -f tc01 tc02 tc03