# Docker MySQL

MySQL 的 Docker 镜像在 dockerhub 上的地址:https://hub.docker.com/_/mysql (opens new window)

当前(2021-04-02)latest8.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 打成一个新的镜像。