Связывание порта с интерфейсом хоста с помощью 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": "" }] }
    }
}