使用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的过程已经全部完成。