Docker部署数据库
容器化部署的持久化
拉取MySQL
1  | ➜ ~ docker pull mysql  | 
可以看到最新的mysql是8.0,这个版本取消了MyISAM 支持实务,效率低
支持InnoDB支持实务,效率也提高了
互联网企业的开发技能真正需要的技能,微服务架构,也就是分布式系统开发,数据库要支持分布式,目前的大多数企业是通过第三方方案支持,也就是互联网企业的需要原生分布式.
8.0的MySQL支持原生分布式数据库的解决方案
本博客使用5.7版本
5.7的mysql 支持NoSQL 效率方面是比之前版本快的.
➜ ~ sudo docker pull mysql:5.7.22
运行容器
如果这里直接启动mysql是启动的latest版本的mysql也就是8.0以上的.但是这样是启动不了的,因为最新版的启动方式已经改变.所有我们需要启动的是5.7版本的mysql.
1  | docker run -p 3307:3306 --name mysql \  | 
命令参数:
- p 3307:3306:将容器的 3306 端口映射到主机的 3307 端口
 - v /usr/local/docker/mysql/conf:/etc/mysql:将主机当前目录下的 conf 挂载到容器的 /etc/mysql
 - v /usr/local/docker/mysql/logs:/var/log/mysql:将主机当前目录下的 logs 目录挂载到容器的 /var/log/mysql
 - v /usr/local/docker/mysql/data:/var/lib/mysql:将主机当前目录下的 data 目录挂载到容器的 /var/lib/mysql
 - e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码
 - d 守护态运行
 
ECS服务器开放端口
3306-3316开放10个端口供给docker容器使用

查看容器启动情况
1  | ➜ ~ sudo docker ps  | 
使用客户端工具连接 MySQL
测试连接成功

查看数据库

查看docker目录下的文件
1  | ➜ docker ls  | 
docker帮我创建了mysql文件夹,和window和linux下的目录一样的.
一点小问题
- 以交互方式启动docker
 
1  | ➜ data sudo docker run -it --rm mysql:5.7.22 bash  | 
- 之前启动时候的参数
 
1  | docker run -p 3307:3306 --name mysql \  | 
与启动后的mysql的配置文件一对比,就发现相同之处了.
导入数据库数据
mysql默认情况下可导入的数据库大小为: 16MB
1  | root@fc1072850e62:/etc/mysql# ls -a  | 
实际上需要把max_allowed_packet = 16M 这个配置放到
1  | root@fc1072850e62:/etc/mysql/mysql.conf.d# ls  | 
mysql.cnf下.
但是这个容器如果删除掉,这个配置文件也会消失,所以需要使用数据卷将这个配置文件做成共享文件.这样就算这个mysql容器被销毁,下一次新建mysql容器时也会共享数据卷里面的mysql.cnf文件
数据卷共享mysql.cnf
1  | ➜ mysql cd conf  | 
退出容器后进入conf目录发现没有任何文件,需要拉取配置文件到这里
停止删除原先的容器
1  | ➜ conf sudo docker ps  | 
修改原先启动配置
1  | docker run -p 3307:3306 --name mysql \  | 
notice:
交互的方式启动容器. run -it
交互的方式进入容器. exec -it
1  | ➜ conf sudo docker run -p 3307:3306 --name mysql \  | 
将文件限制大小追加进次配置文件
1  | root@2fbdec92f87a:/etc/mysql/mysql.conf.d# echo "max_allowed_packet = 128M" >> mysqld.cnf  | 
追加成功
重启docker
1  | ➜ conf sudo docker restart mysql  | 
[root@MyCentOS]~# docker exec -it mysql bash
root@2fbdec92f87a:/# cd /e
entrypoint.sh  etc/
root@2fbdec92f87a:/# cd /etc/mysql/
root@2fbdec92f87a:/etc/mysql# ls -al
total 36
drwxr-xr-x 1 root root 4096 Jul 27  2018 .
drwxr-xr-x 1 root root 4096 Sep 24 02:34 …
drwxr-xr-x 2 root root 4096 Jul 27  2018 conf.d
lrwxrwxrwx 1 root root   24 Jul 27  2018 my.cnf -> /etc/alternatives/my.cnf
-rw-r–r-- 1 root root  839 Jul  9  2016 my.cnf.fallback
-rw-r–r-- 1 root root  796 Mar  4  2018 mysql.cnf
drwxr-xr-x 1 root root 4096 Jul 27  2018 mysql.conf.d
1  | 
  | 
