使用docker安装mysql需要注意的是一定要挂载数据卷,通常情况下,并不建议在开发或者生产等环境中使用docker安装mysql。
[root@localhost docker]# docker search mysql

[root@localhost docker]# docker pull mysql
注意:
(1)在不指定版本号的情况下,默认拉取的是最新版本的mysql,即latest,如需要下载特定版本的mysql,可以使用如下方式:
docker pull mysql:5.7 #指定下载5.7版本的mysql
docker pull mysql:8.0 #指定下载8.0版本的mysql

(2)如果下载的速度比较慢,可以通过docker info指令查看当前docker镜像源地址,建议使用阿里云加速器,下载速度比较快。
[root@localhost docker]# docker images

通过以上指令,可以看出我们已经将mysql的镜像文件成功拉取下来,接下来就开始运行mysql容器。
- [root@localhost docker]# docker run --name mysql -p 13306:3306 --restart=always --privileged=true \
- -v /usr/local/mysql/log:/var/log/mysql \
- -v /usr/local/mysql/data:/var/lib/mysql \
- -v /usr/local/mysql/conf:/etc/mysql \
- -v /etc/localtime:/etc/localtime:ro \
- -e MYSQL_ROOT_PASSWORD=root
- -d mysql:8.0
| 命令 | 功能 |
|---|---|
| --name mysql | 创建的容器名称 |
| -p 13306:3306 | 指定宿主机端口与容器端口映射关系 |
| --restart=always | 总是跟随docker启动 |
| --privileged=true: | 获取宿主机root权限 |
| -v /home/usr/local/mysql/log:/var/log/mysql | 映射日志目录,宿主机:容器 |
| -v /usr/local/mysql/data:/var/lib/mysql | 映射数据目录,宿主机:容器 |
| -v /usr/local/mysql/conf:/etc/mysql | 映射配置目录,宿主机:容器 |
| -v /etc/localtime:/etc/localtime:ro | 让容器的时钟与宿主机时钟同步,避免时区的问题 ro是read only的意思,就是只读 |
| -e MYSQL_ROOT_PASSWORD=root | 指定mysql的root用户的密码为root |
| -d mysql:latest | 后台运行mysql容器,版本是8.0 |
初次执行本条命令时,mysql容器可能会启动失败,失败原因在于此时容器内部可能尚未配置mysql相关文件的存放位置,此时通过docker ps查看容器运行状态,就会发现mysql容器一直在restart状态,如下图所示。

如果没有该问题,直接跳到第5步骤。
此时如果容器一直在重启状态,我们就需要在宿主机映射目录下创建mysql的配置文件my.cnf,这和我们通过常规方式安装mysql的步骤是一样的。执行步骤如下:
- # 进入Linux映射的mysql目录
- [root@localhost docker]# cd /home/usr/local/mysql
- [root@localhost mysql]# ll
- total 0
- drwxr-xr-x. 2 root root 6 Aug 4 23:44 conf
- drwxr-xr-x. 2 root root 6 Aug 4 23:44 data
- drwxr-xr-x. 2 root root 6 Aug 4 23:44 log
- # 进入配置文件目录
- [root@localhost mysql]# cd conf
- [root@localhost conf]# ll
- total 0
- # 编辑my.cnf文件
- [root@localhost conf]# vim my.cnf
my.cnf文件中内容如下:
- [client]
- default-character-set=utf8mb4
- [mysql]
- default-character-set=utf8mb4
- [mysqld]
- # 设置东八区时区
- default-time_zone = '+8:00'
- # 设置密码验证规则,default_authentication_plugin参数已被废弃
- # 修改为authentication_policy
- #default_authentication_plugin=mysql_native_password
- authentication_policy=mysql_native_password
- # 限制导入和导出的数据目录为空,不限制导入到该处的数据目录;
- # 指定目录,必须从该目录导入到处,且MySQL不会自动创建该目录;
- # 为NULL,禁止导入与导出功能
- #secure_file_priv=/var/lib/mysql
- secure_file_priv=
- init_connect='SET collation_connection = utf8mb4_general_ci'
- init_connect='SET NAMES utf8mb4'
- character-set-server=utf8mb4
- collation-server=utf8mb4_general_ci
- skip-character-set-client-handshake
- skip-name-resolve
my.cnf文件修改完成后,重启mysql容器。
[root@localhost docker]# docker restart mysql
[root@localhost docker]# docker ps
- # 设置mysql跟随docker自启动
- [root@localhost docker]# docker update mysql --restart=always
- # 重启mysql
- [root@localhost docker]# docker restart mysql
mysql远程访问未授权的情况下,通过外部机器去发起请求连接时,会提示连接拒绝,因为默认的root不具有远程连接的权限。

此时我们需要进入到mysql容器内部,开启远程连接的权限。
注意:
mysql -u root -p 输入完成后,此时不需要输入密码,直接回车就可以进入mysql工作台。
- [root@localhost conf]# docker exec -it mysql /bin/bash
- root@8dc685cb34ba:/# mysql -u root -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 8
- Server version: 8.0.27 MySQL Community Server - GPL
-
- Copyright (c) 2000, 2021, Oracle and/or its affiliates.
-
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
-
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
-
- mysql>
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | mysql |
- | performance_schema |
- | sys |
- +--------------------+
- 4 rows in set (0.01 sec)
-
- mysql> use mysql
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
-
- Database changed
- mysql> select host, user from user;
- +-----------+------------------+
- | host | user |
- +-----------+------------------+
- | localhost | mysql.infoschema |
- | localhost | mysql.session |
- | localhost | mysql.sys |
- | localhost | root |
- +-----------+------------------+
- 4 rows in set (0.00 sec)
通过查询结果,可以看出root用户只有localhost连接权限,接下来开始修改用户登录权限。
- mysql> update user set host = '%' where user = 'root';
- Query OK, 1 row affected (0.01 sec)
- Rows matched: 1 Changed: 1 Warnings: 0
-
- mysql> FLUSH PRIVILEGES;
- Query OK, 0 rows affected (0.01 sec)
-
- mysql> ALTER USER root@'%' IDENTIFIED WITH mysql_native_password BY 'root';
- Query OK, 0 rows affected (0.02 sec)
-
- mysql> FLUSH PRIVILEGES;
- Query OK, 0 rows affected (0.01 sec)

至此,docker安装mysql的过程已经全部完成。