Czy ktoś może wyjaśnić docker.sock

130

Próbuję zrozumieć rzeczywisty powód montowania docker.sockw docker-compose.ymlpliku. Czy służy do automatycznego wykrywania?

volumes:
  - /var/run/docker.sock:/var/run/docker.sock
uzubair
źródło

Odpowiedzi:

130

docker.sockto gniazdo UNIX, którego nasłuchuje demon Docker. To główny punkt wejścia dla Docker API. Może to być również gniazdo TCP, ale domyślnie ze względów bezpieczeństwa Docker domyślnie używa gniazda UNIX.

Klient Docker CLI domyślnie używa tego gniazda do wykonywania poleceń Dockera. Możesz również zmienić te ustawienia.

Mogą istnieć różne powody, dla których może być konieczne zamontowanie gniazda Docker w kontenerze. Podobnie jak wypuszczanie nowych kontenerów z innego kontenera. Lub do celów automatycznego wykrywania usług i rejestrowania. Zwiększa to powierzchnię ataku, więc powinieneś być ostrożny, jeśli montujesz gniazdo Dockera w kontenerze, w tym kontenerze działają zaufane kody, w przeciwnym razie możesz po prostu przejąć kontrolę nad hostem, na którym działa demon Docker, ponieważ Docker domyślnie uruchamia wszystkie kontenery jako root.

Gniazdo Docker ma grupę docker w większości instalacji, więc użytkownicy w tej grupie mogą uruchamiać polecenia docker przeciwko gnieździe docker bez uprawnień roota, ale rzeczywiste kontenery docker nadal uzyskują uprawnienia roota, ponieważ demon docker działa efektywnie jako root (wymaga uprawnień roota, aby uzyskać dostęp do przestrzeni nazw i grup cgroup) .

Mam nadzieję, że odpowiada na twoje pytanie.

Więcej informacji: https://docs.docker.com/engine/reference/commandline/dockerd/#examples

Boynux
źródło
1
Uszkodzony link. Prawdopodobnie podobna informacja do oczekiwanej jest taka: docs.docker.com/engine/admin
Borja Bolilla
7
Oprócz ostrzeżeń przedstawionych przez @boynux, więcej informacji można znaleźć w artykule Najlepsze praktyki dotyczące zabezpieczeń platformy Docker . Na ten temat mówią: „Montowanie /var/run/docker.sockwewnątrz kontenera jest powszechną, ale bardzo niebezpieczną praktyką. Atakujący może wykonać dowolne polecenie, które może uruchomić usługa docker, co ogólnie zapewnia dostęp do całego systemu hosta, ponieważ usługa docker działa jako root. "
Arnold Schrijver,
36

Wiem, że jest trochę za późno, ale mam nadzieję, że moja odpowiedź dostarczy tak wielu informacji

Pozwólcie mi najpierw porozmawiać o gniazdach Unix

Termin gniazda powszechnie odnosi się do gniazd IP. Są to te, które są powiązane z portem (i adresem), do których wysyłamy żądania TCP i otrzymujemy odpowiedzi.

Innym typem Socket jest Unix Socket, te gniazda są używane do IPC (Interprocess Communication). Nazywa się je również gniazdami domeny Unix ( UDS ). Gniazda Unix używają lokalnego systemu plików do komunikacji, podczas gdy gniazda IP używają sieci.

Demon Docker może nasłuchiwać żądań API Docker silnika przez trzech różnych rodzajów Socket: unix, tcp, and fd.

Domyślnie gniazdo domeny unix (lub gniazdo IPC) jest tworzone w /var/run/docker.sock

Zobaczmy kilka przykładów na żywo :

Serwer Docker używa tego gniazda do nasłuchiwania interfejsu API REST, a klienci używają go do wysyłania żądań interfejsu API do serwera.

curl może komunikować się z gniazdem uniksowym za pośrednictwem --unix-socketflagi. Ponieważ interfejs API serwera Docker jest udostępniany jako REST, musielibyśmy wysyłać polecenia przez HTTP. Ponadto, ponieważ ten serwer jest lokalny (pamiętaj, system plików), możemy przekazać dowolną nazwę hosta w adresie URL (lub trzymać się lokalnego hosta, to też zadziała!). Serwer nie dba o nazwę hosta, tylko o ścieżkę.

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
  }
]

Niektóre polecenia :

Z docker.sock możesz zrobić wiele rzeczy

sprawdź ten piękny artykuł

Narendranath Reddy
źródło
6

w zasadzie wystawia demona docker hosta do kontenera. więc możesz wywołać docker api / client ze swojego kontenera, aby uruchomić / zatrzymać / zbudować obrazy / kontenery, tak jak bezpośrednie wywołanie tych poleceń na hoście.

lwpro2
źródło