mysql-tutorial

Docker 安装 MySQL

通过 Docker 搭建 MySQL 数据库环境,同时能同时启动多个 MySQL 版本。在安装前,最好上 docker 官网上看一下 MySQL 的版本,更具具体需求版本安装 MySQL,假设你已经搭建好 Docker 环境下面介绍如何创建一个 MySQL 服务器实例。

快速启动一个 MySQL 服务器实例

下面,我们通过通过 docker 镜像,或者 MySQL 官方镜像,进行快速启动一个实例。

# Docker 官方镜像
$ docker image pull library/mysql:8.0.18
# MySQL 官方镜像
$ docker image pull mysql/mysql-server:8.0.18

上面命令中 docker image pull 是抓取 image 镜像的命令。library/mysql:8.0.18 是指定镜像仓库的位置和相对应的 tag 版本。由于 Docker 官方提供的 image 文件,都放在 library 组里面,所以它的是默认组,可以省略。因此,上面的 Docker 命令可以写成下面这样。

# Docker 官方镜像拉取,简写
$ docker image pull mysql:8.0.18

拉取镜像成功以后,就可以在本机看到这个 image 文件了。

$ docker image ls

现在,运行这个 image 文件。

# Docker 官方镜像
$ docker run --name mysqlname \
  -p 3308:3306 \
  -e MYSQL_ROOT_PASSWORD=my123456 \
  -v /etc/localtime:/etc/localtime:ro \
  --rm \
  -d mysql:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# MySQL 官方镜像
$ docker run -d --name mysqlname mysql/mysql-server:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_col

上面命令的各个参数含义如下:

可以通过 容器id/容器名称 查看 MySQL 日志

$ docker logs mysqlname

通过命令行访问 MySQL 容器

可以通过[容器名字]或者[容器 ID]进入 MySQL 容器

$ docker exec -it mysqlname bash

使用 MySQL 自定义配置文件

MySQL 的默认配置可以在 /etc/mysql/my.cnf 中找到,该目录可以包含附加目录,例如 /etc/mysql/conf.d/etc/mysql/mysql.conf.d。 请检查 MySQL 镜像本身中的相关文件和目录,以获取更多详细信息。

如果 /my/custom/config-file.cnf 是自定义配置文件的路径和名称,则可以像这样启动 MySQL 容器(请注意,此命令仅使用自定义配置文件的目录路径):

$ docker run --name mysqlname \
  --rm \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=my123456 \
  -v /my/custom:/etc/mysql/conf.d \
  -v /etc/localtime:/etc/localtime:ro \
  -d mysql:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

上面命令将启动一个新的容器 mysqlname,其中 MySQL 实例使用 /etc/mysql/my.cnf/etc/mysql/conf.d/config-file.cnf 中的组合启动设置,其中后者的设置优先。

配置修改,可以通过【容器名字】或者【容器 ID】来重启 MySQL,可让配置生效。

docker restart mysqlname

使用 stack 部署 MySQL

MySQL 的实例 stack.yml,下面实例使用 root/example 作为 用户/密码 凭据,default_authentication_plugin=mysql_native_password 这个是因 MySQL 8 的安全机制升级而需要修改的配置,不配置的话将无法登录管理:

version: '3.1'
services:

  db:
    image: mysql:8.0.18
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
      - "3306:3306"
    volumes:
      # - /my/custom:/etc/mysql/conf.d
      - /etc/localtime:/etc/localtime:ro
    environment:
      MYSQL_ROOT_PASSWORD: example

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

通过下面命令运行 stack,等待它初始化,然后可以访问 http://swarm-ip:8080http://localhost:8080, 或者 http://host-ip:8080,web 界面来管理 MySQL,有 web 管理工具是因为,在这个 stack 中我们除了添加了 dbmysql 容器,还添加了个添加了个额外的 adminer 容器,对外暴露了 8080 端口。

$ docker stack deploy -c stack.yml mysql
# 或者使用 docker-compose,方便开发模式下调试。
$ docker-compose -f stack.yml up

参考资料