docker数据卷学习

一 新建带有数据卷的容器

1.从docker hub下载centos7镜像

  1. # docker pull centos

2. 创建container

  1. # docker run --name mysql-container --hostname mysql -it centos /bin/bash

3. 配置container

  1. # yum -y install libaio openssl openssl-devel net-tools vim wget libncurses*
  2. # groupadd -r dba
  3. # mkdir /usr/local/mysql
  4. # useradd -r -g dba -G root -d /usr/local/mysql mysqladmin
  5. # cat /my.cnf
  6. # chown mysqladmin.dba /etc/my.cnf
  7. # su - mysqladmin
  8. $ cp -r /etc/skel/.bash* /usr/local/mysql
  9. $ cat .bash_profile
  10. # .bash_profile
  11.  
  12. # Get the aliases and functions
  13. if [ -f ~/.bashrc ]; then
  14. . ~/.bashrc
  15. fi
  16.  
  17. # User specific environment and startup programs
  18.  
  19. export MYSQL_HOME=/usr/local/mysql
  20. export PATH=$MYSQL_HOME/bin:$PATH:$HOME/bin
  21.  
  22. $ cat .bashrc
  23. # .bashrc
  24.  
  25. # Source global definitions
  26. if [ -f /etc/bashrc ]; then
  27. . /etc/bashrc
  28. fi
  29.  
  30. # User specific environment
  31. PATH="$HOME/.local/bin:$HOME/bin:$PATH"
  32. export PATH
  33.  
  34. # Uncomment the following line if you don't like systemctl's auto-paging feature:
  35. # export SYSTEMD_PAGER=
  36.  
  37. # User specific aliases and functions
  38. alias ll="ls -l"

my.cnf

  1. [client]
  2. port = 3306
  3. socket = /usr/local/mysql/data/mysql.sock
  4.  
  5. [mysqld]
  6. port = 3306
  7. socket = /usr/local/mysql/data/mysql.sock
  8.  
  9. skip-external-locking
  10. key_buffer_size = 256M
  11. sort_buffer_size = 2M
  12. read_buffer_size = 2M
  13. read_rnd_buffer_size = 4M
  14. query_cache_size= 32M
  15. max_allowed_packet = 16M
  16. myisam_sort_buffer_size=128M
  17. tmp_table_size=32M
  18.  
  19. table_open_cache = 1024
  20. thread_cache_size = 8
  21. #wait_timeout = 86400
  22. #interactive_timeout = 86400
  23. max_connections = 1000
  24. wait_timeout = 28800
  25. interactive_timeout = 28800
  26.  
  27. #isolation level and default engine
  28. default-storage-engine = INNODB
  29. transaction-isolation = READ-COMMITTED
  30.  
  31. server-id = 1
  32. basedir = /usr/local/mysql
  33. datadir = /usr/local/mysql/data
  34. pid-file = /usr/local/mysql/data/hostname.pid
  35.  
  36. #open performance schema
  37. log-warnings
  38. sysdate-is-now
  39. log_timestamps=SYSTEM
  40. log-error-verbosity = 3
  41.  
  42. binlog_format = MIXED
  43. log_bin_trust_function_creators=1
  44. log-error = /usr/local/mysql/data/hostname.err
  45. log-bin=/usr/local/mysql/arch/mysql-bin
  46. #other logs
  47. #general_log =1
  48. #general_log_file = /usr/local/mysql/data/general_log.err
  49. #slow_query_log=1
  50. #slow_query_log_file=/usr/local/mysql/data/slow_log.err
  51.  
  52. #for replication slave
  53. #log-slave-updates
  54. #sync_binlog = 1
  55.  
  56. #for innodb options
  57. innodb_data_home_dir = /usr/local/mysql/data/
  58. innodb_data_file_path = ibdata1:500M:autoextend
  59. innodb_log_group_home_dir = /usr/local/mysql/arch
  60. innodb_log_files_in_group = 2
  61. innodb_log_file_size = 200M
  62.  
  63. innodb_buffer_pool_size = 1024M
  64. #innodb_additional_mem_pool_size = 50M
  65. innodb_log_buffer_size = 16M
  66.  
  67. innodb_lock_wait_timeout = 100
  68. #innodb_thread_concurrency = 0
  69. innodb_flush_log_at_trx_commit = 1
  70.  
  71. #innodb io features: add for mysql5.5.8
  72. performance_schema
  73. innodb_read_io_threads=4
  74. innodb-write-io-threads=4
  75. innodb-io-capacity=200
  76. #purge threads change default(0) to 1 for purge
  77. innodb_purge_threads=1
  78. innodb_use_native_aio=on
  79.  
  80. #case-sensitive file names and separate tablespace
  81. innodb_file_per_table = 1
  82. lower_case_table_names=1
  83.  
  84. secure-file-priv = ""
  85. explicit_defaults_for_timestamp = 1
  86.  
  87. [mysqldump]
  88. quick
  89. max_allowed_packet = 16M
  90.  
  91. [mysql]
  92. no-auto-rehash
  93.  
  94. [mysqlhotcopy]
  95. interactive-timeout
  96.  
  97. [myisamchk]
  98. key_buffer_size = 256M
  99. sort_buffer_size = 256M
  100. read_buffer = 2M
  101. write_buffer = 2M

