# Docker MySQL
MySQL 的 Docker 镜像在 dockerhub 上的地址:https://hub.docker.com/_/mysql (opens new window)
当前(2021-04-02)的 latest 和 8.0.23 是同一个镜像 。另外,5.7 版本和 5.7.33 是同一个镜像。
# 1. 安装及测试
- 搜索、拉取镜像:
# 查询中央仓库
docker search -f is-official=true mysql
# 从中央仓库下载
docker pull mysql:8.0.16
# 或,直接导入已有的镜像文件
# docker load -i mysql-8.0.16.tar
# 查看本地镜像
docker images
# 会出现类似如下内容:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# mysql 8.0.16 de764ad211de 2 years ago 443MB
- 创建、运行容器:
- 验证安装成功
# 查看容器的运行信息
docker ps
# 进入 mysql-test 容器
docker exec -it mysql-test /bin/bash
# 执行 mysql-cli 的连接命令
mysql -uroot -p123456
- 后续可选操作
对 root 的远程连接授权
容器逻辑上等价于另一台电脑。而在 mysql 中,root 用户默认只能从 MySQL Server 所在的电脑上登陆,无法从 “另一台” 电脑通过远程连接的方式登陆。
当然,这种 “默认” 行为是可以配置的。
按上述命令,从容器内部连接到 MySQL Server,执行如下 SQL 语句:
> use mysql;
> select user, host from user;
> GRANT ALL ON *.* TO 'root'@'%';
> flush privileges;
# 2. 配置与挂载
MySQL Server 的 “数据存储目录” 容器中的
/var/lib/mysql
MySQL Server 的配置文件是容器中
/etc/mysql/my.cnf
/etc/mysql/conf.d
关于 MySQL 的配置文件和配置项
MySQL Server 启动时会去加载 /etc/mysql
下的 my.cnf 配置文件,这个配置文件中有一部分配置。一般情况下我们即不会去动这部分内容,也不会在这个配置文件中追加内容 。
在 my.cnf 配置文件的最后,它又 include 了同一级目录下的 conf.d 目录,即,让 MySQL Server 再去加载 conf.d 目录下的所有的 .cnf 配置文件。
在 docker 中,默认情况下这个目录下有 2 个配置文件 docker.cnf 和 mysql.cnf(其中,mysql.cnf 中除了注释基本啥都没有)。
- 示例
# 删除已存在的同名容器
docker rm -f mysql-3306
# 创建并运行容器,docker 会自动创建 ~/docker/3306/data 目录
docker run \
-d \
--name mysql-3306 \
-v ~/docker/3306/data:/var/lib/mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.16
# 3. docker-compse 方式启动
version: '3'
services:
mysql-3306:
image: mysql:8.0.16
network_mode: "bridge" # 默认值。常见的还有 host
container_name: mysql-3306
mem_limit: 512m # 限定 docker 容器内存大小
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- /etc/localtime:/etc/localtime:ro # 时区
- ~/docker/3306/data:/var/lib/mysql # 数据
ports: # network_mode: "host" 无需端口映射
- "3306:3306"
启动命令:docker-compose up -d mysql-3306
# 4. 初始化数据库
mysql 的 docker 镜像有一个功能:它在第一次创建并启动容器(注意,重启不算)时,会到容器内的 /docker-entrypoint-initdb.d
目录下查看有没有 sql 脚本( .sql 文件 )。如果有,就执行 sql 脚本。因此,你可以通过这个功能来完成数据库的创建等初始化工作。
你可以在某个目录下创建 .sql 脚本(例如 init.sql),并在其中写上建库、建表等 SQL 语句,然后将这个目录映射成 /docker-entrypoint-initdb.d
。
更进一步,你可以使用 Dockerfile 将你的建库建表脚本和 docker-mysql 打成一个新的镜像。