¿Alguien puede explicar docker.sock

130

Estoy tratando de entender la razón real para el montaje docker.socken el docker-compose.ymlarchivo. ¿Es para autodescubrimiento?

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

Respuestas:

130

docker.sockes el socket de UNIX que Docker daemon está escuchando. Es el principal punto de entrada para Docker API. También puede ser un socket TCP, pero de manera predeterminada por razones de seguridad, Docker usa de manera predeterminada el socket UNIX.

El cliente cli de Docker usa este socket para ejecutar los comandos de docker de manera predeterminada. También puede anular esta configuración.

Puede haber diferentes razones por las que puede necesitar montar el zócalo Docker dentro de un contenedor. Como lanzar nuevos contenedores desde otro contenedor. O para fines de descubrimiento y registro de servicios automáticos. Esto aumenta la superficie de ataque, por lo que debe tener cuidado si monta el zócalo docker dentro de un contenedor, hay códigos confiables que se ejecutan dentro de ese contenedor; de lo contrario, simplemente puede comprometer su host que ejecuta docker daemon, ya que Docker lanza de forma predeterminada todos los contenedores como root.

Docker Socket tiene un grupo Docker en la mayoría de las instalaciones, por lo que los usuarios dentro de ese grupo pueden ejecutar comandos Docker contra Docker Socket sin permiso de root, pero los contenedores Docker reales aún obtienen permiso de root ya que Docker Daemon se ejecuta como root de manera efectiva (necesita permiso de root para acceder al espacio de nombres y cgroups) .

Espero que responda tu pregunta.

Más información: https://docs.docker.com/engine/reference/commandline/dockerd/#examples

Boynux
fuente
1
Enlace roto. Probablemente información similar a la esperada es la siguiente: docs.docker.com/engine/admin
Borja Bolilla
77
Además de las advertencias que @boynux le ha proporcionado, puede encontrar más información en el artículo Mejores prácticas de seguridad de Docker . En este caso, dicen: "Montar /var/run/docker.sockdentro del contenedor es una práctica común, pero muy peligrosa. Un atacante puede ejecutar cualquier comando que pueda ejecutar el servicio Docker, que generalmente proporciona acceso a todo el sistema host mientras el servicio Docker se ejecuta como root. "
Arnold Schrijver
36

Sé que es un poco tarde, pero espero que mi respuesta dé muchas ideas

Déjame hablar primero sobre los zócalos Unix

El término Sockets comúnmente se refiere a Sockets IP. Estos son los que están vinculados a un puerto (y una dirección), a los que enviamos solicitudes TCP y recibimos respuestas.

Otro tipo de Socket es un Socket Unix, estos sockets se utilizan para IPC (comunicación entre procesos). También se llaman Sockets de dominio Unix ( UDS ). Los Sockets Unix usan el sistema de archivos local para la comunicación, mientras que los Sockets IP usan la red.

El demonio del estibador puede escuchar las solicitudes de API acoplable motor a través de tres diferentes tipos de zócalo: unix, tcp, and fd.

Por defecto, se crea un socket de dominio Unix (o socket IPC) en /var/run/docker.sock

Veamos algunos ejemplos en vivo :

Docker Server usa este socket para escuchar la API REST, y los clientes usan el socket para enviar solicitudes de API al servidor.

curl puede hablar con un socket de Unix a través de la --unix-socketbandera. Dado que la API de Docker Server está expuesta como REST, necesitaríamos enviar comandos a través de HTTP. Además, como este servidor es local (recuerde, el sistema de archivos), podemos pasar cualquier nombre de host en la URL (o apegarnos al localhost, ¡eso también funcionará bien!). Al servidor no le importa el nombre de host, solo la ruta.

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

Algunos comandos :

Puedes hacer muchas cosas con docker.sock

mira este hermoso artículo

Narendranath Reddy
fuente
6

Básicamente expone el host docker demonio al contenedor. para que pueda invocar docker api / client desde su contenedor, para iniciar / detener / construir imágenes / contenedores como llamar directamente a esos comandos en el host.

lwpro2
fuente