Я не уверен, что я что-то здесь неправильно понял, но кажется, что установить сопоставления портов можно только путем создания нового контейнера из образа. Есть ли способ назначить сопоставление портов для существующего контейнера Docker?
Я не уверен, что я что-то здесь неправильно понял, но кажется, что установить сопоставления портов можно только путем создания нового контейнера из образа. Есть ли способ назначить сопоставление портов для существующего контейнера Docker?
Ответы:
Вы можете изменить отображение портов, отредактировав hostconfig.json
файл по адресу
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
Вы можете определить [hash_of_the_container] с помощью docker inspect <container_name>
команды, а значение поля «Id» - это хеш.
1) stop the container
2) stop docker service (per Tacsiazuma's comment)
3) change the file
4) restart your docker engine (to flush/clear config caches)
5) start the container
Таким образом, вам не нужно создавать изображение с этим подходом. Вы также можете изменить флаг перезагрузки здесь.
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
отображают только текущие пересылки.
Чтобы добавить переадресацию портов, я всегда следую за этими шагами,
остановить запуск контейнера
docker stop test01
совершить контейнер
docker commit test01 test02
ПРИМЕЧАНИЕ: выше, test02
это новое изображение, которое я создаю из test01
контейнера.
повторно запустить из порученного изображения
docker run -p 8080:8080 -td test02
Где первый 8080 является локальным портом, а второй 8080 является портом контейнера.
docker start
?
Если под «существующим» вы подразумеваете «работающий», то (в настоящее время) невозможно добавить сопоставление портов.
Однако вы можете динамически добавить новый сетевой интерфейс, например, с помощью Pipework , если вам нужно представить сервис в работающем контейнере без его остановки / перезапуска.
Не уверен, что вы можете применить сопоставление портов для работающего контейнера. Вы можете применить переадресацию портов при запуске контейнера, который отличается от создания нового контейнера.
$ docker run -p <public_port>:<private_port> -d <image>
начнется запуск контейнера. Этот урок объясняет перенаправление портов.
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
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;
}
}
Скопируйте конфигурацию в контейнер nginx.
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
Перезапустите nginx
docker restart nginx
Преимущества : чтобы опубликовать новые порты, вы можете безопасно остановить / обновить / воссоздать контейнер nginx по своему усмотрению, не касаясь бизнес-контейнера. Если вам нужно нулевое время простоя для nginx, можно добавить больше обращенных прокси-сервисов, присоединяющихся к той же сети. Кроме того, контейнер может присоединиться к нескольким сетям.
Редактировать:
Для обратного прокси не-http сервисы, файл конфигурации немного отличается. Вот простой пример:
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
В примере Fujimoto Youichi test01
это контейнер, а test02
изображение.
Перед этим docker run
вы можете удалить исходный контейнер, а затем снова присвоить ему то же имя:
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
(Использование -P
для выставления портов для случайных портов, а не для назначения вручную).
Если вы запустите docker run <NAME>
его, появится новый образ, который, скорее всего, не тот, который вы хотите.
Если вы хотите изменить текущее изображение, сделайте следующее:
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"
}
]
}
Перезагрузите докер, и он должен работать.
И наоборот, если вас не устраивает конфигурация глубины Docker, 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}
Это просто трюк, а не рекомендуемый способ, который работает с моим сценарием, потому что я не смог остановить контейнер, надеюсь, он вам тоже поможет.
DOCKER_PORT
в MACHINE_PORT
, какие части должны быть изменены?
мы используем удобные инструменты, такие как ssh, чтобы легко это сделать.
Я использовал образ хоста Ubuntu и основанный на Ubuntu образ докера.
когда новый порт необходимо отобразить,
внутри докера выполните следующую команду
ssh -R8888:localhost:8888 <username>@172.17.0.1
172.17.0.1 был ip интерфейса докера (вы можете получить это, запустив
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
на хосте).
здесь у меня был локальный порт 8888, сопоставленный с хостами 8888. Вы можете изменить порт при необходимости.
если вам нужен еще один порт, вы можете убить ssh и добавить в него еще одну строку -R с новым портом.
Я проверил это с Netcat.
Для пользователей Windows и Mac есть еще один довольно простой и удобный способ изменить порт отображения:
скачать Kitematic
перейдите на страницу настроек контейнера, на вкладке портов вы можете напрямую изменить опубликованный порт.
запустить контейнер снова
Краткий ответ: Вы не можете назначить сопоставление портов существующему контейнеру Docker.
Вам нужен новый контейнер ... разберитесь с ним.
Если вы просто хотите изменить порт работающего контейнера, вы делаете:
sudo docker stop NAME
sudo docker run -d -p 81:80 ИМЯ
в то время как:
"-d" для фона / deamon докер
«-p» включить сопоставление портов
«81» внешний (открытый) порт, который вы используете для доступа через браузер
"80" порт прослушивания внутреннего док-контейнера
docker run
команде, NAME
это имя изображения , чтобы запустить контейнер из, тогда как в относится к имени контейнера до остановки. docker stop
NAME