docker安装mysql
- 一、 安装docker
- 二、docker安装mysql
- 三、设置MySQL远程访问
一、 安装docker
1、安装依赖环境,yum-utils
yum -y install yum-utils device-mapper-persistent-data lvm2
备注:
使用yum工具下载
yum是软件包管理工具
通过 执行 man yum
可以查看yum的帮助信息
2、设置镜像源,为yum源添加docker仓库位置
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装Docker
①:执行命令,提高软件安装速度(将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度)
yum makecache fast
②:安装docker(docker-ce 社区版 而ee是企业版)
yum install docker-ce docker-ce-cli containerd.io
③:指定docker镜像存放目录
vim /etc/docker/daemon.json
进行编辑(json格式){"graph": "/data/docker-data"}
④:启动,并设置为开机自启(因为你加了日志生成路径,可能会出错,不要慌!!可以查看后面解决方法)
1):刷新daemon.json文件
systemctl daemon-reload
2):启动Docker服务
systemctl start docker
sudo systemctl start docker
-- 重启
systemctl restart docker
3):设置开机自动启动
systemctl enable docker
4):测试
docker run hello-world
5:):查看docker 当前的状态
systemctl status docker
查看具体的错误信息
systemctl status docker -l
systemctl status docker.service# 查看docker的版本信息
docker version
# 查看docker是否启动
ps -ef | grep docker
# 设置docker开机自启动
systemctl enable docker
二、docker安装mysql
1、拉取MySQL镜像
在进行MySQL容器的部署之前,需要先拉取MySQL镜像。可以通过以下命令拉取官方提供的MySQL镜像:
$ docker pull mysql
2、创建MySQL容器
-
先创建一个简单的mysql容器实例
docker run -p 3306:3306 --name sample-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:xxx(docker拉取的mysql的镜像版本号)
-
复制里面的/etc/mysql文件夹
docker cp sample-mysql:/etc/mysql/. /mydata/mysql/conf
-
删除掉临时容器
docker rm -f sample-mysql
-
启动完整的容器命令
docker run \-p 3306:3306 \--name mysql \-e MYSQL_ROOT_PASSWORD=123456 \-v /mydata/mysql/log:/var/log/mysql \-v /mydata/mysql/data:/var/lib/mysql \-v /mydata/mysql/conf:/etc/mysql \--privileged=true \-d mysql:xxx(docker拉取的mysql的镜像版本号)默认端口启动完整命令:docker run -p 3306:3306 --name mysql --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=123456 -d mysql:latest自定义端口启动完整命令:docker run -p 13306:13306 --name mysql01 --restart=always --privileged=true \-v /mydata/mysql/log:/var/log/mysql \-v /mydata/mysql/data:/var/lib/mysql \-v /mydata/mysql/conf:/etc/mysql \-v /etc/localtime:/etc/localtime:ro \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
启动命令解释:
-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。
命令执行之后如下图:
三、设置MySQL远程访问
1.通过docker进入mysql并修改允许用户远程访问
docker exec -it mysql01 /bin/bash
出现报错Error response from daemon: Container 13a5e6e07143788f1fb62b8c344f7dd66a08ed2d2e3fb888ac74693331f7cc8a is restarting, wait until the container is running
查看日志,docker logs -f mysql01
报错信息如下:[ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files
此时我们需要修改mysql配置
2. 创建mysql配置文件:my.cnf
cd /mydata/mysql/conf
vi 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_0900_ai_ci'init_connect='SET NAMES utf8mb4'character-set-server=utf8mb4collation-server=utf8mb4_0900_ai_ciskip-character-set-client-handshakeskip-name-resolve
默认的鉴权方式,我们修改为mysql_native_password,不然的话连接会报错。因为在mysql8以后的默认加密方式改变了,由 mysql_native_password 改为了caching_sha2_password。这种加密凡是在客户端无法访问,客户端支持的是mysql_native_password 。
3. 重启容器
docker restart mysql01
4.设置docker启动时启动mysql
docker update mysql01 --restart=always
5.重启mysql
docker restart mysql01
10.授权远程访问
不进行授权直接登陆的话会报错的,如图:
6. 进入容器内部
docker exec -it mysql01 /bin/bash
7.登录mysql
提示拒绝登录报错如下:ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)
此时输入mysql 后直接回车,登录成功(此时MySQL未设置密码)
8.修改远程登录密码及允许的访问ip
查看用户表中root信息,执行如下命令
show databases;
use mysql;
select host, user, plugin, authentication_string, password_expired from user;
结果如下图:
执行如下命令,修改登陆的密码
ALTER USER root@'localhost' IDENTIFIED WITH mysql_native_password BY '123456'
再次查看后变成
再执行如下命令,修改登录root用户的IP范围,%为允许所有ip
update user set host='%' where user='root'; FLUSH PRIVILEGES;
到此如果MySQL容器是使用默认3306端口启动的,你就可以通过远程机器连接数据库了。
9. 自定义端口启动
但如果你修改了数据库默认端口,你还需要在/mydata/mysql/conf/下的my.cnf配置文件修改下默认端口
增加port=xxx 具体配置如下图:
10.修改完后重启容器
docker restart mysql01
如果此时你还无法远程连接,那检查一下云服务的安全规则,比如我使用的是阿里的云服务器,需要检查 网络与安全-安全组,增加入方向的规则,授权对象为远程访问的机器所在网络的出口ip,如下图:
备注:
搜索仓库镜像:docker search 镜像名
拉取镜像:docker pull 镜像名
查看正在运行的容器:docker ps
查看所有容器:docker ps -a
删除容器:docker rm container_id
查看镜像:docker images
删除镜像:docker rmi image_id
启动(停止的)容器:docker start 容器ID
停止容器:docker stop 容器ID
删除容器:docker rm 容器ID
重启容器:docker restart 容器ID
启动(新)容器:docker run -it ubuntu /bin/bash
进入容器:docker attach 容器ID或docker exec -it 容器ID /bin/bash,推荐使用后者。
启动docker服务
systemctl start docker
关闭docker
systemctl stop docker
重启docker
systemctl restart docker
docker设置随服务启动而自启动
systemctl enable docker.service
查看docker 运行状态
systemctl status docker #如果是在运行中 输入命令后 会看到绿色的active
docker logs -f mysql 查看容器日志