Как добавить маппинги портов в уже запущенный docker-контейнер

Как добавить маппинги портов в уже запущенный docker-контейнер

В один из моментов появилась необходимость добавить новые маппинги портов в уже запущенный docker-контейнер. Проблема заключается в том, что такие маппинги можно прописать только в команде docker run.

Одно из решений — использовать docker commit.

При использовании этой команды docker создаст новый образ из уже существующего. В дальнейшем можно запустить «новый» старый контейнер, добавив новые маппинги.

Пример будем приводить с использованием контейнера с запущенным Sonatype Nexus.

Сперва смотрим имя нашего запущенного контейнера

reflexive@nexus:~$ sudo docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                                       NAMES
11e9047fb451   sonatype/nexus3   "/opt/sonatype/nexus…"   14 months ago   Up 2 minutes   0.0.0.0:8081->8081/tcp, :::8081->8081/tcp   nexus

В последнем столбце указано имя контейнера, которое нам нужно (на самом деле вместо имени мы можем использовать идетификатор контейнера из первого столбца, но с именем выходит нагляднее).
Далее останавливаем этот контейнер
reflexive@nexus:~$ sudo docker stop nexus
nexus

Создаем образ из нашего контейнера

reflexive@nexus:~$ sudo docker commit nexus nexus3
sha256:af7e1ec9407a158bdb3e1b6fe5bbe9df2151d5241292ee1c13baa5bf1923181c

Формат команды подразумевает задание имени существующего контейнера (nexus) и имя новосоздаваемого образа (nexus3), которое будет в дальнейшем использоваться при запуске.

После этого мы можем запустить новый контейнер с новыми маппингами портов и использовать образ, созданный на основе нашего прежнего контейнера.

sudo docker run -d -p 8081:8081 -p 8082:8082 -p8083:8083 --name mynexus --restart always -v /opt/nexus-data:/nexus-data nexus3
2862be2c2c0f7841492c4eebaab4ec3f217d441c0d2ecc5967bef549ac51b509

Обращаю внимание, что имя для нового контейнера должно отличаться от предыдущего. Либо нужно удалить старый контейнер командой docker rm <container_name>.

Убеждаемся, что наш контейнер запустился и маппинги успешно применились

reflexive@nexus:~$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                                                           NAMES
2862be2c2c0f   nexus3    "/opt/sonatype/nexus…"   12 seconds ago   Up 6 seconds   0.0.0.0:8081-8083->8081-8083/tcp, :::8081-8083->8081-8083/tcp   mynexus
Back To Top