Docker安装Mysql


Docker安装Mysql

  前言
虽然 docker 安装 mysql 不是一个很好的方案,但是为了个人使用方便,使用 docker 安装 mysql 还是没什么问题的。

  本文为了方便,我们直接通过yum方式安装。所以,我们在安装之前需要电脑可以联网,不然我们这种方式是安装不了的。

  当然,你也可以自行下载mysql镜像,然后再通过 docker 安装,不过这不在本文的讨论范围

一、拉取镜像

1
2
3
4
5
6
7
8
9
10
拉取镜像
docker pull mysql

或者
docker pull mysql:latest

以上两个命令是一致的,默认拉取的就是 latest 版本的

我们还可以用下面的命令来查看可用版本:
docker search mysql

二、查看镜像

  使用以下命令来查看是否已安装了 mysql镜像

1
docker images

三、运行镜像

1
2
3
4
5
6
docker run -p 3306:3306 --name mysql --restart=always --privileged=true \
-v /www/data/server/mysql/log:/var/log/mysql \
-v /www/data/server/mysql/data:/var/lib/mysql \
-v /www/data/server/mysql/conf:/etc/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.36

  命令含义:

1
2
3
4
5
6
7
8
9
10
 -p 3306:3306:指定宿主机端口与容器端口映射关系
--name mysql:创建的容器名称
--restart=always:总是跟随docker启动
--privileged=true:获取宿主机root权限
-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:让容器的时钟与宿主机时钟同步,避免时区的问题,ro是read only的意思,就是只读。
-e MYSQL_ROOT_PASSWORD=123456:指定mysql环境变量,root用户的密码为123456
-d mysql:latest:后台运行mysql容器,版本是latest

四、查看正在运行的容器

1
2
3
4
查看正在运行的容器
docker ps
查看所有的docker容器
docker ps -a

  这个时候如果显示的是up状态,那就是启动成功了。如果是restarting,说明是有问题的。我们可以查看日志:docker logs -f mysql

   可能会发现:

  ~Failed to access directory for –secure-file-priv. Please make sure that dir`

   此时如果我们执行第五步也会报错:

  Error response from daemon: Container xxx is restarting, wait until the cont。。。

  此时我们需要执行第六步。

五、查看容器内部

1
docker exec -it mysql /bin/bash

六、修改mysql配置

  映射的my.cnf

  新增 my.cnf 填写一下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[client]

default-character-set=utf8mb4

[mysql]

default-character-set=utf8mb4

[mysqld]

init_connect=' SET collation_connection = utf8mb4_unicode_ci '
init_connect=' SET NAMES utf8mb4 '
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

  将my.cnf存放到 映射配置目录 宿主机”/www/data/server/mysql/conf”中,权限改为777

七、重启mysql服务,使其配置生效

1
docker restart mysql

八、设置docker启动时启动mysql

1
docker update mysql --restart=always

九、重启mysql

1
docker restart mysql

十、授权远程访问

  不进行授权直接登陆的话会报错的如图:

  image

10.1 进入容器内部
1
docker exec -it mysql /bin/bash
10.2 登陆mysql
1
mysql -u root -p

  此时我们使用mysql客户端连接服务器是失败的,因为默认的root不具有远程连接的权限。

  执行命令(root改为自己的密码)

1
2
3
4
// %:表示从任何主机连接到mysql服务器
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
//刷新
flush privileges;

十一、无法访问的其他处理方式

  检查端口是否开启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 查看防火墙开放的端口信息
firewall-cmd --list-ports

# 查看防火墙状态
systemctl status firewalld

# 开启防火墙
systemctl start firewalld


# 开启3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 刷新
firewall-cmd --reload

--zone : 作用域
--add-port=9044/tcp : 添加端口,格式为:端口/通讯协议
--permanent : 永久生效,没有此参数重启后失效

#重启防火墙(输入命令后防火墙先关闭再启用)
systemctl restart firewalld

#暂时关闭防火墙
systemctl stop firewalld

#启用防火墙(关闭状态使用)
systemctl start firewalld
#永久禁用防火墙(设置开机不自启动)
systemctl disable firewalld
#开机自动启用防火墙
systemctl enable firewalld

  ‍

-------------本文结束感谢您的阅读-------------