【Docker进阶-04】容器挂载&docker cp

【Docker进阶-04】容器挂载&docker cp

概述

每一个容器里面的内容,支持三种挂载方式:

  1. docker自动在外部创建文件夹自动挂载容器内部指定的文件夹内容【Dockerfile VOLUME指令的作用】
  2. 自己在外部创建文件夹,手动挂载
  3. 可以把数据挂载到内存中。

Volumes(卷) :存储在主机文件系统的一部分中,该文件系统由Docker管理(在Linux上是" / var /lib / docker / volumes /")。 非Docker进程不应修改文件系统的这一部分。 卷是在Docker中持久存储数据的最佳方法。-v 可以自动挂载,到linux主机或者docker自动管理的这一部分区域

Bind mounts(绑定挂载) 可以在任何地方 存储在主机系统上。 它们甚至可能是重要的系统文件或目录。 Docker主机或Docker容器上的非Docker进程可以随时对其进行修改。--mount 挂载到 linux宿主机,手动挂载

tmpfs mounts(临时挂载) 仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统

volume(卷)

卷:就是为了保存数据

docker volume 可以对docker自己管理的卷目录进行操作;

/var/lib/docker/volumes(卷的根目录)
如果将空卷装入存在文件或目录的容器中的目录中,则容器中的内容(复制)到该卷中。

如果启动一个容器并指定一个尚不存在的卷,则会创建一个空卷。

匿名卷使用

bash 复制代码
docker run -dP -v /etc/nginx nginx
#docker将创建出匿名卷,并保存容器/etc/nginx下面的内容
# -v 宿主机:容器里的目录

具名卷使用

bash 复制代码
docker run -dP -v nginx:/etc/nginx nginx
#docker将创建出名为nginx的卷,并保存容器/etc/nginx下面的内容

使用

bash 复制代码
# -v不以绝对路径方式;
### 1、先在docker底层创建一个你指定名字的卷(具名卷) html
### 2、把这个卷和容器内部目录绑定
### 3、容器启动以后,目录里面的内容就在卷里面存着;
bash 复制代码
#####-v nginxhtml:/usr/share/nginx/html 也可以以下操作
## 1、 docker create volume nginxhtml 如果给卷里面就行修改,容器内部的也就改
了。
## 2、 docker volume inspect nginxhtml
## 3、docker run -d -P -v nginxhtml:/usr/share/nginx/html --name=nginx777 nginx
# 可以看到
"Mounts": [
	{
	"Type": "volume", //这是个卷
	"Name": "html", //名字是html
	"Source": "/var/lib/docker/volumes/html/_data", //宿主
	机的目录。容器里面的哪两个文件都在
	"Destination": "/usr/share/nginx/html", //容器内部
	"Driver": "local",
	"Mode": "z",
	"RW": true, //读写模式
	"Propagation": ""
	}
]

bind mount

如果将绑定安装或非空卷安装到存在某些文件或目录的容器中的目录中,则这些文件或目录会被安装遮盖,就像您将文件保存到Linux主机上的/ mnt中一样,然后 将USB驱动器安装到/ mnt中。在卸载USB驱动器之前,/ mnt的内容将被USB驱动器的内容遮盖。 被遮盖的文件不会被删除或更改,但是在安装绑定安装或卷时将无法访问。

外部目录覆盖内部容器目录内容,但不是修改。所以谨慎,外部空文件夹挂载方式也会导致容器内部是空文件夹

bash 复制代码
docker run -dP -v /my/nginx:/etc/nginx:ro nginx
bash 复制代码
# 一行命令启动nginx,并且配置文件和html页面。需要知道卷的位置才能改
docker run -d -P -v nginxconf:/etc/nginx/ -v nginxpage:/usr/share/nginx/html nginx

警惕bind mount 方式,文件挂载没有在外部准备好内容而导致的容器启动失败问题

bash 复制代码
# 想要实现 docker run -d -P -v /root/nginxconf:/etc/nginx/ -v /root/nginxhtml:/usr/share/nginx/html --name=nginx999 nginx
### 1、提前准备好东西,再调用命令;比如:把配置文件都放在目录nginxconf里面 ,
### 2、docker cp nginxdemo:/etc/nginx /root/nginxconf #注意/的使用
### 3、docker run -d -P -v /root/nginxconf:/etc/nginx/ -v /root/nginxhtml:/usr/share/nginx/html --name=nginx999 nginx

对比

-v 宿主机绝对路径:Docker容器内部绝对路径:叫挂载;这个有空挂载问题

-v 不以/开头的路径:Docker容器内部绝对路径:叫绑定(docker会自动管理,docker不会把他当前目

录,而把它当成卷)

bind mount和 volumes 的方式写法区别在于: 所有以/开始的都认为是 bind mount ,不以/开始的都认为是 volumes

docker cp

相关推荐
正经教主8 小时前
【docker基础】第一课、从零开始理解容器技术
docker·云原生·容器·eureka
萌萌哒草头将军9 小时前
CloudDock(云仓):新一代开源NAS网络代理工具
服务器·网络协议·docker
正经教主11 小时前
【docker基础】0、系统学习docker之总计划
学习·docker·容器
Yang三少喜欢撸铁11 小时前
【Centos7通过kubeadm方式部署kubernetes1.30版本【一主两从】】
docker·kubernetes·container
杨浦老苏14 小时前
开源宠物健康护理追踪器EinVault
docker·群晖·宠物·健康管理
@土豆14 小时前
基于Docker部署Squid正向代理文档
运维·docker·容器
林润庚14 小时前
win 安装openclaw (docker镜像模式),解决18789访问失败问题
docker·openclaw·龙虾
Cyber4K15 小时前
【Kubernetes专项】K8s 包工具- Helm 入门到企业实战
云原生·容器·kubernetes
正经教主16 小时前
【docker基础】Ubuntu 安装 Docker 超详细小白教程
ubuntu·docker·eureka
Chuncheng's blog17 小时前
K8S二进制部署exec unable to upgrade connection: Unauthorized异常解决方案
云原生·容器·kubernetes