Я не впевнений, чи я щось тут неправильно зрозумів, але здається, що встановити відображення портів можливо лише за допомогою створення нового контейнера із зображення. Чи є спосіб призначити відображення порту існуючому контейнеру 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 /
Мене також цікавить ця проблема.
Як зазначалося @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;
}
У прикладі Фухімото Юїчі 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"
}
]
}
Перезавантажте свій докер і він повинен працювати.
З іншого боку, якщо вам не зручно налаштовувати глибину налаштування Докера, 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 є ще один досить простий і дружній спосіб змінити порт зіставлення:
скачати набір
перейдіть на сторінку налаштувань контейнера, на вкладці порти ви можете безпосередньо змінити там опублікований порт.
запустити контейнер знову
Короткий відповідь: Ви не можете призначити зіставлення портів існуючому контейнеру Docker
Вам потрібен новий контейнер ... розібрайтеся з ним.
Якщо ви просто хочете змінити порт запущеного контейнера, зробіть:
sudo docker stop NAME
sudo docker run -d -p 81:80 ІМ’Я
де як:
"-d" для фону / deamon докер
"-p" увімкнути відображення портів
Зовнішній (відкритий) порт "81", який ви використовуєте для доступу зі своїм браузером
Порт прослуховування внутрішнього контейнера докера "80"
docker runкоманді, NAMEце ім'я зображення , щоб запустити контейнер з, тоді як в ставиться до імені контейнера до зупинки. docker stopNAME