Как назначить сопоставление портов существующему контейнеру Docker?
Я не уверен, что я неправильно понял что-то здесь, но похоже, что можно установить сопоставления портов, создав новый контейнер из изображения. Есть ли способ назначить сопоставление портов существующему контейнеру Docker?
11 ответов
меня также интересует эта проблема.
As @Thasmo упомянуто, переадресация портов может быть указана только с помощью .
Другие команды, docker start
нет и docker port
отображает только текущие пересылки.
чтобы добавить переадресацию портов, я всегда следую этим шагам,
-
остановка запуск контейнер
docker stop test01
-
фиксация контейнер
docker commit test01 test02
Примечание: выше,
test02
это новое изображение, которое я создаю изtest01
контейнер. -
re -выполнить из введенного изображения
docker run -p 8080:8080 -td test02
где первый 8080-локальный порт, а второй 8080-контейнерный порт.
вы можете изменить отображение порта, непосредственно отредактировав в
/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/ научиться правильно перезагрузить docker engine в соответствии с вашей хост-машиной. Я использовал sudo systemctl restart docker
чтобы перезапустить мой docker engine, который работает на 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 config
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 сервисы файл config немного по-другому. Вот простой пример:
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
в состав ответ of @Fujimoto-Youichi
вы также можете использовать $ docker run -P CONTAINER
для отображения портов случайным образом при создании контейнера, но будьте осторожны с безопасностью ascpect !
-P
эквалайзер к--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 стоп-имя
- Теперь перезапустите с новым сопоставлением портов
sudo docker run-d-p 81: 80 имя
где:
" - d " для фона / deamon докер
"-p" включить отображение портов
"81" внешний (открытый) порт, который вы используете для доступа к вашему браузеру
"80" внутренний контейнер докера слушает порт