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


130

Я намагаюся зрозуміти фактичну причину монтажу docker.sockу docker-compose.ymlфайл. Це для автоматичного відкриття?

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

Відповіді:


130

docker.sock- це розетка UNIX, яку слухає демон Докера. Це головна точка входу для API Docker. Це також може бути TCP-сокет, але за замовчуванням з міркувань безпеки Docker за замовчуванням використовує UNIX-сокет.

Клієнт Docker cli використовує цей сокет для виконання команд докер за замовчуванням. Ви також можете змінити ці налаштування.

Можливо, можуть бути різні причини, чому вам може знадобитися монтувати гніздо Docker всередині контейнера. Як і запуск нових контейнерів з іншого контейнера. Або для автоматичного пошуку та обслуговування журналу. Це збільшує поверхню атаки, тому вам слід бути обережними, якщо ви встановлюєте докер-сокет всередині контейнера, у ньому зберігаються довірені коди, інакше ви можете просто скомпрометувати хоста, який працює демона docker, оскільки Docker за замовчуванням запускає всі контейнери як root.

Docker socket має групу докерів у більшості інсталяцій, тому користувачі цієї групи можуть запускати команди докера проти докерного сокета без дозволу кореня, але фактичні контейнери докера все одно отримують дозвіл на root, оскільки демон-докер працює ефективно як root (йому потрібен кореневий дозвіл на доступ до простору імен та груп) .

Я сподіваюся, що він відповість на ваше запитання.

Більше інформації: https://docs.docker.com/engine/reference/commandline/dockerd/#examples


1
Перервана посилання. Можливо, схожа інформація на очікувану така: docs.docker.com/engine/admin
Borja Bolilla

7
На додаток до застережень @boynux надає додаткову інформацію у статті Docker Security Best-Practices . На цьому вони говорять: "Монтаж /var/run/docker.sockвсередині контейнера є звичайною, але дуже небезпечною практикою. Зловмисник може виконати будь-яку команду, яку може виконувати служба докера, яка, як правило, забезпечує доступ до всієї системи хостів, оскільки служба докера працює як root. "
Арнольд Шрівер

36

Я знаю це трохи пізно, але сподіваюся, що моя відповідь дасть стільки розумінь

Дозвольте спочатку поговорити про Unix Sockets

Термін Sockets зазвичай відноситься до IP Sockets. Це ті, які прив’язані до порту (та адреси), на який ми надсилаємо TCP-запити та отримуємо відповіді.

Іншим типом Socket є Unix Socket, ці розетки використовуються для IPC (Interprocess Communication). Їх також називають Unix Domain Sockets ( UDS ). Unix Sockets використовує локальну файлову систему для зв'язку, тоді як IP Sockets - мережу.

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

За замовчуванням Unix доменного сокета (або IPC-сокета) створюється за адресою /var/run/docker.sock

Давайте подивимося кілька живих прикладів :

Docker Server використовує цей сокет для прослуховування API REST, а клієнти використовують сокет для надсилання запитів API на сервер.

curl може говорити з Unix Socket через --unix-socketпрапор. Оскільки API Docker Server виставляється як REST, нам потрібно буде надсилати команди через HTTP. Крім того, оскільки цей сервер є локальним (пам’ятайте, файлова система), ми можемо передавати будь-яке ім’я хоста в URL-адресі (або дотримуватися localhost, який також буде добре працювати!). Сервер не піклується про ім’я хоста, лише про шлях.

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

він в основному виставляє демон-докер хоста до контейнера. тож ви можете викликати докер api / клієнта зі свого контейнера, щоб запустити / зупинити / створити зображення / контейнери, як-от безпосередньо викликати ці команди на хості.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.