docker通过容器数据卷挂载方式安装mysql

前言

将mysql运行的环境打包形成docker容器运行,服务运行随着容器的启动和关闭没什么问题,但是对于数据来说,我们是希望能够持久化的,不能删除容器,数据也被删除了,通过容器数据卷可以有效解决这个问题。

什么是容器数据卷?

卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此即使容器删除了,挂载的数据卷也不会被删除。

数据卷特点

1、数据卷可在容器之间共享或重用数据。
2、卷中的更改可以直接生效。
3、数据卷中的更改不会影响到原来的镜像。
4、数据卷的生命周期一直持续到没有容器使用它为止。

使用方式

# 命令
docker run -v 宿主机目录:容器内目录 镜像名

# 示例
docker run --restart=always -d -v /data/mysql/conf:/etc/mysql/mysql.conf.d -v /data/mysql/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

# 说明
# -d 后台运行
# -v 目录映射 /data/mysql/conf:/etc/mysql/conf.d 挂载mysql配置文件,/data/mysql/data:/var/lib/mysql 挂载数据文件,多个挂载在后面继续添加
# -p 端口映射;主机端口:容器端口
# -e 环境变量
# --name 容器名称

完整部署流程

  • 拉取镜像
docker pull mysql:5.7

image

  • 通过数据卷方式启动容器
# 1.在宿主机上创建存放配置文件目录
mkdir -p /data/mysql/conf
# 2.在宿主机上创建存放数据的目录
mkdir -p /data/mysql/data
# 3.启动容器
docker run --restart=always -d -v /data/mysql/conf:/etc/mysql/mysql.conf.d -v /data/mysql/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
  • 查看容器启动情况
docker ps

image

  • 查看数据卷挂载情况
# docker inspect 容器ID
docker inspect 83c2277ca284

image

配置数据库远程访问

  • 进入容器
# docker exec -it 镜像ID /bin/bash
docker exec -it 9e2921232a87 /bin/bash

image

  • 登录mysql
mysql -h 192.168.0.20 -P 3306 -u root -p
  • 设置远程访问
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
# 退出容器
exit;

使用navicat等工具可以测试数据库是否正常连通。

修改配置文件

由于上面我们已经将配置文件挂载到宿主机上,所以修改配置文件只需要在挂载目录中创建my.cnf文件并按实际情况进行配置即可。
上面我们挂载的目录为:/data/mysql/conf,因此在该目录下创建my.cnf文件

vi /data/mysql/conf/my.cnf

最后附上我们自己使用的配置文件:

[mysqld]
port=3306
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
pid-file=/var/run/mysqld/mysqld.pid
symbolic-links=0
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 1G
innodb_purge_rseg_truncate_frequency = 128
#log-bin=mysql-bin
binlog-ignore-db=mysql
#autocommit = 1
character_set_server=utf8mb4
max_connections = 1500
max_connect_errors = 1200
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
join_buffer_size = 134217728
tmp_table_size = 67108864
max_allowed_packet = 1073741824
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
interactive_timeout = 1800
wait_timeout = 1800
read_buffer_size = 16777216
read_rnd_buffer_size = 33554432
sort_buffer_size = 33554432
lower_case_table_names = 1
slow_query_log = OFF
#slow_query_log_file = slow.log
#log_queries_not_using_indexes = 1
#log_slow_admin_statements = 1
#log_slow_slave_statements = 1
#log_bin_trust_function_creators = 1
#log_throttle_queries_not_using_indexes = 10
#expire_logs_days = 7
#long_query_time = 2
min_examined_row_limit = 100
innodb_page_size = 16K
innodb_buffer_pool_size = 20G
innodb_buffer_pool_instances = 6
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_lru_scan_depth = 2000
innodb_lock_wait_timeout = 1
innodb_io_capacity = 400
innodb_io_capacity_max = 800
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_undo_logs = 128
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 4G
#innodb_undo_tablespaces = 3
innodb_flush_neighbors = 1
innodb_log_file_size = 4G
innodb_log_buffer_size = 32M
innodb_purge_threads = 4
innodb_large_prefix = 1
innodb_thread_concurrency = 64
innodb_print_all_deadlocks = 1
innodb_flush_log_at_trx_commit=2
sync_binlog=200
innodb_write_io_threads = 16
innodb_read_io_threads = 16
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_purge_rseg_truncate_frequency = 128
interactive_timeout = 10
[client]
port=3306
#socket=/iotp/mysql/mysql.sock
posted @ 2022-06-12 23:36  JcongJason  阅读(1241)  评论(0编辑  收藏  举报