Eli's Blog

1. 数据卷设计的目的

  • 经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或多个容器提供访问。
  • 在于数据的永久化,它完全独立于容器的生命周期。因此,Docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾回收机制,对容器引用的数据卷进行处理

2. 添加数据卷

1
2
docker run -it -v ~/datavolume:/data ubuntu /bin/bash
docker run -it -v ~/datavolume:/data:ro ubuntu /bin/bash
1
2
3
FROM ubuntu
VOLUME ['/datavolume1', '/datavolume2']
CMD /bin/bash

3. 共享数据卷

1
2
3
4
5
docker run --rm --name dvt1 -v /docker_data:/data -it ubuntu

# 共享数据卷
docker run --rm --name dvt2 --volumes-from dvt1 -it ubuntu
docker run --rm --name dvt3 --volumes-from dvt1 -it ubuntu

4. 实例:安装 MySQL 主从数据库

4.1 创建配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
mkdir -p /mysql_data/conf
mkdir -p /mysql_data/master
mkdir -p /mysql_data/slave

# 主节点配置
cat > /mysql_data/conf/master.conf <<EOF
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
log_bin = log # 开启二进制日志,用于从节点的历史复制回放
collation-server = utf8_unicode_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
server_id = 1 # 需保证主库和从库的server_id不同
replicate-do-db=fileserver # 需要复制的数据库名,复制多个数据库时,重复设置即可
EOF

# 从节点配置
cat > /mysql_data/conf/slave.conf <<EOF
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
log_bin = log # 开启二进制日志,用于从节点的历史复制回放
collation-server = utf8_unicode_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
server_id = 2 # 需保证主库和从库的server_id不同
replicate-do-db=fileserver # 需要复制的数据库名,复制多个数据库时,重复设置即可
EOF

4.2 启动MYSQL容器

1
2
3
4
5
6
7
8
9
10
11
# 主节点
docker run -d --name mysql-master -p 13306:3306 \
-v /mysql_data/conf/master.conf:/etc/mysql/mysql.conf.d/mysqld.cnf \
-v /mysql_data/master:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

# 从节点
docker run -d --name mysql-slave -p 13307:3306 \
-v /mysql_data/conf/slave.conf:/etc/mysql/mysql.conf.d/mysqld.cnf \
-v /mysql_data/slave:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

4.3 宿主机安装 MYSQL 客户端

1
2
3
4
5
6
7
8
9
10
11
12
# 卸载 mariadb 组件
$ yum list installed | grep -i mariadb
mariadb-libs.x86_64 1:5.5.65-1.el7 @anaconda

$ yum remove -y mariadb-libs

# 安装 mysql repo
yum -y install http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

# 安装客户端
yum search mysql-community
yum install -y mysql-community-client

4.4 配置同步信息

4.4.1 主节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 不要使用localhost,使用本机公网IP
mysql -uroot -h 192.168.31.60 -P13306 -p

# 授权slave节点登录
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slave';
mysql> flush privileges;
mysql> create database utime default character set utf8mb4;

mysql> show master status\G
*************************** 1. row ***************************
File: log.000001
Position: 582
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

4.4.2 从节点

1
2
3
4
5
6
7
8
mysql -uroot -h 192.168.31.60 -P13307 -p   # 不要使用localhost,使用本机公网IP

mysql> stop slave;
mysql> create database utime default character set utf8mb4;
mysql> CHANGE MASTER TO MASTER_HOST='192.168.31.60', MASTER_PORT=13306, MASTER_USER='slave', MASTER_PASSWORD='slave', MASTER_LOG_FILE='log.000001', MASTER_LOG_POS=627;

mysql> start slave;
mysql> show slave status\G