оригинал: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. Поэтому его следует использовать с осторожностью и только на контейнерах, которым мы можем доверять.