Как я могу назначить отображение порта в существующем контейнере Docker?


Я не уверен, что я неправильно понял что-то здесь, но похоже, что можно установить сопоставления портов, создав новый контейнер из изображения. Есть ли способ назначить сопоставление портов существующему контейнеру Docker?

11 244

11 ответов:

меня тоже интересует эта проблема.

как @Thasmo упоминалось, что переадресация портов может быть указана только с помощью .
Другие команды, docker start нет и docker port отображает только текущие переадресации.

чтобы добавить переадресацию портов, я всегда выполняю следующие действия,

  1. остановка запуск контейнер

    docker stop test01
    
  2. commit контейнер

    docker commit test01 test02
    

    Примечание: выше, test02 это новый образ, который я строю из test01 контейнер.

  3. re -выполнить из введенного изображения

    docker run -p 8080:8080 -td test02
    

где первый 8080-локальный порт, а второй 8080-контейнерный порт.

вы можете изменить отображение портов, непосредственно редактируя hostconfig.json file at /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/ научиться правильно перезагрузить двигатель докера согласно вашей главной машине. Я использовал sudo systemctl restart docker чтобы перезапустить мой докер двигатель, который работает на 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?

лучшим решением было бы использование обратного прокси-сервера в той же сети

  1. создайте новую сеть, если ваш предыдущий контейнер не имеет имени те.

    docker network create my_network

  2. присоедините существующий контейнер к созданной сети

    docker network connect my_network my_existing_container

  3. запустите обратный прокси-сервис (например, 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

  4. создать новый 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;
        }
    }
    

    скопировать config в контейнер nginx.

    docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf

  5. перезапустите nginx

    docker restart nginx

преимущества: чтобы опубликовать новые порты, вы можете безопасно остановить/обновить / воссоздать контейнер nginx, как вы хотите, не касаясь бизнес-контейнера. Если вам нужно нулевое время простоя для nginx, можно добавить больше обратных прокси-сервисов, присоединяющихся к той же сети. Кроме того, контейнер может присоединяться к нескольким сетям.

Edit:

для реверса прокси-служб, отличных от http, файл конфигурации немного отличается. Вот простой пример:

upstream my_service {
    server my_existing_container:9000;
}

server {
    listen 9000;
    proxy_pass my_service;
}

в состав ответ на @Fujimoto-Youichi

вы также можете использовать $ docker run -P CONTAINER для отображения портов случайным образом при создании контейнера, но будьте осторожны с безопасностью ascpect !

-P eq to --publish-all : "он публикует все открытые порты для случайных портов",

затем запустите docker inspect CONTAINER для отображения портов fin, как показано на рисунке ниже :

. docker inspect for a rabbitmq container show all ports mapping

подробнее о 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 теперь есть еще один довольно простой и удобный способ изменить порт отображения:

  1. скачать kitematic

  2. перейдите на страницу настроек контейнера, на вкладке порты, вы можете непосредственно изменить опубликованный порт там.

  3. запустите контейнер снова

Если вы просто хотите изменить порт запущенного контейнера, вы:

  1. остановить существующий контейнер

    sudo docker stop NAME

  2. Теперь перезагрузите с новым сопоставлением портов

    sudo docker run-d-p 81: 80 NAME

где:

" - d " в фоновом режиме / deamon докер

"-p " включить отображение портов

"81" внешний (открытый) порт, который вы используете для доступа с помощью браузера

"80" внутренний докер контейнер слушать порт