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