Я не уверен, что я что-то здесь неправильно понял, но кажется, что установить сопоставления портов можно только путем создания нового контейнера из образа. Есть ли способ назначить сопоставление портов для существующего контейнера Docker?
docker
port
lxc
linux-containers
thasmo
источник
источник
Ответы:
Вы можете изменить отображение портов, отредактировав
hostconfig.json
файл по адресу/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
Вы можете определить [hash_of_the_container] с помощью
docker inspect <container_name>
команды, а значение поля «Id» - это хеш.Таким образом, вам не нужно создавать изображение с этим подходом. Вы также можете изменить флаг перезагрузки здесь.
PS Вы можете посетить https://docs.docker.com/engine/admin/, чтобы узнать, как правильно перезапустить механизм докера в соответствии с вашим хост-компьютером. Я использовал,
sudo systemctl restart docker
чтобы перезапустить мой механизм докера, который работает на Ubuntu 16.04источник
hostconfig.json
иconfig.v2.json
заставить это работать. Используйте ссылку, предоставленную @rohitmohta, чтобы увидеть детали.screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
После того, как вы запустите tty, вы можете перейти к / var / lib / dockerЯ также заинтересован в этой проблеме.
Как упоминалось в @Thasmo , переадресацию портов можно задавать ТОЛЬКО с помощью команды
docker run
(иdocker create
).Другие команды,
docker start
не имеют-p
опции иdocker port
отображают только текущие пересылки.Чтобы добавить переадресацию портов, я всегда следую за этими шагами,
остановить запуск контейнера
совершить контейнер
ПРИМЕЧАНИЕ: выше,
test02
это новое изображение, которое я создаю изtest01
контейнера.повторно запустить из порученного изображения
Где первый 8080 является локальным портом, а второй 8080 является портом контейнера.
источник
docker start
?Если под «существующим» вы подразумеваете «работающий», то (в настоящее время) невозможно добавить сопоставление портов.
Однако вы можете динамически добавить новый сетевой интерфейс, например, с помощью Pipework , если вам нужно представить сервис в работающем контейнере без его остановки / перезапуска.
источник
Не уверен, что вы можете применить сопоставление портов для работающего контейнера. Вы можете применить переадресацию портов при запуске контейнера, который отличается от создания нового контейнера.
начнется запуск контейнера. Этот урок объясняет перенаправление портов.
источник
docker run
создает и запускает новый контейнер. Это эквивалентно выполнению,docker create
за которым следуетdocker start
.Редактирование hostconfig.json сейчас не работает. Это заканчивается только тем, что этот порт открыт, но не опубликован для хоста. Создание и воссоздание контейнеров - не лучший подход для меня. Никто не упомянул
docker network
?Лучшим решением было бы использование обратного прокси в той же сети
Создайте новую сеть, если ваш предыдущий контейнер не указан ни в одной из них.
docker network create my_network
Присоедините существующий контейнер к созданной сети
docker network connect my_network my_existing_container
Запустите службу обратного прокси (например, nginx), публикуя нужные порты и подключаясь к той же сети.
docker run -d --name nginx --network my_network -p 9000:9000 nginx
При желании удалите default.conf в nginx
docker exec nginx rm /etc/nginx/conf.d/default.conf
Создайте новый конфиг nginx
Скопируйте конфигурацию в контейнер nginx.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
Перезапустите nginx
docker restart nginx
Преимущества : чтобы опубликовать новые порты, вы можете безопасно остановить / обновить / воссоздать контейнер nginx по своему усмотрению, не касаясь бизнес-контейнера. Если вам нужно нулевое время простоя для nginx, можно добавить больше обращенных прокси-сервисов, присоединяющихся к той же сети. Кроме того, контейнер может присоединиться к нескольким сетям.
Редактировать:
Для обратного прокси не-http сервисы, файл конфигурации немного отличается. Вот простой пример:
источник
В примере Fujimoto Youichi
test01
это контейнер, аtest02
изображение.Перед этим
docker run
вы можете удалить исходный контейнер, а затем снова присвоить ему то же имя:(Использование
-P
для выставления портов для случайных портов, а не для назначения вручную).источник
Если вы запустите
docker run <NAME>
его, появится новый образ, который, скорее всего, не тот, который вы хотите.Если вы хотите изменить текущее изображение, сделайте следующее:
docker ps -a
Возьмите идентификатор вашего целевого контейнера и перейдите к:
Остановить контейнер:
Изменить файлы
И изменить файл
Перезагрузите докер, и он должен работать.
источник
И наоборот, если вас не устраивает конфигурация глубины Docker, IPtables будет вашим другом.
Это просто трюк, а не рекомендуемый способ, который работает с моим сценарием, потому что я не смог остановить контейнер, надеюсь, он вам тоже поможет.
источник
DOCKER_PORT
вMACHINE_PORT
, какие части должны быть изменены?мы используем удобные инструменты, такие как ssh, чтобы легко это сделать.
Я использовал образ хоста Ubuntu и основанный на Ubuntu образ докера.
когда новый порт необходимо отобразить,
внутри докера выполните следующую команду
172.17.0.1 был ip интерфейса докера (вы можете получить это, запустив
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
на хосте).здесь у меня был локальный порт 8888, сопоставленный с хостами 8888. Вы можете изменить порт при необходимости.
если вам нужен еще один порт, вы можете убить ssh и добавить в него еще одну строку -R с новым портом.
Я проверил это с Netcat.
источник
/var/lib/docker/containers/${container_id}
каталог и редактироватьhostconfig.json
PortBindings.HostPort
что вы хотите изменить.источник
Для пользователей Windows и Mac есть еще один довольно простой и удобный способ изменить порт отображения:
источник
Краткий ответ: Вы не можете назначить сопоставление портов существующему контейнеру Docker.
Вам нужен новый контейнер ... разберитесь с ним.
источник
Если вы просто хотите изменить порт работающего контейнера, вы делаете:
в то время как:
источник
docker run
команде,NAME
это имя изображения , чтобы запустить контейнер из, тогда как в относится к имени контейнера до остановки.docker stop
NAME