Я не впевнений, чи я щось тут неправильно зрозумів, але здається, що встановити відображення портів можливо лише за допомогою створення нового контейнера із зображення. Чи є спосіб призначити відображення порту існуючому контейнеру 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 stop
NAME