如何使用docker自动安全地部署新的mySQL实例?

如何使用docker自动安全地部署新的mySQL实例?

我希望能够运行一个脚本,以尽可能少的手动步骤将我的应用程序部署到新服务器,而不向全世界公开数据库密码。

该应用程序由一个 Web 应用程序(nginx + 自定义内容)和一个 mysql 数据库组成。我知道如何自动部署它,但不安全:只需将 root 密码存储在 docker-compose 中以及 Web 应用程序配置中的某个位置。显然,这根本不安全。

我知道如何安全地部署它:当前mySQL 文档建议部署默认的 mySQL 映像,grep 生成的 root 密码,然后在容器内运行 mysql 以将此密码更改为“您选择的密码”。然后,我想我必须将这个“我选择的密码”放入 Web 应用程序配置中,这样我的 Web 应用程序才能连接到数据库。

我不知道的是,自动且安全地部署 mySQL 的推荐方法是什么。我可以在部署期间生成“我选择的密码”,但如果我无论如何都要将其放入配置中,那么为什么要费心使用 mySQL 一次性随机生成的密码呢?有人可以告诉我最佳实践吗?

答案1

请参阅官方指南撰写时的环境变量

您希望您docker-compose.yml致力于源代码控制,因此密码不应该在那里。根据官方dockerhub 上的 mysql 文档您需要提供的主要变量是MYSQL_ROOT_PASSWORD

事实上,他们的示例docker run通过-e标志为命令提供了这一点:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

这最终可能会出现在日志中,因此我将其.env与项目根目录中的其他配置变量一起放在一个文件中。

# .env
MYSQL_ROOT_PASSWORD=my-secret-pw

然后在撰写文件中引用此.env文件:

version: '3.1'
services:
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    env_file:
      - .env

您还可以将该行添加.env.gitignore项目内的文件中,以便不会意外提交机密。

然后再通过其他方式将文件部署.env到各个环境。当然一定要chmod 600 .env

相关内容