Я создал контейнер (docker create
) из изображения, которое использовало EXPOSE 22
в Dockerfile
Я начинаю через docker start <container name or ID>
и получить к нему доступ через ssh
.
Теперь мне нужно открыть еще один порт службы, работающей в этом контейнере. Я не могу воссоздать его, ему необходимо изменить параметры запуска, чтобы открыть этот дополнительный порт. Это возможно?
Я надеялся что docker start
позволит использовать те же параметры, что и docker create
или docker run
Но это не так.
Примечание: я знаю, что философия Docker заключается в том, чтобы создавать эфемерные контейнеры. Это факт жизни, что мне приходится иметь дело с этим сильно настроенным контейнером (а не воссоздавать его).
Вы подразумеваете, что не использовали docker-compose
для начала, но нормальный docker run
. Я бы посмотрел в docker-compose
, потому что тогда вы могли бы остановить его и запустить снова с новым файлом конфигурации. Это позволяет воспроизводимое создание контейнера. Все примеры простого использования docker run
вы видите везде, не помогает.
В вашем конкретном случае, я думаю, все, что вам нужно сделать, добавить iptables
правило. По умолчанию, dockerd
манипулирует iptables
правила перенаправления трафика (это может быть даже единственное EXPOSE
делает). Если вы это сделаете iptables -t nat -L -n
вы, вероятно, можете увидеть, как были открыты ваши порты. Вы можете создать подобное правило.
Это означает, что при перезапуске сервера правило снова исчезает. Вам нужно будет сохранить iptables
штат. И это тоже касается неудобства dockerd
манипулирование iptables
. Трудно управлять рядом с другими службами, связанными с iptables (например, системами централизованной настройки, fail2ban
, или даже простое автосохранение ваших правил).
вы можете открыть порт в команде создания. например, чтобы открыть порт 80, нужно запустить.
docker create -p 80:80 container/name
больше информации можно найти на https://docs.docker.com/engine/reference/commandline/create/