当前位置:   article > 正文

Docker部署mysql5.7_docker mysql5.7

docker mysql5.7

一、Docker是什么?

        以传统意义上的“虚拟机”作为切入点,有一台物理服务器,把这台服务器当做宿主机,在宿主机上虚出了虚机A、虚机B等,对于这些虚拟机来说,它们各自都独占了一套完整的操作系统,准确的说,应该是一套完整的“操作系统发行版”,注意,这里强调一下“发行版”三个字,以linux系统为例,组成一个“linux系统发行版”,首先需要有“linux内核”,其次还需要有相关软件依赖的运行环境软件包,比如说一些类库包、命令行工具等等,不同的linux发行版基于相同的linux内核开发,但是由于组成运行环境的包的不同,所以产生了不同的发行版,比如ubuntu和centos就是不同的linux发行版,对于虚机A和虚机B来说,它们各自拥有一套完整的操作系统(即使A和B都安装了centos7.9,本质上也是两个相互独立的操作系统),从隔离层面上来说,A和B之间是“linux系统发行版”的完整隔离,A和B都各自使用自己的内核和运行环境依赖包,各自使用自己的虚拟硬件,这是虚拟机在操作系统层面的隔离,理解上述概念,是避免搞混docker和传统虚拟化的关键。

        我们知道docker是一种容器引擎,docker运行容器的本质目的是去运行某个程序,docker通过应用程序镜像,安装并运行对应的程序,比如,我需要运行nginx,只需要下载对应的nginx镜像,docker就可以把这个nginx镜像运行成一个容器,容器把内部的nginx服务端口暴露出来,我们就可以访问nginx服务了,其他服务软件同理,在没有使用docker之前,看到“镜像”这个词,我又情不自禁的想到了虚拟机,只不过,虚拟机是通过“操作系统镜像”安装运行系统,docker是通过“应用程序镜像”安装运行对应的软件,当我搜索docker和虚拟机有什么不同的时候,我看到了下面这张图

        从上图看,每个虚拟机都有自己的完整的操作系统(GUEST OS就是操作系统,拆成两部分,GUEST OS是其内核和运行环境包组成的),VM1虚拟机上的所有APP使用的是同一套运行库和内核,Hypervisor层对硬件资源进行划分,各个虚拟机在整个操作系统发行版层面进行了隔离,而容器则不同,容器是将APP和其需要依赖的运行库打包成一个镜像,在APP进程和运行库层面进行了隔离(上图中CONTAINER中的APP就是应用程序镜像,这个镜像中包含应用本身和其需要的运行时依赖包),不同的APP各自使用自己的运行时环境,容器所运行的镜像中不需要内核,所有容器共用所在主机HostOS的内核,统一通过HostOS的内核与硬件进行交互,docker就是运行在HostOS中的容器引擎,理解了上图以后,我们就能明显感觉到它们的区别了,上图中最凸显的区别就是隔离层面的不同,虚拟机是针对整个系统发行版层面的隔离,而容器则是对程序进程和其依赖的运行环境的隔离,虚拟机的隔离性更强,隔离范围大,容器的隔离性没有虚拟机强,但是隔离范围更小,容器并不涉及Hypervisor层,它是一种进程隔离技术,从这个方面讲,它不应该算做“传统虚拟化”的范围,人们愿意把它称之为容器“虚拟化”技术,我觉得是因为容器更偏向于“java虚拟机”或者“python虚拟环境”这种软件意义上的“虚拟”,所以说,容器并不会取代虚拟机,它们之间也并不冲突,它们应该是相辅相成的。

把应用程序和其运行时依赖库打包隔离的好处有哪些呢?首先,由于隔离的范围更小了,所以当出现问题时,影响的范围也会更小,只会影响这个应用程序容器的进程本身,而不是其他程序的容器和HOST操作系统,其次,由于应用程序和其依赖的运行时环境是打包在一起的(打包成一个docker镜像),这就表示,如果一个程序的镜像在我的centos7上能够运行,那么在你的centos7上用也能够正常运行,不会出现某个程序在开发人员的笔记本中可以运行,但是放在服务器上就不能正常运行的情况(因为服务器上可能没有安装程序所依赖的包),这就是把程序和依赖打包在一起的好处。

当我们想要通过docker运行一个软件,首先要有对应软件的镜像,我们可以自己制作对应的镜像,也可以从镜像仓库中下载别人制作好的镜像,下载后直接运行,在刚开始学习docker时,最好使用别人创建的镜像,因为这样学习的难度会降低很多,docker官方提供了镜像仓库,供大家分享镜像,官方的镜像仓库叫做docker hub,我们可以从这里面下载别人的镜像,或者上传自己的镜像,docker hub的地址是 https://registry.hub.docker.com ,我们可以在仓库中搜索需要的镜像,下载到本地使用.

