docker_practice/swarm_mode/secret.md
mrnyg 1c4a43e34e
Update secret.md
apache工作进程是www-data用户运行,而密钥文件(/run/secrets/wp_db_password)的属主是root,导致apache工作进程无法读取密钥,从而无法连接数据库
2022-04-09 14:27:53 +08:00

86 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Swarm 集群中管理敏感数据
在动态的大规模的分布式集群上管理和分发 `密码``证书` 等敏感信息是极其重要的工作传统的密钥分发方式如密钥放入镜像中设置环境变量volume 动态挂载等都存在着潜在的巨大的安全风险
Docker 目前已经提供了 `secrets` 管理功能用户可以在 Swarm 集群中安全地管理密码密钥证书等敏感数据并允许在多个 Docker 容器实例之间共享访问指定的敏感数据
>注意 `secret` 也可以在 `Docker Compose` 中使用
我们可以用 `docker secret` 命令来管理敏感信息接下来我们在上面章节中创建好的 Swarm 集群中介绍该命令的使用
这里我们以在 Swarm 集群中部署 `mysql` `wordpress` 服务为例
## 创建 secret
我们使用 `docker secret create` 命令以管道符的形式创建 `secret`
```bash
$ openssl rand -base64 20 | docker secret create mysql_password -
$ openssl rand -base64 20 | docker secret create mysql_root_password -
```
## 查看 secret
使用 `docker secret ls` 命令来查看 `secret`
```bash
$ docker secret ls
ID NAME CREATED UPDATED
l1vinzevzhj4goakjap5ya409 mysql_password 41 seconds ago 41 seconds ago
yvsczlx9votfw3l0nz5rlidig mysql_root_password 12 seconds ago 12 seconds ago
```
## 创建 MySQL 服务
创建服务相关命令已经在前边章节进行了介绍这里直接列出命令
```bash
$ docker network create -d overlay mysql_private
$ docker service create \
--name mysql \
--replicas 1 \
--network mysql_private \
--mount type=volume,source=mydata,destination=/var/lib/mysql \
--secret source=mysql_root_password,target=mysql_root_password \
--secret source=mysql_password,target=mysql_password \
-e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \
-e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" \
-e MYSQL_USER="wordpress" \
-e MYSQL_DATABASE="wordpress" \
mysql:latest
```
如果你没有在 `target` 中显式的指定路径时`secret` 默认通过 `tmpfs` 文件系统挂载到容器的 `/run/secrets` 目录中
```bash
$ docker service create \
--name wordpress \
--replicas 1 \
--network mysql_private \
--publish target=30000,port=80 \
--mount type=volume,source=wpdata,destination=/var/www/html \
--secret source=mysql_password,target=wp_db_password,mode=0444 \
-e WORDPRESS_DB_USER="wordpress" \
-e WORDPRESS_DB_PASSWORD_FILE="/run/secrets/wp_db_password" \
-e WORDPRESS_DB_HOST="mysql:3306" \
-e WORDPRESS_DB_NAME="wordpress" \
wordpress:latest
```
查看服务
```bash
$ docker service ls
ID NAME MODE REPLICAS IMAGE
wvnh0siktqr3 mysql replicated 1/1 mysql:latest
nzt5xzae4n62 wordpress replicated 1/1 wordpress:latest
```
现在浏览器访问 `IP:30000`即可开始 `WordPress` 的安装与使用
通过以上方法我们没有像以前通过设置环境变量来设置 MySQL 密码 而是采用 `docker secret` 来设置密码防范了密码泄露的风险