Docker命令行工具提供了docker secret命令来管理敏感信息

docker secret 只能从Docker Swarm模式的manager节点调用,如果在本机进行试验,请先执行

Note: Docker secrets are only available to swarm services, not to standalone containers. To use this feature, consider adapting your container to run as a service. Stateful containers can typically run with a scale of 1 without changing the container code.

1
docker swarm init
1
2
3
4
5
6
7
8
9
10
11
12
13
root@debian:~# docker secret --help

Usage: docker secret COMMAND

Manage Swarm secrets

Commands:
create Create a secret from a file or STDIN as content
inspect Display detailed information on one or more secrets
ls List secrets
rm Remove one or more secrets

Run 'docker secret COMMAND --help' for more information on a command.

创建

从标准输入创建

创建secret

1
echo "123456" | docker secret create db_password  -

查看secret

1
docker secret ls

从文件创建

一旦密钥创建成功,Docker会将其存储在Swarm管理的安全存储中,并且不再需要原始密钥文件。

1
echo "root" > mysql_pwd

创建secret

1
docker secret create root_password  mysql_pwd

查看secret详细信息

1
docker secret inspect root_password

使用

容器中的使用

创建一个【db】服务并引用所创建的secret作为数据库用户名和root密码

1
2
3
4
5
6
7
8
9
docker service create --name db \
-d \
--secret db_password \
--secret root_password \
-e MYSQL_USER=dbtest \
-e MYSQL_DATABASE=dbtest \
-e MYSQL_PASSWORD_FILE=/run/secrets/db_password \
-e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/root_password \
mariadb

检查服务的状态

1
2
3
docker service ls
docker service ps db
docker service logs --tail 30 db

进入容器查看挂载到/run/secrets/目录下的secret文件

1
2
3
4
5
6
7
8
9
10
root@debian:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8cb6e1530c11 mariadb:latest "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 3306/tcp db.1.rsxar4glbpbmq6e40q0mfm2fm

root@debian:~# docker exec -it 8cb6e1530c11 bash

root@8cb6e1530c11:/# cat /run/secrets/db_password
123456
root@8cb6e1530c11:/# cat /run/secrets/root_password
root

docker-compose 中的使用

Docker Compose,缺点是不能在分布式多机器上使用;

Docker swarm,缺点是不能同时编排多个服务;

所以才有了Docker Stack,可以在分布式多机器上同时编排多个服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@debian:~# docker stack --help

Usage: docker stack COMMAND

Manage Swarm stacks

Commands:
config Outputs the final config file, after doing merges and interpolations
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack

Run 'docker stack COMMAND --help' for more information on a command.

比如说启动一个redis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3.7'

services:
redis:
image: redis
ports:
- "6379:6379"
secrets:
- redis_password
environment:
REDIS_PASSWORD: /run/secrets/redis_password

# 从文件中读取
secrets:
redis_password:
file: ./redis_password

在 Docker Swarm 中创建 “redis_password” 密钥

1
echo "root" > redis_password

启动

1
docker-compose up

docker stack 启动

1
docker stack deploy redis_server -c docker-compose.yml

停止

当使用 docker stop 命令停止容器时,它只停止容器实例,但不会删除相关的 Docker Swarm 服务。 Docker Swarm 服务定义包含了容器部署的规则,包括要启动多少个容器实例、使用的镜像、环境变量等。

1
2
3
docker service ls
docker service rm db
docker service rm redis

清洁

删除所有处于停止状态并且不再使用的容器

1
docker container prune