docker学习笔记(4):制作mysql镜像与后续相关维护总结

引言

本篇准备从做mysql镜像到启动与外部连接成功,然后后期一系列的维护措施的顺序来大致介绍一下,也是对我前三篇内容的一个总结吧。

docker中拉取或制作mysql镜像

一般关于mysql、Mariadb、redis、mongodb等常用数据库的镜像一般都是直接pull,因为dockerbub上维护的版本已经足够稳定以及安全,当然,如果想自己本地手动做的话,可以点进它下面的链接里面查看dockerfile源文件,但那样效率就低了不止几倍有余,而elasticsearch我听一个大佬说过这类不常用的最好还是自己做,因为官方版本不是太好用,但具体我也不是太清楚,只有用过的人知道。那么两种方法都在下面这张图里:
在这里插入图片描述
我们用docker pull mysql就行了:
在这里插入图片描述
我这里是已经下载好了,然后接下来就可以启动了。

mysql容器的启动与外部连接

mysql的启动这里有非常多的方式和命令参数,一般如果是最简单的方式是只指定端口和密码:

sudo docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

运行完上述命令后本地已经启动了一个mysql容器,但这个时候外网还是无法连接到本容器,及用Navicat连接此容器,此时可能会有两个错误,一个是10038,一个是1251.

2003 can’t connect to MySQL server on ‘xxx.xxx.xxx.xxx’(10038).

一般上述错误就表示容器与外网无法正常连接,所以报这个错误,如果是阿里云服务器的话,我们需要进入阿里云的官网配置一条新的安全组规则, 也就是相当于在本地服务器上开放一个新的端口号。
在这里插入图片描述
如果是本地的话,在ipataple里添加一条新的规则就可以了。那么再次连接就不会报10038,而将是1251错误。

iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000

1251–Client does not support authentication protocol requested by server
在这里插入图片描述

这个错误我当时遇见了,然后找了很多篇的帖子,然后总结出了两个原因,其中一个可以说是版本问题,另一个就是密码由于版本授权方式也没有被写进去了。因为mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password,所以要么我们省级Navicat到和mysql 8一致的格式,但这很显然有些不现实,国内大部分人使用的Navicat都还可能是7开头的破解版,基本没有去破解8的,然后关于Navicat正版授权,这种就只能想想了。所以我们考虑第二种方案,就是更改mysql内部的授权方式,那么步骤如下:

在mobaxterm客户端(其它客户端也行)命令行界面进入mysql数据库
容器中登录mysql,进入mysql>命令行:

  1、docker exec -it  cmysql bash   # cmysql是我容器的别名  
  2、mysql -uroot -p   #-uroot
  3、输入密码
  4>mysql

(2)进行授权远程连接(注意mysql 8.0跟之前的授权方式不同)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION; 

mysql> FLUSH PRIVILEGES;

(3)更改加密规则

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;

(4)更新root用户密码

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; 

flush privileges;		# 刷新权限

在这里插入图片描述
(5)OK,设置完成,再次使用 Navicat 连接数据库:
在这里插入图片描述
然后这只是最简单的一种启动方式,第二种方式是通过-v参数来实现数据挂载:

docker run --name cmysql -p 8888:8888 -v /home/xzg/mysql/xs:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='123456' -d mysql

然后我们就可以在/home/xzg/mysql/xs看到一些配置文件,一些数据变更也会在这里显示出来:
在这里插入图片描述
关于docker run里面对于mysql或者运行其它各类容器的命令参数还有很多,我们可以docker run --help一下可以看到所有支持的参数,还可以进入docker的官网看一些具体的解释,这里我就不一一列举了,除开在命令行中写,我们还可以直接做一个my.cnf的脚本,让容器启动同时就将文件挂载进去,文件的写法可以看如下网址:
https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_sql-mode

我们先在/usr/local/mysql/目录下写好my.cnf文件,按照上面的语法格式,我们可以写一个最简单的版本:

[mysqldump]
user=root
password='123456'
[mysqld]
max_allowed_packet=8M
lower_case_table_names=1
character_set_server=utf8
max_connections=900
max_connect_errors=600

