Docker下安装MySQL:5.7
Docker下安装并使用MySQL有两种方式,第一使用远程仓库镜像,第二自定义镜像。
【1】使用Hub镜像安装MySQL
从Hub镜像安装软件常规步骤
搜索镜像、拉取镜像、查看镜像、启动镜像、停止容器与移除容器。
① 搜索MySQL镜像
docker search mysql
- 1
② 从docker hub上(阿里云加速器)拉取mysql镜像到本地
如下所示,拉去MySQL5.7:
docker pull mysql:5.7
- 1
创建mysql5.7 volume
docker volume create mysql_data # 创建volume
docker volume create mysql_log # 创建volume
docker volume inpect mysql_data # 查看
③ 创建容器实例并运行
命令如下:
docker run -p 3306:3306 --name mysql -v mysql_logs:/var/log/mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
命令解释说明:
-p 3306:3306
:将主机的3306端口映射到docker容器的3306端口。--name mysql
:运行服务名字-v mysql_logs:/var/log/mysql
:mysql_logs容器volume 挂载到容器的 /logs。-v mysql_data:/var/lib/mysql
:mysql_data容器volume 挂载到容器的 /var/lib/mysql-e MYSQL_ROOT_PASSWORD=123456
:初始化 root 用户的密码。-d mysql:5.7
: 后台程序运行mysql5.7--character-set-server=utf8mb4
:设置字符集--collation-server=utf8mb4_unicode_ci
:设置校对集
然后在/mydocker/mysql/conf编辑你的数据库配置文件即可,如下所示:
[root@localhost conf]# pwd
/mydocker/mysql/conf
[root@localhost conf]# ll
total 4
-rw-r--r--. 1 root root 1379 Feb 20 07:40 my.cnf
宿主机上的my.cnf将会自动同步到容器内/etc/mysql/conf.d
路径下,需要注意的是my.cnf权限不能是777,否则会因为权限过高mysql忽略掉!
可以查看容器日志:
docker logs -f -t --tail 100 529a4d9afd8e
进入容器内部查看:
docker exec -it 529a4d9afd8e /bin/bash
退出容器两种方式:
exit–容器停止退出
crtl+p+q—容器不停止退出
本地window10用Navicat连接docker运行的mysql:
宿主机上备份数据库:
docker exec 529a4d9afd8e sh -c ' exec mysqldump --all-databases -uroot -p"123456" ' > /mydocker/mysql/all-databases.sql
- 1
④ 容器其他操作
停止容器
docker stop 容器id
强制停止容器
docker kill 容器ID
删除容器
docker rm [-f] 容器ID
删除所有容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
【2】 mysql5.7容器内部情况
① 配置文件
配置文件路径在/etc/mysql下
root@2c1ae7a2f3cd:/etc/mysql# ls -l
total 16
drwxr-xr-x. 2 root root 4096 Feb 20 15:02 conf.d
lrwxrwxrwx. 1 root root 24 Feb 1 18:06 my.cnf -> /etc/alternatives/my.cnf
-rw-r--r--. 1 root root 839 Jul 9 2016 my.cnf.fallback
-rw-r--r--. 1 root root 1215 Dec 18 13:15 mysql.cnf
drwxr-xr-x. 2 root root 4096 Feb 1 18:06 mysql.conf.d
my.cnf文件内容如下(引入了conf.d 、mysql.conf.d路径下的文件):
my.cnf.fallback文件内容如下(引入了conf.d路径下的文件):
mysql.cnf文件内容如下(引入了conf.d 、mysql.conf.d路径下的文件):
如下所示/etc/mysql/mysql.conf.d
下有个mysqld.cnf配置文件:
root@2c1ae7a2f3cd:/etc/mysql/mysql.conf.d# ls -l
total 4
-rw-r--r--. 1 root root 1610 Feb 1 18:06 mysqld.cnf
mysqld.cnf配置文件内容如下:
root@2c1ae7a2f3cd:/etc/mysql/mysql.conf.d# cat mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
② 运行进程文件
在上面mysqld.conf中可以看到,mysql的进程文件在/var/run/mysqld路径下,如下所示:
root@2c1ae7a2f3cd:/var/run/mysqld# pwd
/var/run/mysqld
root@2c1ae7a2f3cd:/var/run/mysqld# ls -l
total 8
-rw-r-----. 1 mysql mysql 2 Feb 20 15:02 mysqld.pid
srwxrwxrwx. 1 mysql mysql 0 Feb 20 15:02 mysqld.sock
-rw-------. 1 mysql mysql 2 Feb 20 15:02 mysqld.sock.lock
③ 数据文件
在上面mysqld.conf中可以看到,mysql的数据文件在/var/lib/mysql路径下,如下所示:
root@2c1ae7a2f3cd:/var/run/lock# cd /var/lib/mysql
root@2c1ae7a2f3cd:/var/lib/mysql# ls -l
total 188476
-rw-r-----. 1 mysql mysql 56 Feb 20 15:02 auto.cnf
-rw-------. 1 mysql mysql 1680 Feb 20 15:02 ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 Feb 20 15:02 ca.pem
-rw-r--r--. 1 mysql mysql 1112 Feb 20 15:02 client-cert.pem
-rw-------. 1 mysql mysql 1680 Feb 20 15:02 client-key.pem
-rw-r-----. 1 mysql mysql 1346 Feb 20 15:02 ib_buffer_pool
-rw-r-----. 1 mysql mysql 50331648 Feb 20 15:02 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Feb 20 15:02 ib_logfile1
-rw-r-----. 1 mysql mysql 79691776 Feb 20 15:02 ibdata1
-rw-r-----. 1 mysql mysql 12582912 Feb 20 15:02 ibtmp1
drwxr-x---. 2 mysql mysql 4096 Feb 20 15:02 mysql
drwxr-x---. 2 mysql mysql 4096 Feb 20 15:02 performance_schema
-rw-------. 1 mysql mysql 1676 Feb 20 15:02 private_key.pem
-rw-r--r--. 1 mysql mysql 452 Feb 20 15:02 public_key.pem
-rw-r--r--. 1 mysql mysql 1112 Feb 20 15:02 server-cert.pem
-rw-------. 1 mysql mysql 1680 Feb 20 15:02 server-key.pem
drwxr-x---. 2 mysql mysql 12288 Feb 20 15:02 sys
【3】自定义MySQL镜像
如在实例化容器并启动的时候初始化数据库,可以通过自定义DockerFile实现。
在mysql5.7官方DockerFile中可以看到其执行了docker-entrypoint.sh
文件:
在官方脚本docker-entrypoint.sh中可以看到其执行了初始化路径下的一系列脚本文件:
编写自定义DockerFile如下:
FROM mysql:5.7
# 复制数据库初始化脚本my_initdb.sql到/docker-entrypoint-initdb.d文件夹下
COPY my_initdb.sql /docker-entrypoint-initdb.d/my_initdb.sql
my_initdb.sql实例如下:
drop database IF EXISTS `lvyou` ;
create database `lvyou` default character set utf8 collate utf8_general_ci;
use `lvyou`;
-- ----------------------------
-- Table structure for t_admin
-- ----------------------------
DROP TABLE IF EXISTS `t_admin`;
CREATE TABLE `t_admin` (
`userId` int(11) NOT NULL,
`userName` varchar(50) DEFAULT NULL,
`userPw` varchar(50) DEFAULT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of t_admin
-- ----------------------------
INSERT INTO `t_admin` VALUES ('1', 'admin', '123456');
目录结构如下所示:
[root@localhost ~]# cd /mydocker/mysql
[root@localhost mysql]# ll
-rw-r--r--. 1 root root 241 Feb 20 12:41 Dockerfile
-rw-r--r--. 1 root root 7260 Feb 20 13:05 my_initdb.sql
在/mydocker/mysql路径下执行命令创建镜像:
docker build -f Dockerfile -t mysql5.7v1 .
实例化容器并运行:
docker run -p 3306:3306 --name mysql5.7v1 -v /mydocker/mysql/conf:/etc/mysql/conf.d -v /mydocker/mysql/logs:/var/log/mysql -v /mydocker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql5.7v1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
查看日志可以看到执行了初始化脚本:
docker logs -f -t --tail 100 367090145c91
Navicat连接测试进行验证(可以看到正常初始化数据库lvyou):
查看其字符集:
查看宿主机/mydocker/mysql目录:
重启服务器,再次查看:
Navicat连接mysql进行验证:
说明自动从宿主机/mydocker/mysql/data
中拿到了数据!
Docker安装MySQL8
进入docker 有时要用: docker exec -it mysql8 bash
1. 拉取mysql镜像
docker pull mysql
docker volume create mysql_data # 创建volume
docker volume create mysql_log # 创建volume
docker volume inpect mysql_data # 查看
2. 运行容器
#!/bin/sh
docker run --restart=always -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 -v mysql_data:/var/lib/mysql
-v mysql_log:/var/log/mysql \
-v /etc/localtime:/etc/localtime:ro --name mysql8 mysql
rw是读写,如果指定为只读可以用:ro
docker run --restart=always -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/data/mysql/data:/var/lib/mysql:rw -v /home/data/mysql/log:/var/log/mysql:rw -v /home/data/mysql/config/my.cnf:/etc/mysql/my.cnf:rw -v /etc/localtime:/etc/localtime:ro --name mysql8 mysql
提前要在提定的位置(我的位置是:/home/data)创建以下文件夹或文件:
- mysql/data 是数据库文件存放的地方。必须要挂载到容器外,否则容器重启一切数据消失。
- mysql/log 是数据库主生的log。建议挂载到容器外。
- mysql/config/my.cnf 是数据库的配置文件,在下面会放出来。
- /etc/localtime:/etc/localtime:ro 是让容器的时钟与宿主机时钟同步,避免时区的问题,ro是read only的意思,就是只读。
3. 配置文件 (这个文件是我进容器里面抄出来的,因为内需要改动一点点)
default_authentication_plugin= mysql_native_password (这个是因应mysql8的安全机制升级而需要修改的配置,不配置的话将无法登录管理)
# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# The MySQL Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
# secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-grant-tables
# Custom config should go here
!includedir /etc/mysql/conf.d/
secure_file_priv=/var/lib/mysql
default_authentication_plugin= mysql_native_password
[mysql]
default-character-set=utf8
lower_case_table_names=1
mysql登录报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
解决方案:
vim /etc/mysql/my.cnf文件;
在[mysqld]后添加skip-grant-tables(登录时跳过权限检查)
或进入mysql后
ALTER user 'root'@'%' IDENTIFIED BY '123' PASSWORD EXPIRE NEVER;
ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123';
flush privileges;
如果你没有配置好就启动容器,容器初始化完成后,第3点的配置是不会生效的。你需要进入容器进行以下操作:
其间按提示会要求你输入root用户的password,就是上面我们设置的参数 “MYSQL_ROOT_PASSWORD”
[root@centos ~]# docker exec -it mysql8 /bin/sh
# mysql -uroot -p
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
可能异常:
注意:启动mysql报如下错误,那是因为MYSQL新特性secure_file_priv对读写文件的影响。
ERROR: mysqld failed while attempting to check config
command was: "mysqld --verbose --help"
mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)
2019-09-14T09:52:51.015937Z 0 [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
2019-09-14T09:52:51.018328Z 0 [ERROR] [MY-010119] [Server] Aborting
解决问题:
windows下:修改my.ini 在[mysqld]内加入secure_file_priv=/var/lib/mysql
linux下:修改my.cnf 在[mysqld]内加入secure_file_priv=/var/lib/mysql