二、安装步骤

1.软件源安装Dokcer

代码如下:

参考文档:

阿里docker ce镜像:docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站

docker官方文档(可能需要魔法上网):Install Docker Engine | Docker Docs

  1. step1:卸载旧版本
  2. sudo yum remove docker \
  3.                 docker-client \
  4.                 docker-client-latest \
  5.                 docker-common \
  6.                 docker-latest \
  7.                 docker-latest-logrotate \
  8.                 docker-logrotate \ docker-engine
  9. step2:设置yum库
  10. 更新yum
  11. sudo yum update
  12. 安装驱动
  13. yum install -y yum-utils device-mapper-persistent-data lvm2
  14. 更新阿里源
  15. # 设置docker镜像源
  16. sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  17. #境外机器使用docker官方源
  18. sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  19. 更新yum缓存
  20. sudo yum clean all
  21. sudo yum makecache fast
  22. step3: 安装docker引擎、containerd 和 Docker Compose(下面两步根据实际需要选择)
  23. 安装最新版本
  24. sudo yum install  docker-ce
  25. sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
  26. 安装指定版本
  27. 先列出仓库中可用版本
  28. sudo yum list docker-ce --showduplicates | sort -r
  1. 替换<VERSION_STRING>(即为上图中第二列)为所需的版本,然后运行以下命令进行安装:
  2. sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin
  3. 注:以上命令安装 Docker,不会启动 Docker。它会创建一个 docker组,但是默认情况下不会将任何用户添加到该组。
  4. 安装验证
  5. docker -v
  6. step4:
  7. 1、设置国内镜像站点
  8. 目的:下载镜像很慢,国外的站点,设置一个镜像使下载快
  9. 配置 /etc/docker/daemon.json
  10. 登录阿里云官网,搜索容器,找到容器与镜像服务,点击镜像加速器。
  11. https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
  12. 2、配置镜像加速器 sudo mkdir -p /etc/docker   ----- 已存在
  13. sudo tee /etc/docker/daemon.json <<-'EOF'
  14. {  
  15.         "registry-mirrors": ["https://gxo4r66i.mirror.aliyuncs.com"]
  16. }
  17. EOF
  18. sudo systemctl daemon-reload
  19. sudo systemctl restart docker
  20. 3、docker启动与停止
  21. 启动:systemctl start docker    (yum安装的都可以用systemctl命令启动)
  22. 停止:systemctl stop docker
  23. 重启:systemctl restart docker
  24. 开机启动:systemctl enable docker
  25. docker概要信息:docker info
  26. docker 帮助:docker help
  27. Docker 默认安装的情况下,会使用 /var/lib/docker/ 目录作为存储目录
  28. 用以存放拉取的镜像和创建的容器等。不过由于此目录一般都位于系统盘,遇
  29. 到系统盘比较小,而镜像和容器多了后就容易尴尬,这里说明一下如何修改
  30. Docker 的存储目录。
  31. 输入:
  32. docker info
  1. 最简单粗暴的办法,当然就是直接把数据盘挂载到/var/lib/docker 目录下,
  2. 不过这样对整体影响太大,其他程序需要使用数据盘时很不方便,所以还是
  3. 从 Docker 端的修改入手。 官方文档的修改办法是编辑 /etc/docker/daemon.json 文件
  4. vi /etc/docker/daemon.json 
  5. 默认情况下这个配置文件是没有的,这里实际也就是新建一个,然后写入以下内容:
  6. 由于我做了镜像加速,我就可以直接加在下面
  7. {  
  8. "registry-mirrors": ["http://hub-mirror.c.163.com"],  
  9. "data-root": "/data/docker" ----你最后放镜像位置(没有的话就先去创建)
  10. }
  11. 保存退出,然后重启 docker 服务:
  12. systemctl restart docker
  13. docker info 看到变化
  14. df -Th 也看到放在了大的磁盘上

2.docker 安装MYSQL5.7

 1.安装 Mysql 5.7 docker镜像

docker pull mysql:5.7

 2.查看镜像是否拉取成功

docker images

 3.创建mysql容器

在本地创建mysql的映射目录

mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf

目录自己定义,最好在数据盘新建,在/root/mysql/conf中创建 *.cnf 文件

touch 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

4.创建容器,将数据,日志,配置文件映射到本机

docker run -p 3306:3306 --name mysql -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.44

