数据持久化:Data Volume
Volume 的类型
- 受管理的data Valume,由docker后台自动创建
- 绑定挂载的volume,具体挂载位置可以由用户指定
安装插件,将本地文件拷贝到vagrant host
vagrant plugin install vagrant-scp
mysql的Dockerfile 中
VOLUME /var/lib/mysql
mysql 启动之后会在本地创建一个volume,这个volume不会随着container的消失而消失。
[vagrant@docker-hello ~]$ sudo docker run -d --name mysql_1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
4002fad9802ff2b67187bcfa13bec77a22efb8058a52a2794e300729f30ee2d1
[vagrant@docker-hello ~]$ sudo docker volume ls
DRIVER VOLUME NAME
local 1a298ad38b398ac029c01d20cca18bcbe60801112554f755528179b4bf0a7c41
[vagrant@docker-hello ~]$ sudo docker volume inspect 694cdebefd057d83e52f95cef57917f23406159f70ced785c79aba0514c2d72b
[
{
"CreatedAt": "2019-10-17T09:48:29Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/694cdebefd057d83e52f95cef57917f23406159f70ced785c79aba0514c2d72b/_data",
"Name": "694cdebefd057d83e52f95cef57917f23406159f70ced785c79aba0514c2d72b",
"Options": null,
"Scope": "local"
}
]
mysql产生的数据会mount到/var/lib/docker/volumes/xxx/_data目录下
创建第二个mysql container
[vagrant@docker-hello ~]$ sudo docker run -d --name mysql_2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
50e1be6fcfbe2e5b8e267b214aa2deffadc118d43e7f55840751ef85a666d0f6
[vagrant@docker-hello ~]$
[vagrant@docker-hello ~]$ sudo docker volume ls
DRIVER VOLUME NAME
local 1a298ad38b398ac029c01d20cca18bcbe60801112554f755528179b4bf0a7c41
local 149c2ea615209c1c5bd758b930e173a8674644cc2eb0c813be888525d4b81ca3
local 694cdebefd057d83e52f95cef57917f23406159f70ced785c79aba0514c2d72b
现在把container删除,对应volume是不会被删除的
[vagrant@docker-hello ~]$ sudo docker stop mysql_1 mysql_2
mysql_1
mysql_2
[vagrant@docker-hello ~]$ sudo docker rm mysql_1 mysql_2
mysql_1
mysql_2
[vagrant@docker-hello ~]$ sudo docker volume ls
DRIVER VOLUME NAME
local 1a298ad38b398ac029c01d20cca18bcbe60801112554f755528179b4bf0a7c41
local 149c2ea615209c1c5bd758b930e173a8674644cc2eb0c813be888525d4b81ca3
local 694cdebefd057d83e52f95cef57917f23406159f70ced785c79aba0514c2d72b
data volume的名字不是很友好。可以给volume起一个别名,在创建container的时候加上-v mysql:/var/lib/mysql
[vagrant@docker-hello ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[vagrant@docker-hello ~]$ sudo docker run -d -v mysql:/var/lib/mysql --name mysql_2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true
mysql
762323198d02a9daa4bfb14f84130dd0694b6f22e695ea45a454104104a95132
[vagrant@docker-hello ~]$ sudo docker volume ls
DRIVER VOLUME NAME
local mysql
进入mysql_2container中创建一个docker database
[vagrant@docker-hello ~]$ sudo docker exec -it mysql_2 /bin/bash
root@762323198d02:/# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.18 MySQL Community Server - GPL
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql> create database docker;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| docker |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
退出容器删除mysql_2 container。
[vagrant@docker-hello ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
762323198d02 mysql "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 3306/tcp, 33060/tcp mysql_2
[vagrant@docker-hello ~]$ sudo docker rm -f mysql_2
mysql_2
[vagrant@docker-hello ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
删除容器之后volume仍然存在
[vagrant@docker-hello ~]$ sudo docker volume ls
DRIVER VOLUME NAME
local mysql
重新创建一个container来使用这个volume
[vagrant@docker-hello ~]$ sudo docker run -d -v mysql:/var/lib/mysql --name mysql_3 -e MYSQL_ALLOW_EMPTY_PASSWORD=true
mysql
6c19583dfd95d47e877d9c65bc52b6757b6e9d1fcb1cfb387a24d284312d95f0
进入容器能看到之前创建的docker数据表
[vagrant@docker-hello ~]$ sudo docker exec -it mysql_3
"docker exec" requires at least 2 arguments.
See 'docker exec --help'.
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container
[vagrant@docker-hello ~]$ mysql -u root
-bash: mysql: command not found
[vagrant@docker-hello ~]$ sudo docker exec -it mysql_3 /bin/bash
root@6c19583dfd95:/# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.18 MySQL Community Server - GPL
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases
-> ;
+--------------------+
| Database |
+--------------------+
| docker |
| information_schema |
| mysql |
| performance_schema |
| sys |
数据持久化:Bind Mounting
build 一个docker image
[vagrant@docker-host docker-nginx]$ docker build -t ehuamay/my-nginx .
创建container
[vagrant@docker-host docker-nginx]$ docker run -d -p 80:80 --name web ehuamay/my-nginx
8a6e0a526838255a6761fa7975fc93b2f325c33cc2a9a3e1e4f8cc0db2cba6a7
[vagrant@docker-host docker-nginx]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a6e0a526838 ehuamay/my-nginx "nginx -g 'daemon of…" 25 seconds ago Up 24 seconds 0.0.0.0:80->80/tcp web
[vagrant@docker-host docker-nginx]$ curl 127.0.0.1
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>hello</title>
</head>
<body>
<h1>Hello Docker! </h1>
</body>
</html>
删除容器重新创建
[vagrant@docker-host docker-nginx]$ docker rm -f web
web
新创建容器将本地目录映射到docker中的指定目录 -v $(pwd): docker目录
[vagrant@docker-host docker-nginx]$ docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web ehuamay/my-nginx
9e9758990997fbd60df782bf08e454fa7f21fa797351fef2b2da17b5bd3bd5ba
进入容器中 touch一个文件然后退出容器,发现本地也生成一个新的文件
[vagrant@docker-host docker-nginx]$ docker exec -it web /bin/bash
root@9e9758990997:/usr/share/nginx/html# ls
Dockerfile index.html