在这篇文章中,我想展示如何使用 Docker Secrets 提供一个真实的场景示例,使用 redis 。
在阅读本文之前,您需要什么?
- Docker Technology的基本知识
- Docker Swarm Orchestrator的基本知识
- redis的基本知识
- Docker已安装
- 访问bash shell
什么是Docker秘密?
我只是引用文档提供的定义:
“ 在Docker Swarm服务方面,秘密是数据斑点,例如密码,SSH私钥,SSL证书或其他不应通过网络传输或未经加密的数据在Dockerfile或您的应用程序的源代码中。... “
如何创建它们?
要创建一个秘密,您必须运行以下命令:
am@animusna:~$echo "myPlainSecret" | docker secret create mysecret
acvs814nso28yn105wqc32o8e
该命令的输出是秘密的ID(acvs814nso28ynso28yn105wqc32o8e)。
检查是否已创建了您的秘密运行以下命令:
am@animusna:~$docker secret ls
ID NAME DRIVER CREATED UPDATED
acvs814nso28yn105wqc32o8e mysecret 5 seconds ago 5 seconds ago
如何使用它们?
要使用秘密,您必须在创建服务期间映射它(在这种情况下, redis ,例如documentation:
am@animusna:~$docker service create --name redis --secret mysecret redis:alpine
当您在服务中映射秘密时,docker会在文件夹中创建一个名为秘密名称 秘密名称 mySecret ) /run/secrets ,并证明我们可以运行以下命令:
am@animusna:~$docker container exec $(docker ps --filter name=redis -q) cat /run/secrets/mysecret
myPlainSecret
输出将是我们创建的秘密的纯文本( myplainsecret )。
实际场景示例:带Docker Secret的Redis身份验证
如果我们要保护我们的 redis 服务器,我们可以使用以前创建的秘密作为密码连接到我们的服务器。
让我们准备我们的Docker组成文件:
version: "3.1"
secrets:
mysecret:
external: true #external=true means we've created the secret before.
services:
redis:
image: redis
secrets:
- mysecret #We are declaring we are using this secret in this service.
command: bash -c "/startup/up-redis.sh" #The command we use to start our Redis server (we execute a shell script).
ports:
- "6379:6379"
volumes:
- "/home/am/up-redis.sh:/startup/up-redis.sh" # Mapping in the container our script.
deploy:
replicas: 1
restart_policy:
condition: on-failure
让我们在特定路径中准备我们的服务器 up-redis.sh 的启动脚本(在我的情况下/home/am/am/):
#!/bin/sh
#Script to startup Redis Server.
#Reading secret in a temporary variable.
REDIS_PASSWORD=`cat /run/secrets/mysecret`
#Start Redis server
redis-server --appendonly yes --requirepass "$REDIS_PASSWORD"
在此脚本中,我们使用选项 - 需要从/run/necrets/mySecret strong> redis_password 。
现在,这就是我们可以开始服务的一切:
am@animusna:~$docker stack deploy --compose-file=docker-compose.yaml myapp_stack
Creating network myapp_stack_default
Creating service myapp_stack_redis
检查我们是否已设置秘密来访问我们的redis服务,让我们运行以下命令:
am@animusna:~$echo -e "AUTH myPlainSecret\nPING" | redis-cli
OK
PONG
我们在 redis-cli 中运行的地方然后命令 ping 检查我们是否已进行身份验证(在我们的情况下是因为我们得到了 pong )。
结论
在本文中,我显示了可以轻松使用Docker Secrets来保护敏感数据,就像它是连接密码一样。秘密的使用在部署方案和开发方案中都非常有用,开发人员应使用自己的秘密来配置其开发环境。根据我的经验,Docker Secrets非常有用且易于管理,如果您选择 Docker Swarm 作为您(Micro)服务的编排,则值得使用它们。