-p 3306:3306 --name mysql \                # 将容器的3306端口映射到主机的3306端口,'\'指换行符,下同
-v /mydata/mysql/log:/var/log/mysql \    # 将配置文件夹挂载到主机,冒号左边为Linux的目录结构,右边为docker内部的
-v /mydata/mysql/data:/var/lib/mysql \    # 将日志文件夹挂戟到主机
-v /mydata/mysql/conf:/etc/mysql \        # 将配置文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=123456 \            # 初始化root用户的密码为:root
-d mysql:5.7.44

5.启动mysql容器

docker start mysql

docker ps  可以查看容器

 查看/root/mysql/data目录是否有数据文件

6.进入mysql操作控制台

可以使用命令进入mysql的控制台,对mysql进行一些操作,命令如下:

docker exec -it mysql /bin/bash

进入docker中的mysql控制台查看文件是否配置成功

# 1、进入操作台
docker exec -it mysql /bin/bash
# 2、进入mysql配置文件目录
cd /etc/mysql/
# 3、列出文件
ls
# 4、看看该文件
cat my.cnf
# 5、没问题就退出
exit

7.修改mysql默认配置

cd /mydata/mysql/conf

# 设置mysql每次开机随docker自启动
docker update mysql --restart=always

8.进入Docker容器中修改mysql密码

docker exec -ti  mysql -u root -p

命令及参数解释:

docker exec :在运行的容器中执行命令

OPTIONS说明:

-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端

方法1: 用SET PASSWORD命令
首先登录MySQL。
格式:mysql> set password for 用户名@localhost = password(‘新密码’);
例子:mysql> set password for root@localhost = password(‘123’);

方法:用UPDATE直接编辑user表
首先登录MySQL。
mysql> use mysql;
mysql> update user set password=password(‘123’) where user=‘root’ and host=‘localhost’;
mysql> flush privileges;

USE mysql;
UPDATE user SET authentication_string=PASSWORD('kSc6shR=2PeP') WHERE User='root';
FLUSH PRIVILEGES;(8.0可能使用这个)
修改完成后,重启容器即可

docker stop containerid 
docker start contatinerid

查看数据库密码信息

use mysql;

select host, user, authentication_string, plugin from user;

修改root密码

ALTER USER 'root'@'%' IDENTIFIED BY '密码' PASSWORD EXPIRE NEVER;

查看是否有变动

select host, user, authentication_string, plugin from user;

修改本地密码

ALTER USER 'root'@'localhost' IDENTIFIED BY 'lc123456';

查看是否有变动

select host, user, authentication_string, plugin from user;

重启服务

docker restart mysql

远程连接测试

问题:Docker容器内Mysql大小写敏感方案解决

查看当前mysql大小写敏感的配置:

show global variables like '%lower_case%';
变量lower_case_file_system说明是否数据目录所在的文件系统对文件名的大小写敏感。ON说明对文件名的大小写不敏感,OFF表示敏感。

Linux下:

  • 数据库名与表名是严格区分大小写的;
  • 表的别名是严格区分大小写的;
  • 列名与列的别名在所有的情况下均是忽略大小写的;
  • 变量名也是严格区分大小写的;

Windows下:

  • 都不区分大小写

一、(lower_case_table_names)参数说明

unix下lower_case_table_names默认值为 0 .Windows下默认值是 1 .Mac OS X下默认值是 2。

二、Docker 部署 MySql 并修改为大小写不敏感
2.1直接在Docker启动的时候,添加参数,设置为对小写不敏感
使用hibernate作为和数据库交互的框架,使用docker安装mysql,由于我在实体类的注解中@Table注解中的name都是大写,但是我在数据库里面建立的表都是小写,倒是查不到数据,进去数据库里面可以看到,同样的表有大写。小写两份,如下图:

查询的时候hibernate获取的表名称是实体中定义的表名称,是大写的,但是我的数据都在小写的表里,所以查询不到数据,此时可以通过设置mysql不区分大小写来解决这个问题,如果是在linux中启动的mysql需要修改lower_case_table_names=1来忽略大小写,但是docker中,启动的时候就可以设置这个参数:

  1. 编辑/root/mysql/conf.d/mysqld.cnf 文件

vi /root/mysql/conf.d/mysqld.cnf

#[mysqld]后添加 
lower_case_table_names=1

重启应用

#容器中执行
service mysql restart

#或者退出容器直接重启mysql容器
docker restart mysql

注意:

  • 在Unix中如果以前lower_case_tables_name = 0将lower_case_tables_name设置为1之前,重启mysqld之前,必须先将旧的数据库名和表名转换为小写。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/537454
推荐阅读
相关标签
  

闽ICP备14008679号