В один из моментов появилась необходимость добавить новые маппинги портов в уже запущенный 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