Docker Secret in Swarm:Redis用例
#devops #docker #redis #bash

在这篇文章中,我想展示如何使用 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)服务的编排,则值得使用它们。