docker数据卷学习

一 新建带有数据卷的容器

1.从docker hub下载centos7镜像

# docker pull centos

2. 创建container

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

3. 配置container

# yum -y install libaio openssl openssl-devel net-tools vim wget libncurses*
# groupadd -r dba
# mkdir /usr/local/mysql
# useradd -r -g dba -G root -d /usr/local/mysql mysqladmin
# cat /my.cnf
# chown mysqladmin.dba /etc/my.cnf
# su - mysqladmin
$ cp -r /etc/skel/.bash* /usr/local/mysql
$ cat .bash_profile
# .bash_profile # Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi # User specific environment and startup programs export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH:$HOME/bin $ cat .bashrc
# .bashrc # Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi # User specific environment
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
export PATH # Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER= # User specific aliases and functions
alias ll="ls -l"

my.cnf

[client]
port = 3306
socket = /usr/local/mysql/data/mysql.sock [mysqld]
port = 3306
socket = /usr/local/mysql/data/mysql.sock skip-external-locking
key_buffer_size = 256M
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
query_cache_size= 32M
max_allowed_packet = 16M
myisam_sort_buffer_size=128M
tmp_table_size=32M table_open_cache = 1024
thread_cache_size = 8
#wait_timeout = 86400
#interactive_timeout = 86400
max_connections = 1000
wait_timeout = 28800
interactive_timeout = 28800 #isolation level and default engine
default-storage-engine = INNODB
transaction-isolation = READ-COMMITTED server-id = 1
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
pid-file = /usr/local/mysql/data/hostname.pid #open performance schema
log-warnings
sysdate-is-now
log_timestamps=SYSTEM
log-error-verbosity = 3 binlog_format = MIXED
log_bin_trust_function_creators=1
log-error = /usr/local/mysql/data/hostname.err
log-bin=/usr/local/mysql/arch/mysql-bin
#other logs
#general_log =1
#general_log_file = /usr/local/mysql/data/general_log.err
#slow_query_log=1
#slow_query_log_file=/usr/local/mysql/data/slow_log.err #for replication slave
#log-slave-updates
#sync_binlog = 1 #for innodb options
innodb_data_home_dir = /usr/local/mysql/data/
innodb_data_file_path = ibdata1:500M:autoextend
innodb_log_group_home_dir = /usr/local/mysql/arch
innodb_log_files_in_group = 2
innodb_log_file_size = 200M innodb_buffer_pool_size = 1024M
#innodb_additional_mem_pool_size = 50M
innodb_log_buffer_size = 16M innodb_lock_wait_timeout = 100
#innodb_thread_concurrency = 0
innodb_flush_log_at_trx_commit = 1 #innodb io features: add for mysql5.5.8
performance_schema
innodb_read_io_threads=4
innodb-write-io-threads=4
innodb-io-capacity=200
#purge threads change default(0) to 1 for purge
innodb_purge_threads=1
innodb_use_native_aio=on #case-sensitive file names and separate tablespace
innodb_file_per_table = 1
lower_case_table_names=1 secure-file-priv = ""
explicit_defaults_for_timestamp = 1 [mysqldump]
quick
max_allowed_packet = 16M [mysql]
no-auto-rehash [mysqlhotcopy]
interactive-timeout [myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

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

# docker commit mysql-container mysql:version1

删除现有容器

# docker stop mysql-container
# docker rm mysql-container
mysql-container

5. 创建数据卷

# docker volume create mysql-vol
# docker volume inspect mysql-vol
[
{
"CreatedAt": "2019-10-23T15:23:28+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/usr/local/docker/volumes/mysql-vol/_data",
"Name": "mysql-vol",
"Options": {},
"Scope": "local"
}
]

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

# 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. 在该容器内配置数据库

# su - mysqladmin
$ cd /usr/local/mysql
$ wget https://downloads.mysql.com/archives/get/file/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
$ tar -zxf mysql-5.7.-linux-glibc2.-x86_64.tar.gz
$ rm -rf mysql-5.7.-linux-glibc2.-x86_64.tar.gz
$ mv mysql-5.7.-linux-glibc2.-x86_64/* .
$ rm -rf mysql-5.7.18-linux-glibc2.5-x86_64
$ mkdir arch
$ bin/mysqld --initialize --user=mysqladmin --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
$ bin/mysql_ssl_rsa_setup --basedir=/usr/local/mysql
Ignoring -days; not generating a certificate
Generating a RSA private key
.+++++
...+++++
writing new private key to 'ca-key.pem'
-----
Ignoring -days; not generating a certificate
Generating a RSA private key
..................+++++
.+++++
writing new private key to 'server-key.pem'
-----
Ignoring -days; not generating a certificate
Generating a RSA private key
.......+++++
.............+++++
writing new private key to 'client-key.pem'
-----

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

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

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

$ bin/mysqld_safe &
$ mysql -uroot -p'SfpVWhtn5s;R'
mysql> show databases;
ERROR (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> set password for 'root'@'localhost' = PASSWORD('mypna123');
Query OK, rows affected, warning (0.02 sec)
mysql> flush privileges;
Query OK, rows affected (0.02 sec)
mysql> \q
$ mysql -uroot -pmypna123
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
rows in set (0.00 sec) $ bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -pmypna123 mysql

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

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

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

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20fcf121dd53 mysql:version1 "/bin/bash" minutes ago Up minutes mysql-container # docker rm -f mysql-container
mysql-container

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

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

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

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

# mkdir /opt/backup1
# 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. 新建准备迁移数据的带有数据卷的容器

# docker volume create mysql-new-vol
# 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. 另外再创建一个新容器,新建数据卷,本地指向生成备份的本地目录,并将要迁移数据的新容器的数据卷挂载到当前的容器中

# 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. k8s权威指南-从xx到oo的实践全接触

    基本概念与术语 集群的2种管理角色:master和node master 集群的控制节点,负责整个集群的管理与控制,运行着关键进程: 1,k8s api server: 提供了HTTP Rest 接口 ...

  2. java 强制类项转换

    origin:http://blog.csdn.net/hikvision_java_gyh/article/details/8957450 编写java程序时,引用变量只能调用它编译时的类项方法.而 ...

  3. MacBook pro管理员变成普通用户无法解锁问题

    最近使用Mac的时候,把管理员的名字修改了一下,WTF?没有管理员权限了?然后就没有解锁权限了,这可以说是Mac的一个致命bug呀!下载软件也不可以了.具体我的解决方式在这里记录一下,以供和我遇到同样 ...

  4. JSP通过URL给Servlet传值

    jsp传数据: <a id="a1" href="" ></a> <script> $("#a1").a ...

  5. SWPUCTF2019 | 神奇的二维码

    拖到binwalk里面发现4个压缩包: 查找一下RAR的文件头,然后把它们提取出来: 第一个base64一下得到第二个压缩包的密码: 第二个压缩包可以,emmm,保存一下扩充一下自己的表情包库: 第三 ...

  6. 【知识库】-数据库_MySQL之高级数据查询:去重复、组合查询、连接查询、虚拟表

    简书作者:seay 文章出处: 关系数据库SQL之高级数据查询:去重复.组合查询.连接查询.虚拟表 回顾:[知识库]-数据库_MySQL之基本数据查询:子查询.分组查询.模糊查询 Learn [已经过 ...

  7. XAMPP是什么?

    XAMPP=Apache + MySQL + PHP + Perl,是一个完全免费,易于安装和使用Apache发行版,包含了Apache.MySQL.PHP和Perl.支持Windows.Linux和 ...

  8. Visual Studio Code-Vscode下快速补全新建HTML文件默认代码

    1.新建文件. 2.点击右下角文档格式:纯文本,上方弹出框输入HTML改成 html文档格式. 3.输入“ !”,按tab. 4.完成.

  9. 小D课堂 - 新版本微服务springcloud+Docker教程_2_01传统架构演进到分布式架构

    笔记 第二章 架构演进和分布式系统基础知识 1.传统架构演进到分布式架构     简介:讲解单机应用和分布式应用架构演进基础知识 (画图) 高可用 LVS+keepalive :负载均衡的知识点 1. ...

  10. zabbix(2)使用指南

    一.邮件报警(一个客户端安装server,agent) 管理->报警媒介类型->email 管理->用户->Admin->报警媒介 配置->动作->Repor ...