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

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

11 ответов


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

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

чтобы добавить переадресацию портов, я всегда следую этим шагам,

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

    docker stop test01
    
  2. фиксация контейнер

    docker commit test01 test02
    

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

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

    docker run -p 8080:8080 -td test02
    

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


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

    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 сервисы файл config немного по-другому. Вот простой пример:

upstream my_service {
    server my_existing_container:9000;
}

server {
    listen 9000;
    proxy_pass my_service;
}

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

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

-P эквалайзер к --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 стоп-имя

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

    sudo docker run-d-p 81: 80 имя

где:

" - d " для фона / deamon докер

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

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

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