这几天在研究如何将服务器和数据库迁移至docker容器
,中间遇到了许多问题,特此写篇博客记录一下。
提示:本篇文章主要讲解如何在docker容器中构建及部署MySQL
从 CentOS 镜像中构建 MySQL 容器可以更好地控制操作系统的版本和配置,而从 MySQL 官方镜像中构建容器则可以更方便地获取最新版本的 MySQL。具体选择哪个镜像,可以根据自己的需求和实际情况来决定。
下面我们来尝试上面两种构建MySQL容器的方式
Dockerfile(示例):
# 1. 镜像基于centos7
FROM centos:7
# 2. 更改镜像时区
RUN echo 'Asia/Shanghai' >/etc/timezone
MAINTAINER 作者
# 3. 安装必要的软件包
RUN yum -y install epel-release
RUN yum install initscripts -y
# 4. 安装jdk
RUN yum install java-1.8.0-openjdk.x86_64 -y
# 5.安装wget
RUN yum -y install wget
# 6. 安装MySQL
## 6.1 wget下载MySQL5.7
RUN wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
注:【MySQL5.6地址】:http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
## 6.2 安装MySQL5.7
RUN rpm -ivh mysql57-community-release-el7-7.noarch.rpm
注:【MySQL5.6包】:rpm -ivh mysql-community-release-el7-5.noarch.rpm
## 6.3 安装MySQL5.7 所需秘钥【MySQL5.6则无需秘钥】
RUN rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
## 6.4 执行安装 && 赋予mysql安装目录访问权限
RUN yum -y install mysql-community-server
RUN chown -R root:root /var/lib/mysql
# 7. 将数据库初始化脚本放入镜像
COPY ./mysqlinit/init.sql /usr/local/mysql/init.sql
# 8. 暴露端口
EXPOSE 80 3306 443 6379
# 9. 启动服务
CMD ["/usr/sbin/init"]
1. docker build 生成MySQL镜像
:
docker build -t 镜像名称 -f Dockerfile .
2. docker volume 创建数据卷
:
docker volume create mysql_data
3. docker run 运行容器
:
docker run --privileged=true -d --name 容器别名 -p 3306:3306 -v mysql_data:/var/lib/mysql 运行的容器ID
注: --privileged=true 参数的意思是以特权的身份去运行容器,否则在容器中运行MySQL【systemctl restart mysqld.service
】时会提示无权限
-v 参数的意思是将宿主机的目录/数据卷和容器目录进行挂载
4. 进入docker容器
:
docker exec -it 容器名/容器id bash
5. 启动mysql
:
先使用命令查询mysql是否运行
ps -ef|grep mysql
如果未启动则执行
systemctl restart mysqld.service
6. 查看mysql初始密码
:
grep ‘temporary password’ /var/log/mysqld.log
7. 登录mysql并修改密码
:
1. 修改密码
ALTER USER 'root'@'%' IDENTIFIED BY '你的密码';
配置新账号参考:
grant all privileges on *.* to 你的账号@'%' identified by '你的密码' with grant option;
2. 刷新密码改动
flush privileges;
8. mysql一些常见指令
:
1. 创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名称 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
2. 开启mysql语句执行记录【但是并不建议用户开启 需定期清理 否则会造成日志堆积】
set global general_log=1;
3. 找到日志存放目录
show variables like 'general%';
docker pull mysql:5.7
创建数据卷
docker volume create mysql_data7
运行镜像并挂载数据卷
docker run -d -e MYSQL_ROOT_PASSWORD=root --name mysql57 -d -p 13307:3306 -v mysql_data7:/var/lib/mysql -v /usr/local/docker/mysql5.7/log:/var/log/ mysql:5.7
进入镜像
docker exec -it mysql57 bash
登录mysql设置允许外网访问
use mysql;
update user set host = ‘%’ where user = ‘root’;
FLUSH PRIVILEGES;
注意:update user set host = ‘%’ where user = ‘root’; 这一行可能会报错 但是不用管 依然会生效的
docker build 构建容器时放入sql文件
COPY ./mysqlinit/init.sql /usr/local/mysql/init.sql
docker启动后放入sql文件
docker cp init.sql 容器id:/usr/local/mysql/init.sql
执行文件前可以开启sql执行日志
set global general_log=1;
查询sql执行日志输出目录
show variables like 'general%';
mysql -uroot -p 数据库名 < /usr/local/mysql/init.sql
本地化部署含义:将MySQL镜像(含数据)
打成包保存到本地,然后部署到需要这台MySQL的服务器上。
要求MySQL镜像、MySQL镜像中的数据库、mysql配置文件都部署到新服务器上。
我们来看看具体应该如何操作
1. 打包镜像
docker save -o .tar
比如执行:
docker save -o mysql7.tar mysql7
就是将mysql7
这个镜像打包成名称为mysql7.tar
的压缩包下
2. 找到镜像挂载数据卷
docker volume inspect mysql_data7
注:什么是挂载
数据卷
?我们知道docker
镜像每次重启后数据是会重置的。但是MySQL
作为数据库,对它的任何改动都应该是要被持久化的
,这个时候只需在宿主机创建一个数据卷
,然后通过-v
指令将容器映射到这个数据卷
上,这样容器内MySQL
的改动就会保留到宿主机的数据卷
上,下次重启容器时,改动就会被保留
3. 进入挂载目录
cd /var/lib/docker/volumes/mysql_data7
4. 压缩镜像目录
tar -czvf mysql7.tar.gz _data/
5. 找到原mysql配置文件 my.cnf
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
# 表名大小写不敏感,根据项目实际要求来配置即可
lower_case_table_names=1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
上述操作处理完生成三个文件 :
6. 将这三个文件放入目标服务器
1. 加载镜像
docker load -i mysql7.tar
2. 创建数据卷
docker volume create mysql_data7
3. 查询数据卷目录并进入
docker volume inspect mysql_data7
3.进入数据卷目录
cd /var/lib/docker/volumes/mysql_data7
tar -zxvf mysql7-volume.tar.gz
5.启动docker镜像
docker run -d -e MYSQL_ROOT_PASSWORD=root --name mysql7 -d -p 3306:3306 -v mysql_data7:/var/lib/mysql -v /root/my.cnf:/etc/my.cnf mysql7
-e MYSQL_ROOT_PASSWORD
代表mysql初始密码
--name
代表容器启动别名 -d
代表后台启动 -p
代表端口映射
-v
代表文件/数据卷映射 比如 -v mysql_data7:/var/lib/mysql 代表将宿主机的mysql_data7
数据卷映射到容器的/var/lib/mysql
目录下
以上就是今天要讲的内容,本文主要介绍了如何使用docker构建及部署mysql5.7镜像,后续会介绍更多的docker内容,如有疑问可以在评论区留言。