欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker安装MySQL和Redis

程序员文章站 2022-05-18 09:26:06
...

1. Docker镜像仓库

Docker镜像仓库:https://hub.docker.com/


2. 安装 MySQL

2.1 下载 MySQL 镜像文件

启动并连接 Linux 虚拟机

vagrant up
vagrant ssh

Linux 下进行安装(最新版MySQL):

$ sudo docker pull mysql

或者指定版本(以 5.7 为例):

$ sudo docker pull mysql:5.7

查看是否下载成功:

$ sudo docker images
//[aaa@qq.com ~]$ sudo docker images
//REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
//mysql               5.7                 718a6da099d8        2 weeks ago         448MB

2.2 创建实例并启动

切换到 root 用户:

$ su root
//提示输入Password,我们的账号和密码都是默认的 vagrant,输入vagrant即可:
vagrant

//再查看当前用户
whoami
//显示 root 即可。

安装MySQL容器:

//以下操作均为 root 用户,复制所有运行即可:
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

参数说明:

//启动一个容器
docker run

//以下 ":" 前的路径为 Linux虚拟机挂在的路径
//":"后面的路径为容器内的路径
//将 Linux 虚拟主机的 3306 端口映射到 MySQL容器的 3306 端口
-p 3306:3306

//将日志文件夹挂载到 Linux 虚拟主机
-v /mydata/mysql/log:/var/log/mysql
//将配置文件夹挂载到 Linux 虚拟主机
-v /mydata/mysql/data:/var/lib/mysql
//将配置文件夹挂载到 Linux 虚拟主机
-v /mydata/mysql/conf:/etc/mysql

//初始化MySQL密码为 root,(默认用户名也为 root 这里不做修改)
-e MYSQL_ROOT_PASSWORD=root

Docker安装MySQL和Redis
测试是否运行成功:

//查看 docker 中正在运行的容器:
docker ps

如图运行成功:
Docker安装MySQL和Redis

2.3 修改 MySQL 配置

修改为 UTF-8 编码:

//由于之前已经对 MySQL 容器的配置文件夹与 Linux 虚拟机进行了映射,
//所以直接对虚拟机进行操作即可。
cd /mydata/
ls

cd mysql
ls

cd conf/
ls

//效果如下所示:
/*
[aaa@qq.com vagrant]# cd /mydata/
[aaa@qq.com mydata]# ls
mysql
[aaa@qq.com mydata]# cd mysql
[aaa@qq.com mysql]# ls
conf  data  log
[aaa@qq.com mysql]# cd conf/
[aaa@qq.com conf]# ls
[aaa@qq.com conf]#
*/

此时我们发现 conf 目录下并没有配置文件,我们要新建配置文件并填写代码:

//接上面代码,在 conf 目录下新建 my.cnf 文件:
vi my.cnf
//复制下面代码粘贴即可:
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

//之后按 esc 输入代码退出:
:wq

接下来重启 MySQL 容器:

docker restart mysql

查看容器内部是否修改成功:

//进入容器内部
docker exec -it mysql /bin/bash
//之前设置的映射路径为:/mydata/mysql/conf <--->/etc/mysql
cd /etc/mysql/
ls
cat my.cnf

显示如下内容,即设置成功:

[aaa@qq.com conf]# docker exec -it mysql /bin/bash
aaa@qq.com:/# cd /etc/mysql/
aaa@qq.com:/etc/mysql# ls
my.cnf
aaa@qq.com:/etc/mysql# cat my.cnf
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

3. 安装 Redis


3.1 下载 Redis 镜像文件

进入 root 账户后执行如下代码:

//下载最新的 Redis 镜像(因为未指定版本号~)
docker pull redis

3.2 创建实例并启动

这里与MySQL不同!
由于映射的路径中包含现在并不存在的目录以及文件,所以我们必须先创建目录和文件才可以映射。

//创建目录
mkdir -p /mydata/redis/conf

//conf目录下并没有文件
/*
[aaa@qq.com vagrant]# mkdir -p /mydata/redis/conf
[aaa@qq.com vagrant]# cd /mydata/
[aaa@qq.com mydata]# ls
mysql  redis
[aaa@qq.com mydata]# cd redis
[aaa@qq.com redis]# ls
conf
[aaa@qq.com redis]# cd conf
[aaa@qq.com conf]# ls
[aaa@qq.com conf]#
*/

//接下来在conf目录下新建redis.conf文件
touch redis.conf

文件创建完成后,就可以启动 Redis 容器了:

//复制以下代码直接运行即可:
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf

至此 Redis 便安装完成了。

查看一下运行中的容器:

[aaa@qq.com conf]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
e5e7b9756d04        redis               "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        0.0.0.0:6379->6379/tcp              redis

3.3 数据持久化

测试一下 Redis 效果:

//利用 redis-cli 客户端进入 redis
docker exec -it redis redis-cli

//存入数据
set a b
//读取数据
get a
//结果:
//"b"
//退出redis
exit

//然后重启一下redis
docker restart redis

//重启完毕再次进入redis
docker exec -it redis redis-cli
//读取一下之前存入的 "a" 的 value
get a
//(nil)

返回为空,没有读到值,这就是因为 redis 的非持久化特性,数据是存放在内存中的,如果 redis 重启,那么数据便丢失了。

继续操作:

//首先退出 redis
exit
//找到配置文件目录
pwd
ls
//修改配置文件
vi redis.conf

//编辑页面输入代码,使 redis 启用 aof 的持久化方式
appendonly yes
//键盘esc,然后保存退出
:wq

接下来测试一下:

//重启 redis
[aaa@qq.com conf]# docker restart redis
redis

//查看 docker 容器运行情况
[aaa@qq.com conf]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
e5e7b9756d04        redis               "docker-entrypoint.s…"   23 minutes ago      Up 11 seconds       0.0.0.0:6379->6379/tcp              redis

//进入 redis
[aaa@qq.com conf]# docker exec -it redis redis-cli
//存入数据
127.0.0.1:6379> set aa bb
OK
//取出数据
127.0.0.1:6379> get aa
"bb"
//退出 redis 容器
127.0.0.1:6379> exit

//再次重启 redis
[aaa@qq.com conf]# docker restart redis
redis
//进入 redis 容器
[aaa@qq.com conf]# docker exec -it redis redis-cli
//直接取出数据
127.0.0.1:6379> get aa
//取出成功~~~~
"bb"

至此,redis 的数据持久化完成~????