4. 以上container配置好后生成模板镜像

  1. # docker commit mysql-container mysql:version1

删除现有容器

  1. # docker stop mysql-container
  2. # docker rm mysql-container
  3. mysql-container

5. 创建数据卷

  1. # docker volume create mysql-vol
  2. # docker volume inspect mysql-vol
  3. [
  4. {
  5. "CreatedAt": "2019-10-23T15:23:28+08:00",
  6. "Driver": "local",
  7. "Labels": {},
  8. "Mountpoint": "/usr/local/docker/volumes/mysql-vol/_data",
  9. "Name": "mysql-vol",
  10. "Options": {},
  11. "Scope": "local"
  12. }
  13. ]

6. 根据模板镜像创建新的container

  1. # docker run --name mysql-container -p 3306:3306 --hostname mysql --mount type=volume,source=mysql-vol,target=/usr/local/mysql -it mysql:version1 /bin/bash

二 利用数据卷进行快速的数据库恢复

1. 在该容器内配置数据库

  1. # su - mysqladmin
  2. $ cd /usr/local/mysql
  3. $ wget https://downloads.mysql.com/archives/get/file/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
  4. $ tar -zxf mysql-5.7.-linux-glibc2.-x86_64.tar.gz
  5. $ rm -rf mysql-5.7.-linux-glibc2.-x86_64.tar.gz
  6. $ mv mysql-5.7.-linux-glibc2.-x86_64/* .
    $ rm -rf mysql-5.7.18-linux-glibc2.5-x86_64
  7. $ mkdir arch
  8. $ bin/mysqld --initialize --user=mysqladmin --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
  9. $ bin/mysql_ssl_rsa_setup --basedir=/usr/local/mysql
  10. Ignoring -days; not generating a certificate
  11. Generating a RSA private key
  12. .+++++
  13. ...+++++
  14. writing new private key to 'ca-key.pem'
  15. -----
  16. Ignoring -days; not generating a certificate
  17. Generating a RSA private key
  18. ..................+++++
  19. .+++++
  20. writing new private key to 'server-key.pem'
  21. -----
  22. Ignoring -days; not generating a certificate
  23. Generating a RSA private key
  24. .......+++++
  25. .............+++++
  26. writing new private key to 'client-key.pem'
  27. -----

2. 查看hostname.err,查看数据库默认密码

  1. --23T07::21.237648-: [Note] A temporary password is generated for root@localhost: SfpVWhtn5s;R

3. 启动数据库并修改root密码

  1. $ bin/mysqld_safe &
  2. $ mysql -uroot -p'SfpVWhtn5s;R'
  3. mysql> show databases;
  4. ERROR (HY000): You must reset your password using ALTER USER statement before executing this statement.
  5. mysql> set password for 'root'@'localhost' = PASSWORD('mypna123');
  6. Query OK, rows affected, warning (0.02 sec)
  7. mysql> flush privileges;
  8. Query OK, rows affected (0.02 sec)
  9. mysql> \q
  10. $ mysql -uroot -pmypna123
  11. mysql> show databases;
  12. +--------------------+
  13. | Database |
  14. +--------------------+
  15. | information_schema |
  16. | mysql |
  17. | performance_schema |
  18. | sys |
  19. +--------------------+
  20. rows in set (0.00 sec)
  21.  
  22. $ bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -pmypna123 mysql

4. 我们现在导入数据库备份,模拟数据库正在提供服务

  1. mysql> create database amon;
  2. Query OK, 1 row affected (0.02 sec)
  3. mysql> grant all privileges on amon.* to 'amon'@'%' identified by 'mypna123';
  4. Query OK, 0 rows affected, 1 warning (0.01 sec)
  5. mysql>
  6. mysql> flush privileges;
  7. Query OK, 0 rows affected (0.01 sec)
  1. mysql> create table user_info(id int primary key auto_increment,name varchar(24),age tinyint, birthday date);
  2. Query OK, 0 rows affected (0.14 sec)
  3.  
  4. mysql> insert into user_info(name,age,birthday) values('Crist.Lee',23,'1989/05/07');
  5. Query OK, 1 row affected (0.02 sec)
  6.  
  7. mysql> select * from usr_info;
  8. ERROR 1146 (42S02): Table 'amon.usr_info' doesn't exist
  9. mysql> select * from user_info;
  10. +----+-----------+------+------------+
  11. | id | name | age | birthday |
  12. +----+-----------+------+------------+
  13. | 1 | Crist.Lee | 23 | 1989-05-07 |
  14. +----+-----------+------+------------+
  15. 1 row in set (0.00 sec)

5. 假设该docker因为异常导致服务不可用,强制删除该容器

  1. # docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 20fcf121dd53 mysql:version1 "/bin/bash" minutes ago Up minutes mysql-container
  4.  
  5. # docker rm -f mysql-container
  6. mysql-container

6. 新建容器,挂载前一个容器创建的mysql-vol数据卷

  1. # docker run --name mysql-container --hostname mysql -p : --mount type=volume,source=mysql-vol,target=/usr/local/mysql -it mysql:version1 /bin/bash
  2. [root@mysql /]# su - mysqladmin
  3. $ bin/mysqld_safe &
  4. $ mysql -uamon -pmypna123 amon
  5. mysql> select * from user_info;
  6. +----+-----------+------+------------+
  7. | id | name | age | birthday |
  8. +----+-----------+------+------------+
  9. | | Crist.Lee | | -- |
  10. +----+-----------+------+------------+
  11. row in set (0.02 sec)

三 利用数据卷容器进行数据迁移

1. 新建容器,利用--volume-from属性将旧容器数据卷挂载到新容器中,并对新容器的数据卷挂载点进行备份,在宿主机目录下会生成备份文件mysql_backup.tar.gz

  1. # mkdir /opt/backup1
  2. # docker run --name db1-container --hostname db1 --volumes-from mysql-container --mount type=bind,source=/opt/backup1,target=/backup1 mysql:version1 /bin/bash -c "cd /usr/local/mysql && tar -zcvf /backup1/mysql_backup.tar.gz ."

以上执行完成后会在本地/opt/backup1目录下生成一个数据库的备份文件

2. 新建准备迁移数据的带有数据卷的容器

  1. # docker volume create mysql-new-vol
  2. # docker run --name mysql-new-container --hostname mysql-new --mount type=volume,source=mysql-new-vol,target=/usr/local/mysql -it mysql:version1 /bin/bash

3. 另外再创建一个新容器,新建数据卷,本地指向生成备份的本地目录,并将要迁移数据的新容器的数据卷挂载到当前的容器中

  1. # docker run --name db3-container --hostname db3 --volumes-from db2-container --mount type=volume,source=db3-vol,target=/usr/local/mysql mysql:version1 /bin/bash -c "cp /backup1/mysql_backup.tar.gz /usr/local/mysql && tar zxvf /usr/local/mysql/mysql_backup.tar.gz"

4,.步骤执行完成后,可以在新容器里看到迁移过来的数据

docker数据卷学习-利用数据卷实现mysql的快速恢复和迁移的更多相关文章

  1. 【Docker】利用数据卷容器来备份、恢复、迁移数据卷

    利用数据卷容器来备份.恢复.迁移数据卷 可以利用数据卷对其中的数据进行进行备份.恢复和迁移. 备份 首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载 ...

  2. docker学习5--docker数据卷(volume)

    https://blog.csdn.net/dream_broken/article/details/52314993 1.什么是数据卷volume 为了了解什么是Docker Volume,首先我们 ...

  3. docker进阶篇(一) ---- Volume(数据卷)

    引言 docker的镜像是由多个只读的文件系统叠加在一起形成的.当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层.这时如果修改正在运行的容器中已有的 ...

  4. Docker容器的数据卷(data volume),数据卷容器,数据卷的备份和还原。

    Docker容器的数据卷(data volume),数据卷容器,数据卷的备份和还原. 数据卷就是数据(一个文件或者文件夹). Docker的理念之一是将应用与其运行的环境打包,docker容器的生命周 ...

  5. docker 数据卷和docker数据卷容器以及数据卷的备份和还原

    一:数据卷 1.什么是数据卷 数据卷是通过特殊设计的目录,可以绕过联合文件系统,为一个或者多个容器提供服务,数据卷是在docker宿主机当中,数据卷可以是文件也可以是文件夹. 2.特点 1.数据卷在容 ...

  6. docker挂载本地目录和数据卷容器

    1.docker挂载本地目录 docker可以支持把一个宿主机上的目录挂载到镜像里. 交互模式运行docker run -it -v /home/dock/Downloads:/usr/Downloa ...

  7. Docker(六)容器数据卷

    容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像 需求:数据可以持久化和同步 使用数据卷 指定路径挂载 docker run -it -v 主机目录:容器内目录 # 测试 [root@h ...

  8. Docker系列(20)- 数据卷容器

    数据卷容器 什么是数据卷容器? 容器和容器之间实现数据共享 一个容器先于宿主机创建挂载方式,宿主机就会有改卷的目录 第二个容器使用命令--volumes-from 第一个容器,共享使用了第一个容器与宿 ...

  9. docker血一样的教训,生成容器的时候一定要设置数据卷,把数据文件目录,配置文件目录,日志文件目录都要映射到宿主机上保存啊!!!

    打个比方,比如mysql,如果你想重新设置一下mysql的配置,不小心配错里,启动容器失败,已启动就停止了. 根本进不去mysql的容器里.如果之前run容器的时候,没有把数据文件,日志文件,配置文件 ...

随机推荐

  1. input 唤起键盘后遮住页面元素

    var windheight = $(window).height(); /*未唤起键盘时当前窗口高度*/ $(window).resize(function(){ var docheight = $ ...

  2. flask框架(七): flask模板

    1.模板的使用 Flask使用的是Jinja2模板,所以其语法和Django无差别 2.自定义模板方法 Flask中自定义模板方法的方式和Bottle相似,创建一个函数并通过参数的形式传入render ...

  3. vue-cli3的vue.config.js文件配置,生成dist文件

    //vue.config.jsonconst path = require('path'); // const vConsolePlugin = require('vconsole-webpack-p ...

  4. MessageListenerAdapter--消息监听适配器

    我们把之前的消息监听代码注释,可以不用直接加消息监听,而是采用MessageListenerAdapter的方式,我们来学习下如何使用默认的handleMessage,自定义方法名,自定义转换器. 适 ...

  5. [ubuntu] 外挂硬盘

    1. 查看磁盘信息 fdisk -l 这里我需要对sda进行分区,所以要进到sda中 2. 进到欲分区磁盘中 $ sudo fdisk /dev/sda Welcome to fdisk (util- ...

  6. Java基础__随机生成1~15之间不重复的数字

    package text; import java.util.ArrayList; import java.util.List; public class Text { public static v ...

  7. HNOI2012排队

    排列组合题(本文A(n,m)表示从n个元素里选m个的排列数). 首先,老师和女生有不能相邻的限制条件,应该用插空法.而且老师人数较少且固定,把老师和男生进行混合,对女生用插空. 我先来一手错误做法,n ...

  8. Requests 代理池

    Requests 本身不提供代理池,然而爬数据又要用,所以只能自己搞.其实还挺简单的.我也不知道为什么这么有用的 feature 一直没有被加入. import requests class Clie ...

  9. python接口自动化:python3.6中import Crypto.Hash报错的解决方案

    一:问题 python3.6中算法加密引入包Crypto报错,即便安装了: pip install crypto pip install pycrypto pip install pycryptodo ...

  10. Windows下Git的下载与安装

    1).打开百度,输入Git进行搜索,如下图所示: 2).进入Git官网,由于电脑是Windows系统,选择Downloads for Windows,如下图所示: 3).电脑是64位操作系统,选择下载 ...