docker中的Mysql数据卷与持久化
本文通过两个mysql容器(一个挂载一个无挂载)测试docker的持久化
结论
容器状态/持久化 | 无挂载 | 有挂载 |
---|---|---|
pause | Y | Y |
stop->start | Y | Y |
rm -> up | N | Y |
环境
mac docker-compose
~/Workspace/docker/volume-learn docker-compose -v
docker-compose version 1.23.2, build 1110ad01
~/Workspace/docker/volume-learn docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:39 2019
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false
步骤
docker-compose.yml
version: '3'
services:
mysql_1:
image: mysql:5.7
container_name: test_mysql_1
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=base
- MYSQL_USER=dbuser
- MYSQL_PASSWORD=topsecret
- MYSQL_PORT=3306
ports:
- "3306:3306"
mysql_2:
image: mysql:5.7
container_name: test_mysql_2
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=base
- MYSQL_USER=dbuser
- MYSQL_PASSWORD=topsecret
- MYSQL_PORT=3306
ports:
- "3307:3306"
volumes:
- ./data/mysql_db:/var/lib/mysql
启动
docker-compose up -d
Creating test_mysql_1 ... done
Creating test_mysql_2 ... done
查看挂载情况
docker volume ls
DRIVER VOLUME NAME
local 8c45070e36f1884b5d8a38fe73667fd0ed2bd6bfb8ad55ca6ff66f1fcebded6d
~/Workspace/docker/volume-learn > docker inspect test_mysql_1 | grep Mounts -A 10
"Mounts": [
{
"Type": "volume",
"Name": "8c45070e36f1884b5d8a38fe73667fd0ed2bd6bfb8ad55ca6ff66f1fcebded6d",
"Source": "/var/lib/docker/volumes/8c45070e36f1884b5d8a38fe73667fd0ed2bd6bfb8ad55ca6ff66f1fcebded6d/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
~/Workspace/docker/volume-learn > docker inspect test_mysql_2 | grep Mounts -A 10
"Mounts": [
{
"Type": "bind",
"Source": "/Users/lifan/Workspace/docker/volume-learn/data/mysql_db",
"Destination": "/var/lib/mysql",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
}
],
"Config": {
~/Workspace/docker/volume-learn ll
total 8
drwxr-xr-x 3 lifan staff 102B 8 5 16:46 data
-rw-r--r-- 1 lifan staff 713B 8 5 16:50 docker-compose.yml
MacOS 进入默认挂载目录
mac OS
cd ~/Library/Containers/com.docker.docker/Data/vms/0/
screen tty
# 页面悬停
Ctrl + C
linuxkit-025000000001:~# cd /var/lib/docker/volumes/
linuxkit-025000000001:/var/lib/docker/volumes# ls
8c45070e36f1884b5d8a38fe73667fd0ed2bd6bfb8ad55ca6ff66f1fcebded6d
metadata.db
linuxkit-025000000001:/var/lib/docker/volumes#
# 同时按住Ctrl和a,然后放开再按下d
Ctrl + A D # 退出
screen -r # 重新登入
# 同时按住Ctrl和a,然后放开再按下k
Ctrl + A + K # 彻底退出
写入数据
test_mysql_1
CREATE TABLE `user_1` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
test_mysql_2
CREATE TABLE `user_2` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
测试
停止重启
~/Workspace/docker/volume-learn docker-compose stop
Stopping test_mysql_2 ... done
Stopping test_mysql_1 ... done
~/Workspace/docker/volume-learn docker-compose start
Starting mysql_1 ... done
Starting mysql_2 ... done
两个数据都还在
暂停重启
~/Workspace/docker/volume-learn docker-compose pause
Pausing test_mysql_1 ... done
Pausing test_mysql_2 ... done
~/Workspace/docker/volume-learn docker inspect test_mysql_1
[
{
"Id": "55193429b7f8b548bcc74ac02239468ef80b439a81597a68503e6ed37097fa78",
"Created": "2019-08-05T09:00:36.5867032Z",
"Path": "docker-entrypoint.sh",
"Args": [
"mysqld"
],
"State": {
"Status": "paused",
"Running": true,
"Paused": true,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 37015,
"ExitCode": 0,
"Error": "",
"StartedAt": "2019-08-05T09:49:14.9745542Z",
"FinishedAt": "2019-08-05T09:44:37.1531094Z"
},
~/Workspace/docker/volume-learn docker-compose unpause
Unpausing test_mysql_2 ... done
Unpausing test_mysql_1 ... done
数据没有丢失
删除容器重启
~/Workspace/docker/volume-learn docker-compose stop
Stopping test_mysql_2 ... done
Stopping test_mysql_1 ... done
~/Workspace/docker/volume-learn docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
317f7f035b4e mysql:5.7 "docker-entrypoint.s…" About an hour ago Exited (0) 27 seconds ago test_mysql_2
55193429b7f8 mysql:5.7 "docker-entrypoint.s…" About an hour ago Exited (0) 27 seconds ago test_mysql_1
1e330d4da45d 46f8a1ba43b9 "./web" About an hour ago Up About an hour k8s_leeroy-web_leeroy-web-66575d8bc7-t4n88_default_f3fe20ff-8b43-11e9-8f64-025000000001_1
1aabdb1a4df2 4e70f93f0150 "./app" About an hour ago Up About an hour k8s_leeroy-app_leeroy-app-5b597594f4-7kwwr_default_f3dc703c-8b43-11e9-8f64-025000000001_1
~/Workspace/docker/volume-learn
~/Workspace/docker/volume-learn docker container prune -f
Deleted Containers:
317f7f035b4e6bd80f987119acb9280735572dfa4fb74492aa365acf89b66e7b
55193429b7f8b548bcc74ac02239468ef80b439a81597a68503e6ed37097fa78
df6251c751c704805fa682a2950b50102589790099f4abd29a3d0c8d37f38ec4
3f513d14c78300cbc88fdc794326caaca5caea549110ceeb8288b5223f314dd4
a9f27228b8e6754594152f9566e7864ec0780c57ef7bf215a2bcf0423bee5d24
a8992b319d0af91a8d69f8c37e7f76068e84cbdb3a1816dffeaa9f1ce1b09dbf
Total reclaimed space: 0B
docker-compose up
test_mysql_2 数据没有丢失
test_mysql_1 数据丢失
~/Workspace/docker/volume-learn docker inspect test_mysql_1 | grep Mounts -A 10
"Mounts": [
{
"Type": "volume",
"Name": "695c64bb2b3e0d36e4c14170aca4ba2e81dba29915458e8384456eb7751351d0",
"Source": "/var/lib/docker/volumes/695c64bb2b3e0d36e4c14170aca4ba2e81dba29915458e8384456eb7751351d0/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
~/Workspace/docker/volume-learn docker volume ls
DRIVER VOLUME NAME
local 8c45070e36f1884b5d8a38fe73667fd0ed2bd6bfb8ad55ca6ff66f1fcebded6d
local 695c64bb2b3e0d36e4c14170aca4ba2e81dba29915458e8384456eb7751351d0
删除test_mysql_2的挂载目录再重启
直接删除挂载目录
容器没有停止
~/Workspace/docker/volume-learn ll
total 8
drwxr-xr-x 3 lifan staff 102B 8 5 16:46 data
-rw-r--r-- 1 lifan staff 713B 8 5 16:50 docker-compose.yml
~/Workspace/docker/volume-learn rm -rf data
~/Workspace/docker/volume-learn
访问数据库,可以连接,但是没有数据
创建数据库失败
create database base;
Can't create database 'base' (errno: 1808635584)
重启容器
data目录被创建,再次挂载到主机目录
~/Workspace/docker/volume-learn docker-compose stop
Stopping test_mysql_2 ... done
Stopping test_mysql_1 ... done
~/Workspace/docker/volume-learn docker-compose start
Starting mysql_1 ... done
Starting mysql_2 ... done
~/Workspace/docker/volume-learn ll
total 8
drwxr-xr-x 3 lifan staff 102B 8 5 18:25 data
-rw-r--r-- 1 lifan staff 713B 8 5 16:50 docker-compose.yml
~/Workspace/docker/volume-learn
创建表,写入数据
CREATE TABLE `user_2` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
停止删除容器再启动
~/Workspace/docker/volume-learn docker-compose stop
Stopping test_mysql_2 ... done
Stopping test_mysql_1 ... done
~/Workspace/docker/volume-learn docker rm 77466edd2bd2
77466edd2bd2
~/Workspace/docker/volume-learn docker-compose up -d
Starting test_mysql_1 ... done
Creating test_mysql_2 ... done
~/Workspace/docker/volume-learn
数据还在,容器工作正常