使用 mysql
1. 拉取镜像
docker pull mysql:8.0
2. 创建卷
docker volume create mysql_data
3. 运行容器
docker run --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 3306:3306 -v mysql-data:/var/lib/mysql --restart always mysql:8.0
# 或者
docker run --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d --network my-network -p 3306:3306 -v mysql-data:/var/lib/mysql --restart always mysql:8.0
解释说明:
--name mysql
:指定容器名称为 mysql-e MYSQL_ROOT_PASSWORD=my-secret-pw
:设置 root 用户的密码为 my-secret-pw-d
:后台运行容器-p 3306:3306
:将容器的 3306 端口映射到主机的 3306 端口-v mysql-data:/var/lib/mysql
:将主机上的 mysql-data 卷挂载到容器的 /var/lib/mysql 目录,用于持久化存储数据--restart always
:设置容器在启动时自动重启mysql:8.0
:指定使用的镜像为 mysql:8.0--network my-network
:指定容器使用的网络为 my-network- 如果需要使用网络,需要先创建网络,例如:
docker network create my-network
- 这样容器就可以通过容器名称进行通信了
例如:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d --network my-network -p 3306:3306 -v mysql-data:/var/lib/mysql --restart always mysql:8.0 docker run --name my-app -d --network my-network my-app:latest
在 my-app 容器里面,就可以通过 mysql(容器的名称) 来连接 mysql 数据库了 代码示例:
import mysql.connector mydb = mysql.connector.connect( host="mysql", # 容器名称 user="root", password="my-secret-pw" ) mycursor = mydb.cursor() mycursor.execute("SELECT DATABASE()") myresult = mycursor.fetchone() print(myresult)
4. 碰到的问题
MySQL 服务器停止是因为收到了来自 root 用户的关闭命令。日志中有这样的记录:
2024-10-24T01:15:08.562888Z 128 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.39).
这意味着有具有 root 权限的人执行了停止 MySQL 服务器的命令。如果这不是你的本意,建议检查系统的命令历史记录或可能发出该命令的脚本。
- 目前看了篇文章,都不行,所以直接当数据库关闭后就自动启动,把数据存在卷里,下次启动的时候,卷里的数据还在,所以数据不会丢失。