108、如何使用 Secret? (Swarm15)

此博客为转载内容,原链接为https://www.cnblogs.com/www1707/p/10880830.html ,涉及数据库、运维和网络方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
我们经常要想容器传递敏感信息,最常见的就是密码。比如:
 
docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
 
在启动 Mysql 容器时,我们通过环境变量 MYSQL_ROOT_PASSWORD 设置 mysql 的管理员密码。不过密码是以明文的形式写在了 docker run 命令中,有潜在的安全隐患。
 
为了解决这个问题, docker swarm 提供了secret 机制,允许将敏感信息加密后保存到secret 中,用户可以指定哪些容器可以使用此 secret。
 
如果使用 secret 启动 Mysql 容器,方法是:
 
root@host03:~# echo 'my-secret-pw' | docker secret create my_secret_data1 -    #    创建一个secret
z04oyb43x6brtvpdel6bqc7rv
 
root@host03:~# docker secret ls    #    查看 secret 列表
ID                          NAME                DRIVER              CREATED             UPDATED
z04oyb43x6brtvpdel6bqc7rv   my_secret_data1                         7 seconds ago       7 seconds ago
 
root@host03:~# docker secret inspect my_secret_data1    #    查看 secret详细信息
[
    {
        "ID": "z04oyb43x6brtvpdel6bqc7rv",
        "Version": {
            "Index": 13493
        },
        "CreatedAt": "2019-05-16T02:05:11.083477558Z",
        "UpdatedAt": "2019-05-16T02:05:11.083477558Z",
        "Spec": {
            "Name": "my_secret_data1",
            "Labels": {}
        }
    }
]
 
root@host03:~# docker service create --name mysql --secret source=my_secret_data1,target=mysql_root_password -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" mysql
4epm4b3arpzetqra3vuveqgq5
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged
 
root@host03:~# docker service ps mysql
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
8icyti1vg03n        mysql.1             mysql:latest        host02              Running             Running 5 minutes ago                       
 
root@host02:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
74ae17815637        mysql:latest        "docker-entrypoint.s…"   57 seconds ago      Up 56 seconds       3306/tcp, 33060/tcp   mysql.1.8icyti1vg03nlmp87zna0vw4g
 
root@host02:~# docker exec mysql.1.8icyti1vg03nlmp87zna0vw4g cat /run/secrets/mysql_root_password    #    在容器中可以看到未加密的密码
my-secret-pw
 
 
 
docker service create --name mysql \
--secret source=my_secret_data1,target=mysql_root_password \                    #    source指定容器使用secret后,secret会被解密并存放到容器中 /run/secret/<filename>,其中filename由tatget指定
-e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \    #    环境变量 MYSQL_ROOT_PASSWORD_FILE 从容器中指定的文件 /run/secret/<filename> 中获得(明文)
mysql
 
这里可能会有两个问题:
 
1、在第一步创建secret时,不是也使用明文了吗?这跟在环境变量中直接指定密码有什么不同?
 
    在我们的例子中创建secret和使用secret是分开完成的,其好处是将密码和容器解耦。secret可以有专人(比如管理员)负责,而运行容器的用户只需要使用secret但并不需要知道secret的内容。也就是说例子中的两个步骤可以由不同的人在不同的时间完成。
 
2、secret是以文件形式mount到容器中,容器怎么知道去哪里读取呢?
 
    这需要image的支持,如果image希望他部署出来的容器能够从secret中读取数据,那么此image就应该提供一种方式,让用户能够制定secret的位置。最常用的方法就是通过环境变量,Docker的很多官方image都采用这种方式,比如Mysql镜像同事提供了MYSQL_ROOT_PASSWORD 和 MYSQL_ROOT_PASSWORD_FILE 两个环境变量。
 

转载于:https://www.cnblogs.com/www1707/p/10880830.html

