Hacemos una verificación profunda cada enunciado en nuestra página web con la meta de enseñarte siempre información certera y actualizada.
Puedes leer el apartado correspondiente de la documentación oficial.
Para usar secretos, debe agregar dos cosas a su docker-compose.yml
Archivo. Primero, un nivel superior secrets:
bloque que define todos los secretos. Luego otro secrets:
bloque bajo cada servicio que especifica cual secretos que debe recibir el servicio.
Como ejemplo, cree los dos tipos de secretos que Docker comprenderá: externo secretos y Archivo misterios.
1. Cree un secreto “externo” utilizando docker secret create
Primero: para usar secretos con Docker, el nodo en el que se encuentra debe ser parte de un enjambre.
$ docker swarm init
A continuación, cree un secreto ‘externo’:
$ echo "This is an external secret" | docker secret create my_external_secret -
(Asegúrese de incluir el guión final, -
. Es fácil pasarlo por alto).
2. Escribe otro secreto en un archivo.
$ echo "This is a file secret." > my_file_secret.txt
3. Cree un docker-compose.yml
archivo que usa ambos secretos
Ahora que se crean ambos tipos de secretos, aquí está el docker-compose.yml
archivo que leerá ambos y los escribirá en el web
Servicio:
version: '3.1'
services:
web:
image: nginxdemos/hello
secrets: # secrets block only for 'web' service
- my_external_secret
- my_file_secret
secrets: # top level secrets block
my_external_secret:
external: true
my_file_secret:
file: my_file_secret.txt
Docker puede leer secretos de su propia base de datos (por ejemplo, secretos creados con docker secret create
) o de un archivo. Lo anterior muestra ambos ejemplos.
4. Implemente su pila de prueba
Implemente la pila usando:
$ docker stack deploy --compose-file=docker-compose.yml secret_test
Esto creará una instancia del web
servicio, llamado secret_test_web
.
5. Verifique que el contenedor creado por el servicio tenga ambos secretos
Usar docker exec -ti [container] /bin/sh
para verificar que los secretos existen.
(Nota: en el siguiente docker exec
comando, el m2jgac...
La porción será diferente en su máquina. Correr docker ps
para encontrar el nombre de su contenedor).
$ docker exec -ti secret_test_web.1.m2jgacogzsiaqhgq1z0yrwekd /bin/sh
# Now inside secret_test_web; secrets are contained in /run/secrets/
[email protected]_test_web:~$ cd /run/secrets/
[email protected]_test_web:/run/secrets$ ls
my_external_secret my_file_secret
[email protected]_test_web:/run/secrets$ cat my_external_secret
This is an external secret
[email protected]_test_web:/run/secrets$ cat my_file_secret
This is a file secret.
Si todo está bien, los dos secretos que creamos en los pasos 1 y 2 deberían estar dentro del web
contenedor que se creó cuando implementamos nuestra pila.
Dado que tienes un servicio myapp
y un archivo de secretos secrets.yml
:
Crea un archivo de redacción:
version: '3.1'
services:
myapp:
build: .
secrets:
secrets_yaml
Aprovisionar un secreto con este comando:
docker secret create secrets_yaml secrets.yml
Implemente su servicio usando este comando:
docker deploy --compose-file docker-compose.yml myappstack
Ahora su aplicación puede acceder al archivo secreto en /run/secrets/secrets_yaml
. Puede codificar esta ruta en su aplicación o crear un enlace simbólico.
La pregunta diferente
Esta respuesta probablemente sea a la pregunta “¿cómo proporciona sus secretos a su clúster de enjambre de Docker?”.
La pregunta original “cómo se administran los valores secretos con docker compose” implica que el archivo docker-compose contiene valores secretos. No es así.
Hay una pregunta diferente: “¿Dónde almacena la fuente canónica del secrets.yml
file “. Esto depende de usted. Puede almacenarlo en su cabeza, imprimir en una hoja de papel, usar un administrador de contraseñas, usar una aplicación / base de datos dedicada a secretos. Diablos, incluso puede usar un repositorio de git si está protegido de manera segura por sí mismo. Por supuesto, nunca lo guarde dentro del sistema que está protegiendo con él 🙂
Recomendaría bóveda. Para almacenar un secreto:
# create a temporary secret file
cat secrets.yml | vault write secret/myappsecrets -
Para recuperar un secreto y ponerlo en su enjambre de Docker:
vault read -field=value secret/myappsecrets | docker secret create secrets_yaml -
Por supuesto, puede usar el clúster de la ventana acoplable en sí mismo como una única fuente de verdad para sus secretos, pero si su clúster de la ventana acoplable se rompe, habrá perdido sus secretos. Así que asegúrese de tener una copia de seguridad en otro lugar.
La pregunta que nadie hizo
La tercera pregunta (que nadie hizo) es cómo proporcionar secretos a las máquinas de los desarrolladores. Puede ser necesario cuando hay un servicio externo que es imposible simular localmente o una base de datos grande que es imposible de copiar.
Nuevamente, Docker no tiene nada que ver con eso (todavía). No tiene listas de control de acceso que especifiquen qué desarrolladores tienen acceso a qué secretos. Tampoco tiene ningún mecanismo de autenticación.
La solución ideal parece ser esta:
- Un desarrollador abre alguna aplicación web.
- Se autentica mediante algún mecanismo de inicio de sesión único.
- Copia una larga lista de
docker secret create
comandos y los ejecuta en la terminal.
Todavía tenemos que ver si aparece una aplicación de este tipo.
También puede especificar secrets
almacenado localmente en un archivo usando file:
key en secrets
objeto. Entonces no tienes que hacerlo docker secret create
ellos usted mismo, Redactar / docker stack deploy
lo hará por ti.
version: '3.1'
secrets:
password:
file: ./password
services:
password_consumer:
image: alpine
secrets:
- password
Referencia: Redactar archivo versión 3 referencia: Secretos