Risposte:
docker.sock
è il socket UNIX che il demone Docker sta ascoltando. È il punto di ingresso principale per l'API Docker. Può anche essere socket TCP ma, per impostazione predefinita, per motivi di sicurezza Docker utilizza per impostazione predefinita il socket UNIX.
Il client cli Docker utilizza questo socket per eseguire i comandi docker per impostazione predefinita. Puoi anche ignorare queste impostazioni.
Potrebbero esserci diversi motivi per cui potrebbe essere necessario montare la presa Docker all'interno di un contenitore. Come lanciare nuovi contenitori dall'interno di un altro contenitore. O per scopi di individuazione e registrazione automatica dei servizi. Ciò aumenta la superficie di attacco, quindi si dovrebbe fare attenzione se si monta socket docker all'interno di un contenitore, ci sono codici attendibili in esecuzione all'interno di quel contenitore, altrimenti si può semplicemente compromettere l'host che esegue il demone docker, poiché Docker di default avvia tutti i contenitori come root.
Docker socket ha un gruppo docker nella maggior parte dell'installazione, quindi gli utenti all'interno di quel gruppo possono eseguire comandi docker contro socket docker senza autorizzazione root ma i contenitori docker effettivi ottengono ancora l'autorizzazione root poiché il daemon docker viene eseguito come root in modo efficace (per accedere allo spazio dei nomi e ai cgroup è necessario il permesso root) .
Spero che risponda alla tua domanda.
Maggiori informazioni: https://docs.docker.com/engine/reference/commandline/dockerd/#examples
/var/run/docker.sock
all'interno del contenitore è una pratica comune ma molto pericolosa. Un utente malintenzionato può eseguire qualsiasi comando eseguibile dal servizio docker, che generalmente fornisce l'accesso all'intero sistema host mentre il servizio docker viene eseguito come root. "
Lo so un po 'tardi, ma spero che la mia risposta fornirà così tante intuizioni
Vorrei prima parlare di Unix Socket
Il termine Socket si riferisce comunemente a Socket IP. Questi sono quelli che sono associati a una porta (e indirizzo), a cui inviamo richieste TCP e da cui riceviamo risposte.
Un altro tipo di socket è un socket Unix, questi socket sono utilizzati per IPC (Interprocess Communication). Sono anche chiamati Unix Domain Socket ( UDS ). I socket Unix usano il filesystem locale per la comunicazione, mentre i socket IP usano la rete.
Il demone Docker può ascoltare per Docker motore richieste API tramite tre diversi tipi di Socket: unix, tcp, and fd
.
Per impostazione predefinita, un socket di dominio unix (o socket IPC) viene creato in /var/run/docker.sock
Vediamo alcuni esempi dal vivo :
Docker Server utilizza questo socket per ascoltare l'API REST e i client utilizzano il socket per inviare richieste API al server.
il ricciolo può parlare con un socket Unix tramite la
--unix-socket
bandiera. Poiché l'API Docker Server è esposta come REST, avremmo bisogno di inviare comandi su HTTP. Inoltre, poiché questo server è locale (ricorda, il file system), possiamo passare qualsiasi nome host nell'URL (o attenerci al localhost, che funzionerà anche bene!). Al server non interessa il nome host, ma solo il percorso.
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
}
]
Alcuni comandi :
Puoi fare molte cose con docker.sock
Dai un'occhiata a questo bellissimo articolo