赞
踩
数据卷是宿主机中的一个目录或者文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。
一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。
简单来说,数据卷本质其实是共享文件夹,是宿主机与容器之间数据共享的桥梁。
数据卷的作用:
卷技术就是为了实现数据的持久化和同步操作,容器间也是数据共享。
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
- 目录必须是绝对路径
- 如果宿主机目录不存在,会自动创建
- 可以挂载多个数据卷(直接继续跟 -v 参数)
#在创建启动容器时挂载数据卷
[root@localhost opt]# docker run -id --name test -v /opt/test_data:/root/test_data centos:7 /bin/bash
aba73cea46edcd2a30c7a5ba7d782b3c263270f9281684084fff878b00d9b42d
可以在宿主机挂载的目录中创建一个文件或者目录,然后进入容器内查看是否同步数据。
说明:匿名挂载只需要填写容器内路径,Docker 会默认帮我们创建匿名数据卷进行映射和挂载。一般使用具名挂载和指定路径挂载。具名挂载会在 /var/lib/docker/volumes/ 目录下创建对应的数据卷目录;而匿名挂载生成的目录名则是随机的。
#指定路径挂载 [root@localhost opt]# docker run -id --name test -v /opt/test_data:/root/test_data centos:7 /bin/bash #具名挂载 [root@localhost opt]# docker run -id --name test1 -v my_data:/root/test_data centos:7 /bin/bash [root@localhost opt]# docker volume inspect my_data [ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my_data/_data", "Name": "my_data", "Options": {}, "Scope": "local" } ] #查看已有的容器数据卷 [root@localhost opt]# docker volume ls DRIVER VOLUME NAME local 6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f local a2575ccb30033360d5c784a686628771e80d12903f83e8773146aa9dad7a765f local e4f571f1544d753bb2505e391ad88c4d02100ca2ef3caf0ae8dc9bcd42c7160d local my_data local test #匿名挂载 [root@localhost opt]# docker run -id --name test3 -v /root/test_data centos:7 /bin/bash c7bd0c7aa231847042cac9c4ef827b3bbd281144e79f230f9c30b1d8d52a3e5f [root@localhost opt]# docker volume ls DRIVER VOLUME NAME local 4ee1d7e862c36848a7ab57af9dd79c0577e46c4545a05b70dd96203466d27303 local 6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f local a2575ccb30033360d5c784a686628771e80d12903f83e8773146aa9dad7a765f local e4f571f1544d753bb2505e391ad88c4d02100ca2ef3caf0ae8dc9bcd42c7160d local my_data local test [root@localhost opt]# docker volume inspect 6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f [ { "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f/_data", "Name": "6c415d518ce61e5e047bcf8fc33ae43f7882ea6ec38c07675bdb1568eb0d1b7f", "Options": {}, "Scope": "local" } ]
docker volume 命令:
#创建一个自定义容器
[root@localhost opt]# docker volume create my_data
#查看所用容器卷
[root@localhost opt]# docker volume ls
#查看指定容器卷信息
[root@localhost opt]# docker volume inspect
#删除容器卷
[root@localhost opt]# docker volume rm
1)搜索和下载镜像的步骤就省去了
2)创建启动镜像
[root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
8bace46562e55239fe7689b638be1eabaf416cc0c3093e009feac292af0779ca
3)进行验证,我们先进入容器创建一个新的数据库以及表,再插入一条数据,然后退出容器
[root@localhost opt]# docker exec -it my_mysql /bin/bash bash-4.2# mysql -uroot -p123456 ...... mysql> use test; Database changed mysql> create table t_test(id int,name varchar(255)); Query OK, 0 rows affected (0.00 sec) mysql> insert into t_test values(1,"huhai"); Query OK, 1 row affected (0.06 sec) mysql> select * from t_test; +------+-------+ | id | name | +------+-------+ | 1 | huhai | +------+-------+ 1 row in set (0.00 sec) mysql> exit Bye bash-4.2# exit exit
4)然后我们将这个容器给停止之后删除,再创建一个相同路径的数据卷进行挂载,查看是否有我们已经有的数据
[root@localhost opt]# docker stop my_mysql my_mysql [root@localhost opt]# docker rm my_mysql my_mysql [root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 e208b09a924d9849b2f4cca225e3d51ac59f00f1ee64f11b2ba134183f170c76 [root@localhost opt]# docker exec -it my_mysql /bin/bash bash-4.2# mysql -uroot -p123456 ...... mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> use test; Database changed mysql> select * from t_test; +------+-------+ | id | name | +------+-------+ | 1 | huhai | +------+-------+ 1 row in set (0.00 sec) mysql> exit Bye bash-4.2# exit exit
Docker 实际应用中,我们会安装很多容器,然后进行配置。试想一下,一台 Linux 服务器的容器怎么转移到另一台 Linux 服务器?这就涉及到了迁移与备份,我们可以将容器先保存为镜像,然后将镜像保存为压缩包,其他地方需要时可以将这个压缩包转回镜像。大概分为以下三种情况:
1)命令:docker commit
2)作用:将容器保存为镜像
3)语法格式:docker commit 容器名称(或容器ID) 镜像名称:镜像标签
如果不写镜像标签则默认为 latest
[root@localhost opt]# docker commit my_mysql my_mysql:1.0
sha256:1f381fd1b9c929034e5f454e005b0a74535cbcce5406b7b8ea6c8e218ae11886
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_mysql 1.0 1f381fd1b9c9 6 seconds ago 495 MB
docker.io/tomcat latest 1dad8c5497f9 4 weeks ago 474 MB
docker.io/mysql 5.7 d410f4167eea 5 weeks ago 495 MB
docker.io/openjdk 8 b273004037cc 5 months ago 526 MB
docker.io/hello-world latest feb5d9fea6a5 15 months ago 13.3 kB
docker.io/centos 7 eeb6ee3f44bd 16 months ago 204 MB
1)命令:docker save
2)作用:将镜像保存为 tar 包
3)语法:docker save -o tar包名 镜像名称(或镜像ID)
-o 代表输出到的文件
可以指定tar包的路径,即在tar包前面加路径
镜像后面可以跟镜像标签
#不加路径则默认在当前路径下创建tar包 [root@localhost opt]# docker save -o my_mysql.tar my_mysql [root@localhost opt]# ll 总用量 900220 ...... -rw------- 1 root root 510828544 1月 12 10:45 my_mysql.tar drwxr-xr-x 4 root root 4096 1月 11 17:44 mysql ...... #加对应路径 [root@localhost opt]# docker save -o ~/my_mysql2.tar my_mysql [root@localhost opt]# ll ~ 总用量 498904 ...... -rw------- 1 root root 510828544 1月 12 10:48 my_mysql2.tar drwxr-xr-x. 2 root root 4096 12月 16 16:28 公共 ......
1)命令:docker load
2)作用:恢复镜像
3)语法:docker load -i tar包
-i 代表指定导入的文件
#首先删除创建的容器
[root@localhost opt]# docker rm my_mysql
my_mysql
#然后删除刚才备份的镜像
[root@localhost opt]# docker rmi my_mysql:1.0
#通过tar包恢复镜像
[root@localhost opt]# docker load -i my_mysql.tar
bd3382c8b69e: Loading layer [==================================================>] 10.75 kB/10.75 kB
Loaded image: my_mysql:1.0
#创建启动容器
[root@localhost opt]# docker run -id --name my_mysql -p 3600:3306 -v /opt/mysql/conf:/ect/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 my_mysql:1.0
1fb2a85039f89050d8c85c2edb34032a0633e927a38b3a6bcaef7c3949ee0f68
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。