赞
踩
使用Docker过程中,往往需要对数据进行持久化,或者多个容器之间进行数据共享,这就需要我们熟悉容器的数据管理操作
容器中管理数据主要的两种方式:
将主机操作系统目录直接映射进容器,类似于Linux中的mount。数据卷很好的解耦了容器应用和数据。对数据卷内数据的操作(无论是在本地主机还是容器内),都会立即生效。
docker run -d -p 3307:3306 -v /my/custom:/etc/mysql/conf.d \
-v /my/own/datadir:/var/lib/mysql --restart always --name mysql01 mysql:5.7
`-v hostDir:containerDir`:hostDir不存在会自动创建,默认权限是rw,也可以改为ro,这样容器内部就无法对数据卷的数据进行修改了。
```powershell
docker run -d -p 3307:3306 -v /my/custom:/etc/mysql/conf.d:ro \
-v /my/own/datadir:/var/lib/mysql --restart always --name mysql01 mysql:5.7
#数据卷创建
docker volume create [OPTIONS] [VOLUME]
docker volume create hello
docker run -d -p 3307:3306 -v hello:/etc/mysql/conf.d \
-v /my/own/datadir:/var/lib/mysql --restart always --name mysql01 mysql:5.7
#数据卷列表
docker volume ls
#数据卷详情
docker volume inspect hello
```powershell
[
{
"CreatedAt": "2020-04-08T06:43:08Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/hello/_data",
"Name": "hello",
"Options": {},
"Scope": "local"
}
]
#docker cp 用于容器与主机之间的数据拷贝
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
SRC_PATH
指定为一个文件
DEST_PATH
不存在:文件名为 DEST_PATH
,内容为SRC的内容DEST_PATH
不存在并且以 /
结尾:报错DEST_PATH
存在并且是文件:目标文件内容被替换为SRC_PATH的文件内容。DEST_PATH
存在并且是目录:文件复制到目录内,文件名为SRC_PATH指定的名字SRC_PATH
指定为一个目录
DEST_PATH
不存在:DEST_PATH
创建文件夹,复制源文件夹内的所有内容
DEST_PATH
存在是文件:报错
DEST_PATH
存在是目录
SRC_PATH
不以 /.
结束:源文件夹复制到目标里面SRC_PATH
以 /.
结束:源文件夹里面的内容复制到目标里面自动创建文件夹不会做递归。把父文件夹做好
2、数据卷容器
如果需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但他专门用来提供数据卷供其他容器挂载。
docker run -it -v /idata --name idata ubuntu
docker run -it --volumes-from idata --name d01 ubuntu
docker run -it --volumes-from idata --name d02 ubuntu
#使用–volumes-from参数所挂载的数据卷容器本身不需要保持在运行状态
3、数据卷的用法细节
docker run -d -P --name nginx nginx
#方便修改nginx的配置和html页面等
#容器中 /usr/share/nginx/html
#容器中 /etc/nginx
##参照一下各种写法
docker run -d -P --name nginx -v /opt/nginx/html:/usr/share/nginx/html nginx;
#为什么看到的是403而不是index页面内容。原来容器里面变为空了?主机的内容复制到容器中,导致,容器同步到了主机的空文件夹。
#特别是配置问津,必须提前保证我们主机挂载的目录里面提前有内容。
docker run -d -P --name nginx -v /opt/nginx:/etc/nginx nginx
#为什么docker ps看不到;出错了。open() “/etc/nginx/nginx.conf” failed (2: No such file or directory) nginx: [emerg] open() “/etc/nginx/nginx.conf” failed (2: No such file or directory)
#我就想自定义挂载路径,并且把他们挂载出来?
# 1、复制容器的文件
docker cp
1、启动一个nginx,先不挂载。
2、docker cp把运行中的nginx的内容复制出来
Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker cp nginx:/usr/share/nginx/html /opt/hahanginx
nginx:/usr/share/nginx/html/. 把html里面的内容复制到 /opt/hahanginx
nginx:/usr/share/nginx/html 把html文件夹复制到 /opt/hahanginx
完整过程
mkdir /opt/nginx
docker cp nginx:/usr/share/nginx/html /opt/nginx 复制html
docker cp nginx:/etc/nginx/. /opt/nginx/conf
docker run -d -P --name nginx -v /opt/nginx/conf:/etc/nginx -v /opt/nginx/html:/usr/share/nginx/html nginx
docker run -d -P --name nginx02 -v
容器路径
eg:
docker run -d -P --name nginx02 -v /usr/share/nginx/html -v /etc/nginx nginx
想要知道到底迎合到主机的哪里了?
docker inspect nginx02. "Mounts": [ { "Type": "volume", "Name": "9f4f8ac4c9cd9cb77df7a5386a5b68520c98ea1bb28e26b6593255c1d0ff9cdf", "Source": "/var/lib/docker/volumes/9f4f8ac4c9cd9cb77df7a5386a5b68520c98ea1bb28e26b6593255c1d0ff9cdf/_data", "Destination": "/usr/share/nginx/html", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "68afef2bf4979e2c9369f6eb68f8a94adc61e63d3a1fb3dad7469e243442cf32", "Source": "/var/lib/docker/volumes/68afef2bf4979e2c9369f6eb68f8a94adc61e63d3a1fb3dad7469e243442cf32/_data", "Destination": "/etc/nginx", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
#匿名挂载的缺点?不好维护。 docker volume可以维护他们
docker volume ls
#具名挂载。有卷。如果有可视化界面。我们就知道卷是干嘛,就不乱删除了。
#创建好的卷,会自动的和容器中需要挂载的这个文件夹做好同步。
docker volume create 卷名字, 创建一个卷。/var/lib/docker/volumes/自定义的卷名/_data
docker run -d -P --name nginx03 -v nginxconf:/etc/nginx -v nginxhtml:/usr/share/nginx/html nginx
最佳实战。
怎么判断挂载的是卷名而不是本机目录名
不以/开始就是卷名,以/开始就是主机名。
#改变文件的读写权限
#ro:readonly rw:readwrite; 指定容器对我们这个挂载出来的内容的读写权限
docker run -d -P --name nginx04 -v nginx04conf:/etc/nginx:ro -v nginx04html:/usr/share/nginx/html:rw nginx
ro:效果
root@c721b01b2752:/etc/nginx# echo 123 > nginx.conf
bash: nginx.conf: Read-only file system
容器内不能再对ro指定的所有进行修改了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。