谷粒商城-全栈-03 Docker 安装 MySQL 和 Redis

Docker 下安装指定版本的MySQL及Redis,以及端口如何映射。

一、MySQL安装及配置

1、下载MySQL镜像文件

$ sudo docker pull mysql:5.7

2、创建实例并启动

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

参数说明:

  • -p 3306:3306 : 将容器的 3306 端口映射到主机的 3306 端口
  • -v /mydata/mysql/conf:/etc/mysql :将配置文件夹挂载到主机,在主机Linux下创建/mydata/mysql/conf文件夹映射docker
  • -v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机
  • -v /mydata/mysql/data:/var/lib/mysql : 将运行期间的数据文件挂载到主机
  • e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码
  • -d mysql:5.7 : -d 表示以后台的方式运行,mysql:5.7 表示以该镜像启动容器

切换为root用户,然后执行上边的命令:

su root  # 密码默认为vagrant

[vagrant@localhost ~]$ su root
Password:(vagrant)
[root@localhost vagrant]# whoami
root

执行启动MySQL实例:

[root@localhost vagrant]# 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
7dc90206f09ad763b0544d8008de7fd191b5886fbd12f11120e572e171401d70
[root@localhost vagrant]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
7dc90206f09a        mysql:5.7           "docker-entrypoint.s…"   14 seconds ago      Up 11 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

可以看到MySQL已经安装好了,可以通过上一章节配置的访问IP来在主机上访问docker内部的MySQL是否安装OK。

进入容器内部查看MySQL安装路径:

[root@localhost vagrant]# docker exec -it mysql /bin/bash
root@7dc90206f09a:/# whereis mysql
mysql: /usr/bin/mysql /usr/lib/mysql /etc/mysql /usr/share/mysql

3、Mysql配置

在上一步创建实例的时候,我们已经做了docker内部和宿主机的映射,所以,在修改MySQL配置文件时,我们只需在容器映射到主机的目录改,不需要登录到容器内部。

如果你还没有安装 vim 编辑器,则先安装,已经安装过了则跳过:

yum install vim 

配置config文件 vim /mydata/mysql/conf/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
lower_case_table_names=1

设置好了之后,需要重启MySQL容器:

[root@localhost conf]# docker restart mysql
mysql

修改之后不能重启了,状态是这样的:Exited (1) 38 seconds ago, 我们通过docker 日志发现,刚添加的配置文件有问题:

[root@localhost conf]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
7dc90206f09a        mysql:5.7           "docker-entrypoint.s…"   41 minutes ago      Exited (1) 38 seconds ago                       mysql

查docker mysql示例的日志:

> docker logs mysql

日志打印:

2020-08-08 14:57:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
2020-08-08 14:57:07+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
    command was: mysqld --verbose --help
    2020-08-08T14:57:07.468976Z 0 [ERROR] unknown variable 'collection-server=utf8_unicode_ci'
2020-08-08T14:57:07.473457Z 0 [ERROR] Aborting
2020-08-08 15:00:20+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
2020-08-08 15:00:20+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
    command was: mysqld --verbose --help
    2020-08-08T15:00:20.258853Z 0 [ERROR] unknown variable 'collection-server=utf8_unicode_ci'
2020-08-08T15:00:20.263059Z 0 [ERROR] Aborting
2020-08-08 15:03:04+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
2020-08-08 15:03:04+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
    command was: mysqld --verbose --help
    2020-08-08T15:03:04.258422Z 0 [ERROR] unknown variable 'collection-server=utf8_unicode_ci'
2020-08-08T15:03:04.263084Z 0 [ERROR] Aborting
2020-08-08 15:08:55+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
2020-08-08 15:08:55+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
    command was: mysqld --verbose --help
    2020-08-08T15:08:55.879146Z 0 [ERROR] unknown variable 'collection-server=utf8_unicode_ci'
2020-08-08T15:08:55.883626Z 0 [ERROR] Aborting

原来是将配置文件中的单词写错了,真是郁闷:

    2020-08-08T15:00:20.258853Z 0 [ERROR] unknown variable 'collection-server=utf8_unicode_ci'

正确的应该是 collection->collation

collation-server=utf8_unicode_ci

修改了之后可以再次启动了:

[root@localhost conf]# 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
collaction-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
lower_case_table_names=1
[root@localhost conf]# vim my.cnf
[root@localhost conf]# docker start 7dc9
7dc9
[root@localhost conf]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
7dc90206f09a        mysql:5.7           "docker-entrypoint.s…"   About an hour ago   Up 4 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
[root@localhost conf]#

注意:解决MySQL连接慢的问题

在配置文件中加入如下,并启动MySQL

[mysqlld]
skip-name-resolve

解释:
skip-name-resolve:跳过域名解析
lower_case_table_names=1:忽略表名大小写

二、Redis安装及配置

1、下载redis镜像

> docker pull redis

2、创建实例并启动

先在宿主机创建需要和Redis容器映射挂载的目录,并手工创建redis配置文件:

mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf

创建实例:

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服务:

[root@localhost ~]# docker exec -it redis redis-cli
127.0.0.1:6379> set name 'lily'
OK
127.0.0.1:6379> get name
"lily"

exit

测试OK。

3、持久化

现在有一个最大的问题,就是redis默认配置是没有做持久化的,redis的所有数据都存在内存中,如果重启redis再连进来获取原来的数据就获取不到了,想让持久化比较简单,只需要修改配置文件即可。

修改配置文件:vim /mydata/redis/conf/redis.conf

# 配置持久化
appendonly yes

重启redis容器:

docker restart redis

配置好之后,我们可以再次测试,然后重启Redis容器,看数据是否会丢失,经过验证,数据不会再丢失了。

另外,Redis 的配置文件里边还可以配置那些参数,我们可以查看Redis官方文档。

三、自启动

[vagrant@bogon ~]$ sudo docker update mysql --restart=always
[vagrant@bogon ~]$ sudo docker update redis --restart=always

当虚拟机启动时,这两个容器也会自动启动。

为者常成,行者常至