<think>嗯,用户想了解Docker Secret使用教程。好的,首先我需要回忆一下Docker Secret的相关知识,确保自己理解正确。Docker Secret主要用于在Swarm模式下安全地管理敏感信息,比如密码、密钥等。用户可能是在部署应用时需要处理这些敏感数据,所以需要知道如何正确使用。 首先,我应该介绍Docker Secret的基本概念,适用场景,以及为什么需要它。可能用户还不清楚Docker Secret和Config的区别,或者为什么不用环境变量或卷来存储敏感信息。这里需要说明Secret的安全性,比如存储加密、传输加密,只在需要时解密等。 接下来,用户可能需要具体的步骤,所以应该分步骤讲解如何创建和管理Secret。包括创建Secret的前提条件,比如必须在Swarm模式下,然后如何创建,使用文件或者命令行输入。然后是如何在服务中使用这些Secret,比如在docker service create命令中挂载,或者在docker-compose.yml中定义。 然后,可能需要解释在容器内部如何访问这些Secret,通常是挂载到/run/secrets目录下,以文件形式存在。还要提醒用户权限问题,默认是只读的,确保安全性。 另外,用户可能会遇到常见问题,比如如何更新Secret,这时候需要说明Docker Secret本身不支持直接更新,只能通过创建新版本然后重新部署服务来实现。或者如何查看已存在的Secret使用docker secret ls命令。 还要注意,Docker Secret只能在Swarm模式下使用,单机模式下不行,这点需要强调,避免用户在不支持的环境下尝试使用。 可能用户对Docker Compose的使用也比较多,所以需要包含如何在docker-compose.yml中定义Secrets,以及版本要求,必须是3.1或以上。 最后,总结一下最佳实践,比如定期轮换Secret,最小权限原则,以及不要将敏感信息硬编码在镜像或代码中。这些都能帮助用户更好地使用Docker Secret,确保应用的安全性。 需要检查是否有遗漏的步骤,或者是否有错误的点。比如,创建Secret时是否支持两种方式,文件和命令行,挂载后的路径是否正确,更新策略是否正确。确保所有命令和示例都是准确且符合最新Docker版本的,避免用户操作时出现版本不兼容的问题。 另外,可能用户是刚开始接触Docker Swarm,所以需要明确前提条件,比如初始化Swarm,加入节点等,如果用户还没初始化,可能需要先指导他们完成Swarm的配置。 总之,结构要清晰,分步骤讲解,确保用户能够按照步骤操作,同时解释每个步骤的意义和注意事项,帮助用户理解背后的原理,而不仅仅是复制命令。这样用户遇到问题时,也能更好地自行排查和解决。</think>以下为Docker Secret使用教程,按逻辑步骤组织: --- ### 一、Docker Secret 基础概念 **作用**:安全地存储敏感数据(如密码、API密钥、TLS证书等),在Swarm集群中加密传输和存储,仅在容器运行时解密。 **适用场景**: - 服务间共享敏感信息 - 避免敏感数据暴露在镜像、环境变量或日志中 - 符合安全合规要求 --- ### 二、前提条件 1. **启用Swarm模式**: ```bash docker swarm init # 若未初始化集群 ``` 2. **节点状态验证**: ```bash docker node ls # 确认节点状态为Ready ``` --- ### 三、Secret 创建与管理 #### 1. 创建Secret **方式一:通过文件创建** ```bash echo "my_db_password" > db_pass.txt docker secret create db_password db_pass.txt rm db_pass.txt # 创建后立即删除源文件 ``` **方式二:通过命令行输入** ```bash echo "my_secret" | docker secret create api_token - ``` #### 2. 查看Secret列表 ```bash docker secret ls ``` 输出示例: ``` ID NAME DRIVER CREATED UPDATED a1b2c3d4e5f6 db_password 5 minutes ago 5 minutes ago ``` #### 3. 查看Secret详情 ```bash docker secret inspect db_password ``` #### 4. 删除Secret ```bash docker secret rm db_password ``` --- ### 四、在服务中使用Secret #### 1. 创建服务时挂载Secret ```bash docker service create \ --name mysql \ --secret source=db_password,target=mysql_root_password \ -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password \ mysql:latest ``` **参数说明**: - `source`:Secret名称(创建时定义的名称) - `target`:容器内挂载的文件名(默认为Secret名称) #### 2. 在Docker Compose中使用(需version≥3.1) ```yaml version: '3.8' services: webapp: image: nginx:latest secrets: - db_password secrets: db_password: external: true # 使用已存在的Secret ``` --- ### 五、容器内访问Secret 1. **挂载路径**:Secrets默认挂载到容器内的`/run/secrets/`目录 2. **文件权限**:默认`0400`(只读) 3. **访问示例**: ```bash # 在容器内查看Secret内容 cat /run/secrets/db_password ``` --- ### 六、最佳实践与注意事项 1. **更新策略**: - Docker Secret本身不可修改,需创建新Secret并重新部署服务 ```bash docker secret create db_password_v2 new_pass.txt docker service update \ --secret-rm db_password \ --secret-add source=db_password_v2,target=mysql_root_password \ mysql ``` 2. **安全建议**: - 禁止将Secret挂载到非必要路径 - 定期轮换Secret(通过版本控制) - 结合RBAC控制Secret访问权限 3. **限制**: - 仅限Swarm模式下使用(单机模式无效) - 单个Secret大小上限为500KB --- ### 七、常见问题排查 1. **Secret未生效**: - 检查服务是否在Swarm集群中运行 - 验证Secret名称拼写是否正确 2. **权限拒绝错误**: - 确认容器内程序有权限读取`/run/secrets/`路径 --- 通过以上步骤,您可以安全地在Docker Swarm中管理敏感数据。实际使用时需根据具体场景调整挂载路径和访问方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值