Советы по Docker: о /var/run/docker.sock

Docker

оригинал:medium.com/better-pro Страна…

Возможно, вы запускали контейнеры на Docker Hub и заметили, что некоторые из них требуют привязки монтирования./var/run/docker.sockдокумент. Что это за файл и почему он иногда используется контейнером? Краткий ответ: это сокет Unix, и процесс Docker по умолчанию прослушивает файлы, которые используются для связи между процессами-контейнерами.


Давайте сначала посмотрим на Portainer, инструмент с открытым исходным кодом для управления хостом докеров или кластерами Swarm. Если используется для управления локальным хостом Docker, Protaner можно запустить с помощью следующей команды: привяжите mount к локальному сокету Unix докера.

$ docker container run -d \
  -p 9000:9000 \
  -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

Затем мы можем получить доступ к графическому интерфейсу через локальный порт 9000, и мы можем управлять нашими контейнерами, образами, томами и т.д.

Для достижения всех вышеперечисленных функций управления Portainer взаимодействует с локальным процессом Docker, монтируя/var/run/docker.sockфайл для достижения.

Docker daemon API

Когда Docker установлен на хосте, демон Docker по умолчанию слушает/var/run/docker.sockдокумент. Конечно, этот путь может быть задан-Hпараметр

-H unix:///var/run/docker.sock

Примечания. Демон Docker также может прослушивать хосты/порты tcp или другие сокеты Unix благодаря параметру -H.

Все HTTP-интерфейсы определены в Docker engine API v1.27. Низкоуровневая связь для всех интерфейсов осуществляется через сокеты Unix.

Container Creation

Через интерфейс Portainer мы можем легко запустить контейнер. За движком Http-запросы отправляются в процесс Docker через docker.socket.

Давайте продемонстрируем это и создадим контейнер Nginx через curl

Примечания. При использовании HTTP API для запуска контейнера требуется два шага: сначала создайте контейнер, а затем запустите его.

Создайте контейнер Nginx

Следующая команда отправляется с помощью curl{“Image”:”nginx”}Тело запроса отправляется на интерфейс к процессу Docker через сокет Unix./containers/create. В конце концов будет создан контейнер Nginx, и будет возвращен его идентификатор.

$ curl -XPOST --unix-socket /var/run/docker.sock -d '{"Image":"nginx"}' -H 'Content-Type: application/json' http://localhost/containers/create

{"Id":"fcb65c6147efb862d5ea3a2ef20e793c52f0fafa3eb04e4292cb4784c5777d65","Warnings":null}

Стартовый контейнер

С возвращенным идентификатором мы можем пройти/containers/<ID>/startдля запуска только что созданного контейнера

$ curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/fcb6...7d65/start

Мы видим, что контейнер Nginx запущен и работает.

$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fcb65c6147ef nginx “nginx -g ‘daemon …” 5 minutes ago Up 5 seconds 80/tcp, 443/tcp ecstatic_kirch

Это объясняет, как легко создать контейнер внутри контейнера с помощью сокетов Docker. Очевидно, что на самом деле его не так просто создать с помощью curl, но я демонстрирую это, чтобы читателям было легче понять.

Потоковые события для процессов Docker

Docker API предоставляет/eventsИнтерфейс можно использовать для получения потока событий, генерируемого всеми процессами Docker, например, для создания или удаления событий контейнера посредством балансировки нагрузки с целью динамического обновления его конфигурации.

Запустите простой контейнер и проверьте, как мы используем события процесса докера.

Apline container

Следующая команда запустит контейнер Apline в интерактивном режиме и привяжет его.docker.sock

$ docker run -v /var/run/docker.sock:/var/run/docker.sock -ti alpine sh

Слушайте события процесса docker

Внутри контейнера Apline мы сначала устанавливаем curl через apk

$ apk update && apk add curl

Теперь можно отправлять HTTP-запросы через сокет docker на/eventsинтерфейс. Команда будет приостановлена, ожидая поступления новых событий от процесса. Каждое новое событие будет потоком событий из процесса докера.

curl --unix-socket /var/run/docker.sock http://localhost/events

событие наблюдения

Мы создали новый контейнер на основе Nginx и прослушали его через стандартный вывод контейнера Apline, это событие генерируется процессом Docker.

docker container run -p 8080:80 -d nginx

Мы можем заметить, что предыдущий запрос получит серию событий

$ curl --unix-socket /var/run/docker.sock http://localhost/events

{
  "status": "create",
  "id": "277786a066994b4d842dc097c4544e2ddcf50ffe0b6aa8352812ca0aadec4078",
  "from": "nginx",
  "Type": "container",
  "Action": "create",
  "Actor": {
    "ID": "277786a066994b4d842dc097c4544e2ddcf50ffe0b6aa8352812ca0aadec4078",
    "Attributes": {
      "image": "nginx",
      "name": "hardcore_carson"
    }
  },
  "time": 1491683503,
  "timeNano": 1491683503003280100
}
{
  "Type": "network",
  "Action": "connect",
  "Actor": {
    "ID": "18147ed9f4510d0149a0810916434df19b3d03f30e17ac4effcbcc1d2371ba97",
    "Attributes": {
      "container": "277786a066994b4d842dc097c4544e2ddcf50ffe0b6aa8352812ca0aadec4078",
      "name": "bridge",
      "type": "bridge"
    }
  },
  "time": 1491683503,
  "timeNano": 1491683503061245700
}
{
  "status": "start",
  "id": "277786a066994b4d842dc097c4544e2ddcf50ffe0b6aa8352812ca0aadec4078",
  "from": "nginx",
  "Type": "container",
  "Action": "start",
  "Actor": {
    "ID": "277786a066994b4d842dc097c4544e2ddcf50ffe0b6aa8352812ca0aadec4078",
    "Attributes": {
      "image": "nginx",
      "name": "hardcore_carson"
    }
  },
  "time": 1491683503,
  "timeNano": 1491683503389984300
}

В основном происходят три события:

  • создание контейнера
  • Установление моста по умолчанию
  • запуск контейнера

Суммировать

Я надеюсь, что краткое объяснение позволит вам дать/var/run/docker.sockФайл имеет лучшее понимание того, как он используется для привязки контейнера. Очевидно, что приложение подключается через сокет, а не через curl, но будет использовать другие библиотеки для выполнения HTTP-запросов к процессу Docker.

Примечание. Связывание сокета процесса Docker дает контейнеру много возможностей для управления процессом Docker. Поэтому его следует использовать с осторожностью и только на контейнерах, которым мы можем доверять.