➜  conf ls
mysql
➜  conf cd mysql
➜  mysql ls
conf.d  my.cnf.fallback  mysql.conf.d
my.cnf  mysql.cnf
➜  mysql
删除mysql文件夹
➜  conf sudo rm -fr mysql
➜  conf ls
conf.d  my.cnf.fallback  mysql.conf.d
my.cnf  mysql.cnf
退回上一级
➜ conf cd …
停掉mysql容器
mysql sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2fbdec92f87a        mysql:5.7.22        “docker-entrypoint.s…”   14 minutes ago      Up 9 minutes        0.0.0.0:3307->3306/tcp   mysql
e74b9cc8e192        tomcat              “catalina.sh run”        17 hours ago        Up 17 hours         0.0.0.0:8084->8080/tcp   volumeDemo1
a569649fcc5a        tomcat              “catalina.sh run”        17 hours ago        Up 17 hours         0.0.0.0:8083->8080/tcp   volumeDemo
d53272c36764        tomcat              “catalina.sh run”        20 hours ago        Up 20 hours         0.0.0.0:8082->8080/tcp   mytomcat2
849e5b576998        myproject           “catalina.sh run”        24 hours ago        Up 20 hours         0.0.0.0:8081->8080/tcp   elastic_panini
➜  mysql sudo docker stop 2
2
➜  mysql sudo docker rm 2
2
1  | ### 运行带着数据卷的配置命令  | 
docker run -p 3307:3306 --name mysql 
-v /usr/local/docker/mysql/conf:/etc/mysql 
-v /usr/local/docker/mysql/logs:/var/log/mysql 
-v /usr/local/docker/mysql/data:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=root 
-d mysql:5.7.22
1  | - 再进入/etc/mysql/mysql.conf.d查看文件  | 
➜  mysql docker run -p 3307:3306 --name mysql 
-v /usr/local/docker/mysql/conf:/etc/mysql 
-v /usr/local/docker/mysql/logs:/var/log/mysql 
-v /usr/local/docker/mysql/data:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=root 
-d mysql:5.7.22
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create?name=mysql: dial unix /var/run/docker.sock: connect: permission denied.
See ‘docker run --help’.
➜  mysql sudo docker run -p 3307:3306 --name mysql 
-v /usr/local/docker/mysql/conf:/etc/mysql 
-v /usr/local/docker/mysql/logs:/var/log/mysql 
-v /usr/local/docker/mysql/data:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=root 
-d mysql:5.7.22
00e3d56be3658b26e11ec7d045843638fcba8a938aa2877bd8f9f6e2aa950408
➜  mysql sudo docker exec -it mysql bash
root@00e3d56be365:/# cd /etc/mysql/
root@00e3d56be365:/etc/mysql# ls -la
total 24
drwxr-xr-x 4 root root 4096 Sep 24 02:46 .
drwxr-xr-x 1 root root 4096 Sep 24 02:52 …
drwxr-xr-x 2 root root 4096 Jul 27  2018 conf.d
lrwxrwxrwx 1 root root   24 Jul 27  2018 my.cnf -> /etc/alternatives/my.cnf
-rw-r–r-- 1 root root  839 Jul  9  2016 my.cnf.fallback
-rw-r–r-- 1 root root  796 Mar  4  2018 mysql.cnf
drwxr-xr-x 2 root root 4096 Jul 27  2018 mysql.conf.d
root@00e3d56be365:/etc/mysql# cd mysql.conf.d/
root@00e3d56be365:/etc/mysql/mysql.conf.d# ls -la
total 12
drwxr-xr-x 2 root root 4096 Jul 27  2018 .
drwxr-xr-x 4 root root 4096 Sep 24 02:46 …
-rw-r–r-- 1 root root 1222 Sep 24 02:36 mysqld.cnf
root@00e3d56be365:/etc/mysql/mysql.conf.d# cat mysqld.cnf
[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
#log-error	= /var/log/mysql/error.log
By default we only accept connections from localhost
#bind-address = 127.0.0.1
Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_allowed_packet      = 128M
root@00e3d56be365:/etc/mysql/mysql.conf.d#
1  | 发现配置变化了,追加进去的数据成功.  | 
➜  mysql ls
conf  data  logs
➜  mysql
以上为数据卷的数据库容器化部署
### 参考资料
> https://www.bilibili.com/video/av29384041/?p=42
> https://www.funtl.com/zh/docker/Docker-%E6%9E%84%E5%BB%BA-MySQL.html