1、什么secret
- 用户名密码
- SSH Key
- TLS认证
- 任何不想让别人看到的数据
2、Docker Swarm Mode Architecture
secret在docker中是如何管理的呢?重温一下这个图:
docker swarm里面有2个角色Manager 和 Worker,Worker这个节点有个内置的分布式存储,它是基于raft协议,强一致性的,唯一性,可以让manager下面的节点相互之前可以完成同步,manager这个在生产环境下强烈建议是2个manager,如果是一个是单点故障了,Internal分布式存储的它是加密之后放入硬盘的,天然的加密环境,manager和worker节点是通过TLS进行加密的。他们的key都是存在内置节点的分布式数据库节点上,通过加密以后存储在硬盘上的,我想存一些secret可以直接存在manager内置的分布式节点上边,比如一个数据库需要一个密码,我可以给它一个分布式数据库读取的权限。能够访问到这个secret就可以了。
3、secret management
- 存在swarm manager 节点raft database里面
- secret 可以assign给一个service,这个service就能看到这个secret
- 在container内部secret看起来像文件,但是实际是在内存中
创建方式
- 通过文件创建
- 通过管道的方式复制
常用命令
#通过文件创建
#编辑password文件,按照你自己的要求写入密码保存
vi password
#通过docker secret create 名称 文件名
docker secret create my-pw password
#通过管道的方式复制
echo 'admin123' | docker secret create my-pw2 -
# 查看
docker secret ls
# 删除secret
docker secret rm my-pw2
#指定secret的名称
docker service create --name client --secret my-pw busybox sh -c "while true;do sleep 36000;done"
docker service ls
docker service ps client
docker container ls
#进入这个container中
docker exec -it containerID sh
#进入run/secrets目录
cd /run/secets/
cat my-pw
4、secret 的 操作
创建
从文件内创建
vim password
#password 内容
123456a
创建 secret:
docker secret create my-pass password
删除 password 文件:
rm -rf ./password
从命令行输入创建:
echo '123456a' | docker secret create my-pass2 -
查看:
docker secret ls
删除:
docker secret rm my-pass2
secret 的使用
创建 service 的时候指定 secret
docker service create --name client --secret my-pass busybox sh -c "while true; do sleep 3600; done"
查看 service 服务器 位置
docker service ps client
在指定服务器 查看 container id
docker ps
进入容器
docker exec -it [container_id] sh
查看指定的密码
cat /run/secrets/my-pass
mysql 案例
创建 mysql service 指定文件根目录 密码文件为 /run/secrets/my-pass
docker service create --name db --secret my-pass -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/my-pass mysql:5.7.27
查看所在服务器位置
docker service ps db
在指定服务器 查看容器id 并进入
docker ps
docker exec -it [container_id] sh
查看docker secret 密码 并 进入mysql
cat /run/secrets/my-pass
mysql -uroot -p[my-pass]
或简写为:
mysql -uroot -p$(cat /run/secrets/my-pass)
在 docker stack 中的使用
编辑 docker-compose.yml
在各个 service 下添加:secrets 参数 和 environment 参数
#例如:
services:
web:
image: wordpress
secrets:
- my-pass
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/my-pass
...
eg: docker-compose.yml,secrets是直接从文件中读取,这种方式是创建和使用一起做
version: '3.1'
services:
db:
image: mysql:5.7.27
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_root_password
- db_password
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8888:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: password.txt
db_root_password:
file: password.txt
volumes:
db_data:
eg: docker-compose.yml,这种方式是password secrets先创建好,然后在使用
version: '3.1'
services:
db:
image: mysql:5.7.27
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD_FILE: /run/secrets/db_password
secrets:
- my-pw
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8888:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
- my-pw
volumes:
db_data:
根据上述的 docker-compose.yml 创建 service
docker stack deploy wordpress -c=docker-compose.yml
查看 mysql 所在的服务器
docker service ls
docker service [container_name | container id]
查看所在服务器的 容器 id
docker ps
进入 mysql 容器
docker exec -it [container_id] /bin/bash
mysql -uroot -p[your setting password]
能登陆即可
或能访问 192.168.205.10 也行
参考:
https://blog.csdn.net/huangjun0210/article/details/86505002
https://www.cnblogs.com/zonehoo/p/11419823.html