Кто-нибудь может объяснить docker.sock

130

Я пытаюсь понять настоящую причину монтирования docker.sockв docker-compose.ymlфайл. Это для автообнаружения?

volumes:
  - /var/run/docker.sock:/var/run/docker.sock
uzubair
источник

Ответы:

130

docker.sock- это сокет UNIX, который слушает демон Docker. Это основная точка входа для Docker API. Это также может быть сокет TCP, но по умолчанию из соображений безопасности Docker по умолчанию использует сокет UNIX.

Клиент Docker cli по умолчанию использует этот сокет для выполнения команд Docker. Вы также можете изменить эти настройки.

Могут быть разные причины, по которым вам может потребоваться монтировать сокет Docker внутри контейнера. Это как запуск новых контейнеров из другого контейнера. Или для автоматического обнаружения сервисов и ведения журнала. Это увеличивает поверхность атаки, поэтому вы должны быть осторожны, если вы монтируете сокет докера внутри контейнера, внутри этого контейнера работают доверенные коды, иначе вы можете просто скомпрометировать свой хост, на котором запущен демон докера, поскольку Docker по умолчанию запускает все контейнеры как root.

У сокета Docker есть группа докеров в большинстве установок, поэтому пользователи в этой группе могут запускать команды докеров против сокета докеров без разрешения root, но фактические контейнеры докеров по-прежнему получают разрешение root, поскольку демон docker эффективно работает как root (ему требуется разрешение root для доступа к пространству имен и cgroups) ,

Надеюсь, это ответ на ваш вопрос.

Дополнительная информация: https://docs.docker.com/engine/reference/commandline/dockerd/#examples

Boynux
источник
1
Неработающей ссылке. Вероятно, информация, аналогичная ожидаемой, следующая
Borja Bolilla
7
Помимо предупреждений, предоставленных @boynux, вы можете найти дополнительную информацию в статье Рекомендации по обеспечению безопасности Docker . Об этом они говорят: «Установка /var/run/docker.sockвнутри контейнера - обычная, но очень опасная практика. Злоумышленник может выполнить любую команду, которую может запустить служба докеров, которая обычно обеспечивает доступ ко всей хост-системе, поскольку служба докеров работает от имени пользователя root. "
Арнольд Шрайвер
36

Я знаю, что это немного поздно, но надеюсь, что мой ответ даст много идей

Позвольте мне сначала поговорить о сокетах Unix

Термин сокеты обычно относится к IP-сокетам. Это те, которые привязаны к порту (и адресу), мы отправляем TCP-запросы и получаем ответы.

Другой тип сокета - сокет Unix, эти сокеты используются для IPC (межпроцессного взаимодействия). Их также называют сокетами домена Unix ( UDS ). Сокеты Unix используют локальную файловую систему для связи, а сокеты IP используют сеть.

Демон Docker может прослушивать запросы API Docker Engine через три различных типа сокета: unix, tcp, and fd.

По умолчанию сокет домена unix (или сокет IPC) создается в /var/run/docker.sock

Давайте посмотрим на несколько живых примеров :

Docker Server использует этот сокет для прослушивания REST API, а клиенты используют сокет для отправки запросов API на сервер.

curl может общаться с сокетом Unix через --unix-socketфлаг. Поскольку Docker Server API представлен как REST, нам нужно будет отправлять команды через HTTP. Кроме того, поскольку этот сервер является локальным (помните, что файловая система), мы можем передать любое имя хоста в URL-адресе (или придерживаться локального хоста, это тоже будет работать нормально!). Сервер не заботится об имени хоста, а только о пути.

curl --unix-socket /var/run/docker.sock http://localhost/images/json | jq

 [
  {
    "Containers": -1,
    "Created": 1525888860,
    "Id": "sha256:24a77bfbb9ee3aeef9e24766ad6e9fa57f85c67596f154e8916e4f314067e149",
    "Labels": null,
    "ParentId": "",
    "RepoDigests": [
      "postgres@sha256:b06cdddba62f1550a1c674270814e72eaa8734d95912019b4ddc288b650ad67d"
    ],
    "RepoTags": null,
    "SharedSize": -1,
    "Size": 39507096,
    "VirtualSize": 39507096
  }
]

Некоторые команды :

С docker.sock можно много чего делать

посмотрите эту красивую статью

Нарендранат Редди
источник
6

он в основном предоставляет контейнеру демон хоста docker. поэтому вы можете вызывать docker api / client из вашего контейнера, чтобы запускать / останавливать / создавать образы / контейнеры, например, напрямую вызывать эти команды на хосте.

lwpro2
источник