前言
將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
- 通過數據卷方式啟動容器
# 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
- 查看數據卷掛載情況
# docker inspect 容器ID
docker inspect 83c2277ca284
配置數據庫遠程訪問
- 進入容器
# docker exec -it 鏡像ID /bin/bash
docker exec -it 9e2921232a87 /bin/bash
- 登錄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