本文用一个WordPress服务与一个Mysql后端存储搭建一个博客系统,演示如何通过docker secret在WordPress与Mysql实例之间共享用户为Mysql设置的密码以及当Mysql密码改变后WordPress滚动升级。
参考地址:https://docs.docker.com/engine/swarm/secrets/
- 利用WordPress与Mysql搭建简单的博客系统
1.为Mysql创建secret
secret创建后其内容是不能更新的,只能删除掉旧的secret然后再重新创建,并且不能删除正在被使用的secret。如果secret需要变更的话,一般是在创建secret时加上版本号,变更的时候先创建一个新版本的secret,然后执行docker service update命令使服务使用新版本的secret,再释放掉旧版本的secret。
执行如下命令创建两个secret,命令执行后的标准输出并不是secret的内容,而是secret的ID:
openssl rand -base64 20 | docker secret create mysql_password -
openssl rand -base64 20 | docker secret create mysql_root_password -
2.创建用户自定义的网络
为WordPress与Mysql创建overlay网络专门用于两者之间的通信,创建的网络不需要具备连接外网的能力,连接在这个网络上的服务不会向外部暴露任何端口。执行如下指令:
docker network create -d overlay mysql_private
3.创建Mysql服务
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
4.创建wordpress服务
docker service create \
--name wordpress \
--replicas 1 \
--network mysql_private \
--publish published=30000,target=80 \
--mount type=volume,source=wpdata,destination=/var/www/html \
--secret source=mysql_password,target=wp_db_password,mode=0400 \
-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
5.在浏览器中访问192.168.56.103:30000
IP地址可以是集群中任何一个node的IP地址,如下图:
博客系统创建成功。
- 滚动升级密码
Mysql将用户名与密码维护在内部的一个表中,修改密码的话有两个条件。第一个是Mysql能同时读到旧的密码与新的密码,旧的密码用于登录,新的密码用于修改。第二个就是Mysql需要执行一条指令来完成修改密码的动作,这个指令是不会自动执行的。需要手动登录到Mysql容器上执行。为wordpress用户修改mysql密码,步骤如下:
1.生成新的secret,名称中加入了版本后v2
openssl rand -base64 20 | docker secret create mysql_password_v2 -
2.更新Mysql服务,使它能同时访问新旧两个版本的密码
docker service update \
--secret-rm mysql_password mysql
docker service update \
--secret-add source=mysql_password,target=old_mysql_password \
--secret-add source=mysql_password_v2,target=mysql_password \
mysql
此时Mysql服务能同时访问新旧两个版本的密码,这两个版本的密码以内存文件的形式分别挂在/run/secrets/old_mysql_password、/run/secrets/mysql_password两个目录之下.
3.在mydql容器中执行修改密码的指令
docker container exec <CONTAINER_ID> \
bash -c 'mysqladmin --user=wordpress --password="$(< /run/secrets/old_mysql_password)" password "$(< /run/secrets/mysql_password)"'
4.更新wordpress服务,使新的密码生效
docker service update \
--secret-rm mysql_password \
--secret-add source=mysql_password_v2,target=wp_db_password,mode=0400 \
wordpress
5.从Mysql回收旧密码并从系统中删除
docker service update \
--secret-rm mysql_password \
mysql
docker secret rm mysql_password