湘乡彭于晏学习前端
Docker部署MySQL和Redis并挂载
2023-04-20Docker录2078

Docker是我们常用的容器引擎,使用Docker来部署和管理我们的常用数据库例如MySQL和Redis是非常的方便的。不过使用Docker安装部署MySQL和Redis还是有一些需要注意的地方的。

Docker部署MySQL

1.拉取MySQL镜像

使用docker pull命令即可拉取

复制
docker pull mysql

2.创建数据卷

MySQL作为数据库,其中通常存放我们的用户数据,都是很重要的,因此在容器化部署MySQL时,将MySQL的数据文件等等持久化是非常有必要的。

如果不挂载的话,容器删除数据就没了

这里我们使用具名挂载的方式挂载MySQL容器的数据卷,方便管理。 先创建三个数据卷,分别用于挂载并持久化MySQL的数据文件、配置文件和日志这三个目录:

复制
docker volume create mysql-data docker volume create mysql-config docker volume create mysql-log

这样,我们就创建了三个数据卷,这三个数据卷分别被命名为mysql-data、mysql-config和mysql-log,大家也可以自行取名。

3.创建MySQL容器

通过以下命令创建MySQL容器

复制
docker run --restart=always -d \ --name=mysql \ -v mysql-config:/etc/mysql/conf.d \ -v mysql-log:/logs \ -v mysql-data:/var/lib/mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ -e LANG=C.UTF-8 mysql

这样,就完成了MySQL容器的创建和启动,上述命令的参数意义如下:

  • -id 将MySQL容器挂在后台运行
  • --name=mysql 将容器起名为mysql,大家可以自己起名,该参数可以省略
  • -v mysql-config:/etc/mysql/conf.d 把MySQL容器中的配置文件目录挂载至上述创建的名为mysql-config的数据卷上面,还有两个-v挂载数据卷的参数同理
  • -p 3306:3306 把容器的3306端口映射到宿主机的3306端口,这样才能从外网访问这台机器上的MySQL,若你的数据库只需要从本机访问,就可以去除这个参数
  • -e MYSQL_ROOT_PASSWORD=123456 设置容器环境变量MYSQL_ROOT_PASSWORD的值为123456,这个环境变量表示MySQL的root用户的密码,一定要设置,这里设置了密码为123456,大家可以自定义
  • -e LANG=C.UTF-8 设置容器的语言环境变量LANG值为C.UTF-8,这个必须要设置,否则容器内默认是英文环境,使得MySQL无法存放中文内容

4.修改MySQL配置文件

上述我们已经把创建了数据卷并具名挂载了容器内的MySQL配置目录,只需查看数据卷的位置并修改其中文件即可。 查看数据卷mysql-config的位置:

复制
docker volume inspect mysql-config

然后展示如图

进入这个目录,可以看到里面有两个默认的MySQL配置文件,使用vim编辑即可,在里面加入自定义的配置。

这里配置一下mysql时区并开启定时任务

(为什么要开启定时任务,后面文章将会讲解mysql的定时任务,用于全量更新数据等等) 修改mysql.cnf中的配置文件

复制
[mysqld] event_scheduler=ON default-time-zone='+08:00'

编辑完成记得重启容器

复制
# 上述创建时容器名为mysql,若为自定义此处换为自己的 docker restart mysql

Docker部署Redis

1.拉取Redis镜像

使用docker pull命令即可拉取

复制
docker pull redis

2.创建数据卷

在容器化部署Redis时,将Redis的数据文件等等持久化也是非常有必要的。(也可以不挂载,但挂载更好)

如果不挂载的话,容器删除数据就没了

接下来就是要将redis 的配置文件进行挂载,以配置文件方式启动redis 容器。(挂载:即将宿主的文件和容器内部目录相关联,相互绑定,在宿主机内修改文件的话也随之修改容器内部文件)

  • 挂载 redis 的配置文件
  • 挂载 redis 的持久化文件(为了数据的持久化)。 这里我们使用具名挂载的方式挂载Redis容器的数据卷,方便管理。 先创建两个数据卷,分别用于挂载并持久化Redis的数据文件、配置文件这两个目录:
复制
docker volume create redis-data docker volume create redis-config

这样,我们就创建了两个数据卷,这两个数据卷分别被命名为redis-data、redisl-config,大家也可以自行取名。

3.创建Redis容器

通过以下命令创建MySQL容器

