docker安装mysql8.0并配置ssl
时间: 2025-04-02 09:27:03 浏览: 47
### Docker 中安装 MySQL 8.0 并配置 SSL 连接
#### 安装与基础配置
为了在 Docker 中安装 MySQL 8.0,可以通过以下命令完成基本设置:
```bash
docker run -p 3306:3306 \
--name mysql-ssl \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0
```
上述命令中 `-e MYSQL_ROOT_PASSWORD=root` 设置了初始 root 密码为 `root`[^3]。
#### 配置 SSL 参数
要在 MySQL 上启用 SSL 支持,需创建自签名证书并将这些证书挂载至容器内的指定路径。以下是具体操作步骤:
1. **生成 SSL 证书**
使用 OpenSSL 工具生成 CA 和服务器/客户端所需的密钥及证书文件:
```bash
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
```
2. **将证书挂载到容器**
将生成的证书和私钥复制到本地目录 `/mydata/mysql/certs` 下,并通过卷挂载的方式引入容器内对应的路径 `/etc/mysql/certs`:
```bash
mkdir -p /mydata/mysql/certs && cp *.pem /mydata/mysql/certs/
docker stop mysql-ssl
docker rm mysql-ssl
docker run -p 3306:3306 \
--name mysql-ssl \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-v /mydata/mysql/certs:/etc/mysql/certs \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0
```
3. **修改 my.cnf 文件支持 SSL**
编辑 MySQL 的配置文件 `/mydata/mysql/conf/my.cnf` 添加如下内容以激活 SSL 功能:
```ini
[mysqld]
ssl-ca=/etc/mysql/certs/ca.pem
ssl-cert=/etc/mysql/certs/server-cert.pem
ssl-key=/etc/mysql/certs/server-key.pem
require_secure_transport=ON
```
此处设置了强制使用安全传输协议 (require_secure_transport),确保只有启用了 SSL/TLS 加密的连接才被允许访问数据库服务。
4. **重启容器应用更改**
执行以下指令重新加载新的配置项并验证其状态是否正常工作:
```bash
docker restart mysql-ssl
docker logs mysql-ssl | grep "SSL"
```
如果日志显示类似于 `[Note] mysqld: ready for connections.` 同时伴随有关于 SSL 初始化成功的提示,则表明当前实例已成功开启基于 TLS 的保护机制。
#### 测试 SSL 连接
最后一步是从外部尝试建立带有认证选项的安全会话来确认整个流程无误。例如利用 Python 脚本实现这一目标:
```python
import pymysql.ssl_adapters as ssllibs
conn = pymysql.connect(
host='localhost',
user='root',
password='root',
port=3306,
cursorclass=pymysql.cursors.DictCursor,
ssl={
'ca': '/path/to/client-certs/ca.pem',
'cert': '/path/to/client-certs/client-cert.pem',
'key': '/path/to/client-certs/client-key.pem'
}
)
print(conn.status())
```
此脚本中的 `ssl` 字典指定了三个必需字段——分别是根证书 (`ca`)、客户机公钥证书(`cert`)以及匹配它的私钥文件位置(`key`)。当程序能够顺利打印出连接对象的状态信息而未抛异常时即代表测试顺利完成。
---
阅读全文
相关推荐



















