Alguém pode explicar docker.sock

130

Estou tentando entender o motivo real da montagem docker.sockno docker-compose.ymlarquivo. É para descoberta automática?

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

Respostas:

130

docker.socké o soquete UNIX que o daemon do Docker está ouvindo. É o principal ponto de entrada da API do Docker. Também pode ser um soquete TCP, mas por padrão, por motivos de segurança, o Docker usa o soquete UNIX como padrão.

O cliente do Docker cli usa esse soquete para executar comandos do Docker por padrão. Você pode substituir essas configurações também.

Pode haver várias razões pelas quais você pode precisar montar o soquete do Docker dentro de um contêiner. Como lançar novos contêineres de outro contêiner. Ou para fins de detecção automática de serviços e registro. Isso aumenta a superfície de ataque; portanto, você deve tomar cuidado ao montar o soquete do docker dentro de um contêiner, pois existem códigos confiáveis ​​em execução nesse contêiner; caso contrário, você pode simplesmente comprometer o host que está executando o daemon do docker, pois o Docker, por padrão, lança todos os contêineres como raiz.

O soquete do Docker possui um grupo de janelas de encaixe na maioria das instalações, para que os usuários desse grupo possam executar comandos do docker no soquete do docker sem permissão de root, mas os contêineres de docker reais ainda obtêm permissão de root, já que o daemon do docker é executado como root com eficiência (ele precisa de permissão de root para acessar o namespace e cgroups) .

Espero que responda sua pergunta.

Mais informações: https://docs.docker.com/engine/reference/commandline/dockerd/#examples

Boynux
fonte
1
Link quebrado. Provavelmente informações semelhantes ao esperado é esta: docs.docker.com/engine/admin
Borja Bolilla
7
Além dos avisos que a @boynux forneceu, você pode encontrar mais informações no artigo Práticas recomendadas de segurança do Docker . Sobre isso, eles dizem: "A montagem /var/run/docker.sockdentro do contêiner é uma prática comum, mas muito perigosa. Um invasor pode executar qualquer comando que o serviço docker possa executar, o que geralmente fornece acesso a todo o sistema host enquanto o serviço docker é executado como raiz. "
Arnold Schrijver
36

Eu sei que é tarde, mas espero que minha resposta dê tantas idéias

Deixe-me falar primeiro sobre Unix Sockets

O termo soquetes geralmente se refere a soquetes IP. Esses são os que estão vinculados a uma porta (e endereço) para a qual enviamos solicitações TCP e obtemos respostas.

Outro tipo de soquete é um soquete Unix, esses soquetes são usados ​​para IPC (Interprocess Communication). Eles também são chamados de Soquetes de Domínio Unix ( UDS ). Os soquetes Unix usam o sistema de arquivos local para comunicação, enquanto os soquetes IP usam a rede.

O daemon Docker pode receber solicitações da API do Docker Engine por meio de três tipos diferentes de Socket: unix, tcp, and fd .

Por padrão, um soquete de domínio unix (ou soquete IPC) é criado em /var/run/docker.sock

Vamos ver alguns exemplos ao vivo :

O Docker Server usa esse soquete para escutar a API REST, e os clientes usam o soquete para enviar solicitações de API ao servidor.

curl pode falar com um soquete Unix através da --unix-socketbandeira. Como a API do Docker Server é exposta como REST, precisamos enviar comandos por HTTP. Além disso, como este servidor é local (lembre-se, o sistema de arquivos), podemos passar qualquer nome de host na URL (ou manter o host local, que também funcionará bem!). O servidor não se importa com o nome do host, apenas o caminho.

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

Alguns comandos :

Você pode fazer muitas coisas com o docker.sock

confira este belo artigo

Narendranath Reddy
fonte
6

basicamente expõe o daemon do docker do host ao contêiner. para que você possa chamar o docker api / client do seu contêiner para iniciar / parar / criar imagens / contêineres como chamar diretamente esses comandos no host.

lwpro2
fonte