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