Связывание порта с интерфейсом хоста с помощью API REST
Документация для интерфейса командной строки гласит следующее:
Чтобы привязать порт контейнера к определенному интерфейсу хоста системы, используйте параметр -p команды запуска докера:
Общий синтаксис
docker run -p [([<host_interface>:[host_port]])|(<host_port>):]<container_port>[/udp] <image>
Если интерфейс хоста не предоставляется, порт привязан к все доступные интерфейсы хост-машины (aka INADDR_ANY, или 0.0.0.0). Если ни один хост-порт не предоставляется, один динамически распределяется. Возможные комбинации параметров для TCP-порта следующие
Итак, мне было интересно, как я делаю то же самое, но с REST API?
С POST /container/create
я попробовал:
-
"PortSpecs": ["5432:5432"]
кажется, что он раскрывает порт, но не привязывает его к интерфейсу хоста.
-
"PortSpecs": ["5432"]
дает мне тот же результат, что и предыдущий.
-
"PortSpecs": ["0.0.0.0:5432:5432"]
это возвращает ошибку Invalid hostPort: 0.0.0.0
, которая имеет смысл.
Когда я делаю sudo docker ps
, контейнер показывает 5432/tcp
, который должен быть 0.0.0.0:5432/tcp
.
Проверка контейнера дает мне следующее:
"NetworkSettings": {
"IPAddress": "172.17.0.25",
"IPPrefixLen": 16,
"Gateway": "172.17.42.1",
"Bridge": "docker0",
"PortMapping": null,
"Ports": {
"5432/tcp": null
}
}
Полную проверку можно найти здесь.
Ответы
Ответ 1
Это недокументированная функция. Я нашел свой ответ в списке рассылки:
При создании контейнера вы должны установить ExposedPorts
:
"ExposedPorts": { "22/tcp": {} }
При запуске контейнера необходимо установить PortBindings
:
"PortBindings": { "22/tcp": [{ "HostPort": "11022" }] }
В github уже есть проблема.
Ответ 2
Запуск контейнеров с PortBindings в HostConfig был устаревшим в v1.10 и удален в версии 1.1.
Оба этих параметра конфигурации теперь должны быть включены при создании контейнера.
POST /containers/create
{
"Image": image_id,
"ExposedPorts": {
"22/tcp": {}
},
"HostConfig": {
"PortBindings": { "22/tcp": [{ "HostPort": "" }] }
}
}