Как я могу назначить отображение порта в существующем контейнере Docker?
Я не уверен, что я неправильно понял что-то здесь, но похоже, что можно установить сопоставления портов, создав новый контейнер из изображения. Есть ли способ назначить сопоставление портов существующему контейнеру Docker?
11 ответов:
меня тоже интересует эта проблема.
как @Thasmo упоминалось, что переадресация портов может быть указана только с помощью .
Другие команды,docker start
нет иdocker port
отображает только текущие переадресации.чтобы добавить переадресацию портов, я всегда выполняю следующие действия,
остановка запуск контейнер
docker stop test01
commit контейнер
docker commit test01 test02
Примечание: выше,
test02
это новый образ, который я строю изtest01
контейнер.re -выполнить из введенного изображения
docker run -p 8080:8080 -td test02
где первый 8080-локальный порт, а второй 8080-контейнерный порт.
вы можете изменить отображение портов, непосредственно редактируя
hostconfig.json
file at/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
вы можете определить [hash_of_the_container] через
docker inspect <container_name>
команда и значение поля " Id " - это хэш.1) stop the container 2) change the file 3) restart your docker engine (to flush/clear config caches) 4) start the container
таким образом, вам не нужно создавать изображение с таким подходом. Вы также можете изменить флаг перезагрузка.
P. S. Вы можете посетить https://docs.docker.com/engine/admin/ научиться правильно перезагрузить двигатель докера согласно вашей главной машине. Я использовал
sudo systemctl restart docker
чтобы перезапустить мой докер двигатель, который работает на Ubuntu 16.04
Если под " существующим "вы подразумеваете" запущенный", то (в настоящее время) невозможно добавить сопоставление портов.
вы можете, однако, динамически добавить новый сетевой интерфейс, например,трубопровод, если вам нужно предоставить службе в контейнер, не прерывая его.
Не уверен, что вы можете применить сопоставление портов для работающего контейнера. Вы можете применить переадресацию портов при запуске контейнера, который отличается от создания нового контейнера.
$ docker run -p <public_port>:<private_port> -d <image>
запустится контейнер. в этом уроке объясняет проброса портов.
в Примере Фудзимото Йоичи
test01
- это контейнер, в то время какtest02
изображение.перед
docker run
вы можете удалить исходный контейнер, а затем снова присвоить контейнеру то же имя:$ docker stop container01 $ docker commit container01 image01 $ docker rm container01 $ docker run -d -P --name container01 image01
(через
-P
чтобы предоставить порты случайным портам, а не вручную назначать).
наоборот, если вам не нравится конфигурация глубины Докера IPtables будет вашим другом.
iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT} -j DNAT --to-destination ${CONTAINERIP}:${YOURPORT} iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source ${CONTAINERIP} --destination ${CONTAINERIP} --dport ${YOURPORT} iptables -A DOCKER -j ACCEPT -p tcp --destination ${CONTAINERIP} --dport ${YOURPORT}
Это просто трюк не рекомендуем, как это работает с моим сценарием, потому что я не мог остановить контейнер, я надеюсь, помогут вам.
редактирование 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
дополнительно убрать по умолчанию.conf в nginx
docker exec nginx rm /etc/nginx/conf.d/default.conf
создать новый nginx конфигурации
server { listen 9000; location / { proxy_pass http://my_existing_container:9000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
скопировать config в контейнер nginx.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
перезапустите nginx
docker restart nginx
преимущества: чтобы опубликовать новые порты, вы можете безопасно остановить/обновить / воссоздать контейнер nginx, как вы хотите, не касаясь бизнес-контейнера. Если вам нужно нулевое время простоя для nginx, можно добавить больше обратных прокси-сервисов, присоединяющихся к той же сети. Кроме того, контейнер может присоединяться к нескольким сетям.
Edit:
для реверса прокси-служб, отличных от http, файл конфигурации немного отличается. Вот простой пример:
upstream my_service { server my_existing_container:9000; } server { listen 9000; proxy_pass my_service; }
в состав ответ на @Fujimoto-Youichi
вы также можете использовать
$ docker run -P CONTAINER
для отображения портов случайным образом при создании контейнера, но будьте осторожны с безопасностью ascpect !
-P
eq to--publish-all
: "он публикует все открытые порты для случайных портов",затем запустите
docker inspect CONTAINER
для отображения портов fin, как показано на рисунке ниже :подробнее о
docker run -P
на docker run
Я не могу поверить, сколько неправильных ответов на одной странице. если вы сделаете "docker run", он создаст новое изображение.
если вы хотите изменить текущее изображение сделать следующее
docker ps -a
возьмите идентификатор контейнера и перейдите в
cd /var/lib/docker/containers/<conainerID><and then some:)>
остановить контейнер
'docker stop <NAME>'
изменить файлы
vi config.v2.json "Config": { .... "ExposedPorts": { "80/tcp": {}, "8888/tcp": {} }, .... }, "NetworkSettings": { .... "Ports": { "80/tcp": [ { "HostIp": "", "HostPort": "80" } ],
и изменить файл
vi hostconfig.json "PortBindings": { "80/tcp": [ { "HostIp": "", "HostPort": "80" } ], "8888/tcp": [ { "HostIp": "", "HostPort": "8888" } ] }
перезапустите докер, и он должен работать
для пользователей Windows и Mac теперь есть еще один довольно простой и удобный способ изменить порт отображения:
скачать kitematic
перейдите на страницу настроек контейнера, на вкладке порты, вы можете непосредственно изменить опубликованный порт там.
запустите контейнер снова
Если вы просто хотите изменить порт запущенного контейнера, вы:
- остановить существующий контейнер
sudo docker stop NAME
- Теперь перезагрузите с новым сопоставлением портов
sudo docker run-d-p 81: 80 NAME
где:
" - d " в фоновом режиме / deamon докер
"-p " включить отображение портов
"81" внешний (открытый) порт, который вы используете для доступа с помощью браузера
"80" внутренний докер контейнер слушать порт