这个配置文件参数都是常规配置,我看很多篇帖子上加了sql_mode=STRICT_TRANS_TABLES等数据,我也去试了一下,但其实mysql自5.6版本之后就舍弃了sql_mode而改用了sql-mode,所以一般本地配置的时候写这个没什么问题,但一旦是通过脚本来运行就会启动不起来了,可以看上面网站的中间段。
在这里插入图片描述
然后我们就可以以此来写出根据配置文件为主导的启动方式:

docker run -d -p 3306:3306  -e MYSQL_ROOT_PASSWORD=123456 --name cmysql -v /usr/local/mysql/my.cnf:/etc/mysql/my.cnf -v /home/zxg/mysql/db:/var/lib/mysql mysql

参数详解:

  • –name 容器名字,这里是cmysql
  • -p 3306:3306 物理机端口:容器内部端口
  • -e 运行参数 初始化 root 用户的密码
  • -d 后台运行 mysql 下载的镜像名字,也可以加:tag
  • -v usr/local/mysql/my.cnf:/etc/mysql/my.cnf:将主机当前目录下的 mysql/my.cnf 挂载到容器的 /etc/mysql/my.cnf。//配置文件目录
  • -v ./logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。//日志目录
  • -v /home/zxg/mysql/db:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。//数据库文件存放目录

mysql端口映射问题

这个问题是我用着的中途突然想到的一个问题,因为这个mysql容器是我建着玩的,并不是用于项目,工作中也可能并不会开mysql的容器,而是开Linux的映射,那么就能做到端口互相分离了。但如果,比如说我服务器上是装了一个mysql的,而我先在3306端口运行了上面这段命令,容器已经跑了一天,而第二天同事早上来直接杀死了占用3306端口的东西,那容器也应该停了,我使用docker restart cmysql就会报错,端口冲突,(而restart的参数里也没有-p的参数,具体参数可以–help一下),在无法关闭本地情况下,我怎么重新启动容器。

我大概去看了几篇博客,然后自己试验了一下,发现可以,在这里介绍一下:

第一种方式:直接改容器内部端口

首先我们需要找到该配置文件的位置,一般docker是按官网形式安装的话,文件都是在/var/lib/docker/containers/[hash_of_the_container]/中,hash_of_the_container是该容器的启动hash编码,进去后找到hostconfig.json 还有 config.v2.json 这俩文件,vim进去可以输入port匹配关键词参数,找到PortBindings:
在这里插入图片描述
也可以复制上面的json数据,随便去一个在线的json数据美化网站转换形式,再找到PortBindings:
在这里插入图片描述
id 就是 容器的 hash 数值,在 hostconfig.json 里有 “PortBindings”:{} 这个配置项,可以改成 “PortBindings”:{“80/tcp”:[{“HostIp”:"",“HostPort”:“8080”}]} 这里 80 是容器端口, 8080 是本地端口, 然后在 config.v2.json 里面添加一个配置项 “ExposedPorts”:{“80/tcp”:{}} , 将这个配置项添加到 “Tty”: true, 前面,我不知道添加到别的地方会不会有影响,因为经过对比正常的端口映射配置项是在这个位置,这个就是将容器内部端口暴露出来,如果不加这一句端口映射不会成功的,最后重启 docker的守护进程 service docker restart。

第二种方式:对容器打标签成镜像再指定端口启动

这种方式相对简单更加高效,如果我们想要在不改变配置文件的情况下能任意切换端口或者其它信息,标签化绝对是首选,但那样就也会有一个缺点,就是不宜管理,这个的话在我下一篇中,使用portainer管理界面可以比较方便的完成这个机制,然后这里关于打标签然后启动的步骤我就不多说了,可以看我第二篇博客:docker学习笔记(2):docker镜像,里面详细介绍了步骤,启动就是本篇上面命令改端口号了。

参考与推荐:
[1]. https://hub.docker.com/_/mysql
[2]. https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_sql-mode
[3]. Docker容器的重启策略及docker run的–restart选项详解
[4]. docker给已存在的容器添加或修改端口映射

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

submarineas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值