复制
docker run --restart=always \ --log-opt max-size=100m \ --log-opt max-file=2 \ -p 6379:6379 \ --name redis \ -v redis-config:/etc/redis/redis.conf \ -v redis-data:/data -d redis \ redis-server /etc/redis/redis.conf \ --appendonly yes \ --requirepass 123456

这样,就完成了Redis容器的创建和启动,上述命令的参数意义如下:

  • --restart=always 总是开机启动
  • --log是日志方面的
  • -p 6379:6379 将6379端口挂载出去
  • --name 给这个容器取一个名字
  • -v redis-config:/etc/redis/redis.conf 把Redis容器中的配置文件目录挂载至上述创建的名为redis-config的数据卷上面,还有一个-v挂载数据卷的参数同理
  • --appendonly yes 开启redis 持久化
  • --requirepass 123456 设置密码 (如果你是通过docker 容器内部连接的话,就随意,可设可不设。但是如果想向外开放的话,一定要设置)

4.测试

  1. 通过docker ps指令查看启动状态
复制
docker ps -a |grep redis # 通过docker ps指令查看启动状态,是否成功.
  1. 进入redis容器,容器id换成自己的
复制
docker exec -it 容器id /bin/bash
  1. 进去后输入redis-cli测试连接

  2. 验证密码auth 123456

5.配置

redis.conf 5.1、创建目录存放redis.conf文件

  1. 先找到挂载文件的目录
复制
docker volume inspect redis-config

2.cd 到redis-config挂载的目录下

复制
cd /var/lib/docker/volumes/redis-config/_data

这个目录对应的挂载相当于容器的/etc/redis/redis.conf

  1. 在该目录下存放redis.conf文件

如果没有wget,可以自己 vi redis.conf然后复制粘贴

复制
wget http://download.redis.io/redis-stable/redis.conf
  1. 文件授权
复制
chmod 777 redis.conf
  1. 修改默认配置信息
复制
vi redis.conf
  • #bind 127.0.0.1通过#注释掉,解除本地连接限制
  • protected-mode no no-限制为本地访问.yes-外部访问
  • daemonize yes 默认no 为不守护进程模式,修改为yes
  • requirepass 123456 设置密码
  • appendonly yes 持久化(可选)

配置完后,重启redis容器

这里是redis.conf精简版

复制
####需要修改的部分(开始)### #客户端的最大连接数 maxclients 10000 # 密码 requirepass 123456 #最大内存,单位是 byte 位。这里是512M。 maxmemory 512MB #淘汰策略,默认noeviction只返回错误,不会删除任何key。该策略是Redis的默认淘汰策略,一般不会选用。 maxmemory-policy volatile-ttl #常见的几种策略:作用对象-淘汰算法 ==》 淘汰策略 #(1)淘汰算法:ttl、random、lru、lfu #(2) 作用对象:allkeys、volatile #端口号 port 6379 #开启保护模式 protected-mode yes #后台运行. 这里必须填no,否则docker容器会推退出。 daemonize no #默认的日志级别 loglevel notice #日志文件名 logfile server_log.txt #以后台方式运行后,进程的位置 pidfile /var/run/redis_6379.pid #默认可以使用的数据库数量 databases 16 #### 需要修改的部分(结束) ### ###### RDB 持久化策略 (开始) ##### #15分钟1个更新 save 900 1 #5分钟10个更新 save 300 10 # 分钟1万个更新 save 60 10000 #持久化失败后,是否继续工作,默认yes stop-writes-on-bgsave-error yes #是否压缩rdb文件,如果开启比较小号cpu资源 rdbcompression yes #rdb文件保存时,是否校验错误 rdbchecksum yes #rdb文件存放的目录 dir ./ ###### RDB 持久化策略 (结束) ##### ###### AOF 持久化策略 (开始) ##### #开启aof,默认是不开启的。 appendonly yes # of文件名称 appendfilename appendonly.aof #erverysec: 1s 刷盘一次(最常用);always: 每次更新都刷,io次数多,性能低下;no: 不做持久化; appendfsync everysec #重写aof的前提条件,文件达到了64MB(默认是64MB) auto-aof-rewrite-min-size 64mb #文件达到了64MB,同时最近一次文件大小超出了原来的一倍,才进行aof重写 auto-aof-rewrite-percentage 100 ###### AOF 持久化策略 (结束) ##### #使用 RDB、AOF混合持久化 aof-use-rdb-preamble yes