部署环境仍然是swarm集群环境
部署一个 WordPress 应用,WordPress 是流行的开源博客系统。
将创建一个 MySQL service,将密码保存到 secret 中。我们还会创建一个 WordPress service,它将使用 secret 连接 MySQL。这个例子将展示如何用 secret 避免在 image 中存放敏感信息,或者在命令行中直接传递敏感数据。
下载镜像
如果使用label标签指定主机运行,则只需在指定主机下载即可,如果不设置标签则在所有swarm集群主机下载,推荐使用私库
[root@swarm-manager ~]# docker pull mysql
[root@swarm-manager ~]# docker pull wordpress
放行外部访问端口
firewall-cmd --add-port=7946/tcp
firewall-cmd --add-port=4789/udp
创建secret
swarm-manager
创建一个随机密钥
[root@swarm-manager ~]# openssl rand -base64 20 | docker secret create mysql_root_password -
3ynn8ta27iizvobo6fzirzto3
使用docker secret创建一个随机20位密码,使用base64进行编码加密
还有一种生成密钥的方法是从文件读取,文件中的内容已经是被加密了
[root@swarm-manager ~]# openssl rand -base64 20 > password
[root@swarm-manager ~]# cat password
2LjmxVWohzhm7C9W4vfZhxLNtgQ=
一般情况下,应用不会直接用 root 密码访问 MySQL。我们会创建一个单独的用户 workpress,密码存放到 secret mysql_password中。
[root@swarm-manager ~]# openssl rand -base64 20 | docker secret create mysql_password -
k3itgfoaju7of2kdo87njkhia
现在已经有两个文件mysql_root_password
和mysql_password
一个用于root用户登录mysql,一个用于wordpress用户登录mysql
创建overlay网络
MySQL 通过 overlay 网络 mysql_net 与 WordPress 通信,不需要将 MySQL service 暴露给外部网络和其他容器。
[root@swarm-manager ~]# docker network create -d overlay mysql_net
rm2k5nnxrroabbx5pyr720qmc
创建mysql service
[root@swarm-manager ~]# docker service create --name mysql --network mysql_net \
--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 --default-authentication-plugin=mysql_native_password
MYSQL_DATABASE 指明创建数据库 wordpress。
MYSQL_USER 和 MYSQL_PASSWORD_FILE 指明创建数据库用户 workpress,密码从 secret mysql_password 中读取。
有关 mysql 镜像环境变量更详细的使用方法可参考 https://hub.docker.com/_/mysql/
创建wordpress service
[root@swarm-manager ~]# docker service create --name wordpress --network mysql_net \
--publish 30000:80 --secret source=mysql_password,target=wp_db_password \
-e WORDPRESS_DB_HOST="mysql:3306" -e WORDPRESS_DB_NAME="wordpress" \
-e WORDPRESS_DB_USER="wordpress" \
-e WORDPRESS_DB_PASSWORD_FILE="/run/secrets/wp_db_password" wordpress:latest
WORDPRESS_DB_HOST 指明 MySQL service 地址 mysql:3306,这里用到了 DNS。
WORDPRESS_DB_NAME 指明 WordPress 的数据库为 wordpress,与前面 MYSQL_DATABASE 一致。
WORDPRESS_DB_USER 指明连接 WordPress 数据库的用户为 wordpress,与前面 MYSQL_USER 一致。
WORDPRESS_DB_PASSWORD_FILE 指明数据库的用户 wordpress 的密码,从 secret mysql_password 中获取。
有关 wordpress 镜像环境变量更详细的使用方法可参考 https://hub.docker.com/_/wordpress/
放行wordpress端口
为保险起见,三台都放行
firewall-cmd --add-port=30000/tcp
验证访问
访问192.168.1.11:30000