Docker --- 容器、镜像、镜像仓库、数据卷的基础操作命令
1. 镜像
1.0 镜像的分层
1. 镜像的分层现象
当拉取镜像的过程中,可以看到Docker的镜像是一层一层的在下载

2. 镜像底层原理(UnionFS -- 联合文件系统)
UnionFS (联合文件系统): 是一种分层、轻量级且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统(unite several directories into a single virtual filesystem)下.
Union 文件系统是Docker 镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
# 特性
一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
3. 镜像的加载原理

Docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统为UnionFS
bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker 镜像的最底层是引导文件系统bootfs. 这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核,当boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bottfs.
rootfs在bootfs之上,包含的就是典型Linux系统中的/dev /proc /bin /etc 等标准目录和文件,rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等
# 在虚拟机中的CentOS都是好几个G,为什么docker这里才200M?
对于一个精简的OS,rootfs可以很小,只包含最基本的命令 工具和程序库就可以了,因为底层用Host的kernel,自己只需要提供rootfs就行了,由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs
3. 镜像分层的好处
复用,节省磁盘空间,相同的内容只需加载一份到内存。 修改dockerfile之后,再次构建速度快
4. 容器和镜像的关系
当容器启动时,一个新的可写层被加载到镜像的顶部.这一层通常被称作"容器层","容器层"之下的都叫"镜像层"
所有对容器的改动--无论添加、删除、修改文件都只会发生在容器层中,只有容器层是可写的,容器层下面的所有镜像层都是只读的
1.1 镜像操作命令
1. 查看本地所有镜像
1. 基础查看镜像
1. 命令
docker images
命令参数说明:
-a 列出本地所有镜像(含历史映像层)
-q 只显示镜像ID
2. 执行结果

3. 执行结果说明
REPOSITORY: 镜像仓库描述
TAG: 镜像的标签版本号
IMAGE ID: 镜像ID
CREATED: 镜像创建时间
SIZE: 镜像大小
# 同一个仓库源可以有多个 TAG 版本,表示这个仓库员的不同版本,我们使用 REPOSITORY:TAG 来定义不同的镜像
# 如果没有指定一个镜像的版本标签,则默认会使用 REPOSITORY:lastet 来表示
2. 镜像详细信息
docker image inspect 镜像名:TAG
docker image inspect ID
2. 搜索镜像
1. 命令
docker search 镜像名
命令参数说明:
--limit 列出前N个镜像,默认为25个
2. 执行结果

3. 执行结果说明
NAME: 镜像名称
DESCRIPTION: 镜像仓库描述
STARS: 镜像仓库收藏数,
OFFICIAL: 表示是否为官方仓库,该列标记为[0K] 的镜像均由各软件的官方项目组创建和维护
AUTOMATED: 是否是自动构建的镜像仓库
# 同一个仓库源可以有多个 TAG 版本,表示这个仓库员的不同版本,我们使用 REPOSITORY:TAG 来定义不同的镜像
# 如果没有指定一个镜像的版本标签,则默认会使用 REPOSITORY:lastet 来表示
3. 拉取镜像
1. 命令
# 没写版本号,默认下载最新的
docker pull 镜像名:版本号
2. 执行结果

4. 查看占用空间
1. 命令
docker system df
2. 执行结果

3. 执行结果说明
TYPE: 类型(包括 Images:镜像、Containers:容器、Local Volumes:本地数据卷、Build Cache:本地构建缓存)
TOTAL: 总数
ACTIVE: 活动中的数量
SIZE: 大小
RECLAIMABLE: 可伸缩性
5. 删除镜像
1. 命令
# 删除单个
docker rmi 镜像名/镜像ID
# 删除多个
docker rmi 镜像名1:TAG 镜像名2:TAG
# 删除全部
docker rmi $(docker images -qa)
命令参数说明:
-f 强制删除,不管这个镜像是否被容器使用中
2. 执行结果

6. 如何确定唯一镜像
# 方式一
通过镜像ID(image_id)
# 方式二
通过镜像名称:镜像的tag (repository:tag)
7. 导出镜像到文件中
docker save -o nginx-alpine.tar nginx:alpine
8. 从文件中加载镜像
docker load -i nginx-alpine.tar
9. 查出所有的虚悬镜像
docker image ls -f dangling=true
10. 删除所有的虚悬镜像
docker image prune
1.2 镜像制作
1. 基于容器制作镜像并提交到本地镜像列表
docker commit -m 提交的描述信息 -a 作者 容器ID 要创建的目标镜像名:标签
2. docker file 制作镜像
FROM # 指定基础镜像
MAINTAINER # 指定维护者信息,可以没有
LABLE # 描述,标签
RUN # 执行
ADD # 给它点创业资金(会自动解压tar) 制作docker基础的系统镜像
WORKDIR # cd(设置当前工作目录)
VOLUME # 设置卷,挂载主机目录
EXPOSE # 指定对外的端口(-P 随机端口)
CMD # 结束的最后执行的命令
dockerfile其他指令:
COPY # 复制文件(不会解压)
ENV # 环境变量(更改SSH密码,mysql)
ENTRYPOINT # 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)
#centos-6.9sshd
#FROM centos:6.9
FROM 2199b8eb8390 #获取镜像
RUN yum install -y openssh* #执行命令
RUN /etc/init.d/sshd start && /etc/init.d/sshd start && echo '123' |passwd root --stdin
EXPOSE 22 #暴露端口
CMD ["/usr/sbin/sshd","-D"] #结束的最后执行的命令
根据镜像创建镜像
docker image build -t 'zbb/centos6.9-sshdv3' ./
创建容器
docker run -d 897a471638e5 /bin/bash
查看容器的ip
docker inspect c10335410d7c
连接测试
ssh 172.17.0.2
3. 制作基础镜像
FROM scratchADD centos-7.7-x86_64-docker.tar.xz /LABEL org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20191024"CMD ["/bin/bash"]
docker更改初始root密码
docker run -d --env "SSH_PASS=12321321" 897a471638e5 /bin/bash /init.sh#!bin/bashecho "$SSH_PASS"|passwd --stdin root /usr/sbin/sshdnginx -g 'daemon off;'
4. 根据 Docker File 创建 LAMP
#centos-lnmp
FROM centos:6.9
#FROM 2199b8eb8390 #获取镜像
RUN yum install -y openssh* mysql mysql-server httpd php php-mysql
RUN /etc/init.d/sshd start && echo '123' |passwd root --stdin
#&& /etc/init.d/mysqld start && /etc/init.d/httpd start
#RUN mysql -e "grant all on *.* to root@'%' identified by '123';create database discuz charset utf8;"
COPY index.php /var/www/html
COPY init.sh /
# ADD bbs.tar.gz /var/www/html 会自动解压 还可以传url的文件
EXPOSE 22
EXPOSE 80
EXPOSE 3306 #暴露端口
CMD ["/bin/bash","/init.sh"] #结束的最后执行的命令
#VOLUME ['/var/www/html','/data/mysql/data'] 自动挂载卷
#WORKDIR 进入目录相当于cd
#ENV AA_DIR = '/var/www/html' 申明变量 ${AA_DIR}调用
#ENTRYPOINT 和CMD一样 但是不会被命令行的命令 替换掉
#USER 指定用户
vim index.php
<?php
phpinfo();
?>
vim init.sh
#!/bin/bash
echo '123' |passwd root --stdin
/etc/init.d/mysqld start
mysql -e "grant all on *.* to root@'%' identified by '123';create database discuz charset utf8;"
/etc/init.d/httpd start
/usr/sbin/sshd -D
构建镜像
docker build -t 'zbb:lnmp' -f Dockerfile
制作容器
docker run -d --name='zbb_lnmp' -p33:22 -p34:80 -p3306:3306 zbb/lnmp
测试 浏览器访问端口 服务器telnet 测试端口开放性
5. 示例
构建可道云网盘
1. 安装PHP
yum install php-fpm -yvi /etc/php-fpm.d/www.confuser = nginxgroup = nginx
2. 启动
php-fpm -D
#php-gd
#php-mbstring
#yum install php-mysql
3. 配置Nginx
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx -y
vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
root /code;
index index.php index.html index.htm;
location ~ \.php$ {
root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name;
include fastcgi_params;
}
4. 上传PHP代码
wget http://static.kodcloud.com/update/download/kodbox.1.13.zipdocker cp 柯道云 4ed573a2c3b:/code
5. 配置ssh
yum install -y openssh-serveryum install initscripts -y /usr/sbin/sshd-keygenecho "123456"|passwd --stdin root
6. 查看命令需要的包
#yum provides unzip#which unzip#rpm -qf /usr/bin/unzip
7. 容器内创建
#!bin/bash#nginx -g 'daemon off;'nginx#php-fpm -F php-fpm/usr/sbin/sshd -D
8. 创建镜像
docker commit sssss kod:v1
9. 启动容器
docker run -d --name="zbb" -p 99:22 -p80:80 kod:v2 /bin/bash /init.sh
10. 测试访问
ssh ip:99浏览器访问ip:88
1.3 镜像提交
0. 提交到 Docker Hub
0. Docker Hub 如果是公有仓库,别人可以随便下载,如果是私有仓库,别人下载的时候需要账号密码
1. 先将本地的镜像重新打标签
docker tag 本地镜像:标签 Docker Hub的仓库名:标签
docker tag mynginx:v1.0 hetu/localnginx:v1.0
2. 登录 Docker Hub
docker login
3. 推送到 Docker Hub
docker push 仓库名:标签
docker push hetu/localnginx:v1.0
4. 退出登录
docker logout
1. 提交到本地镜像列表
docker commit -m 提交的描述信息 -a 作者 容器ID 要创建的目标镜像名:标签
2. 提交到阿里云仓库
1. 打开阿里云的容器镜像服务

2. 点击个人实例

3. 创建命名空间

4. 将本地镜像推送到阿里云
1. 将镜像推送到Registry
docker login --username=sunyu2513 registry.cn-hangzhou.aliyuncs.com
docker tag 镜像ID registry.cn-hangzhou.aliyuncs.com/hetu/docker_learning:镜像版本号
docker push registry.cn-hangzhou.aliyuncs.com/hetu/docker_learning:镜像版本号
根据实际镜像信息替换示例中的 镜像ID 和 镜像版本号 参数
2. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
3. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
docker images
docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令将该镜像推送至远程。
docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
1.4 从阿里云仓库拉取镜像
1. 登录阿里云Docker Registry
docker login --username=sunyu2513 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码,可以在访问凭证页面修改凭证密码
2. 从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/hetu/docker_learning:镜像版本号
2. 容器
2.0 容器分类
1. 交互式容器
# -i: 交互式操作。 -t: 终端。
docker run -it 0f3e07c0138f
查看正在启动的容器
pstree
docker ps # -a 查看所有容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e2c15223ea8 0f3e07c0138f "/bin/bash" 11 minutes ago Up 11 minutes kind_dijkstra
CONTAINER ID #容器的唯一标识码
NAMES #容器的名字不能重复 可以手动生成
docker run -it --name="zbb" 0f3e07c0138f
COMMAND #启动容器运行的命令
STATUS #运行状态
2. 守护式容器
docker run -d --name='zxy' nginx:1.14 #-d 以守护式启动,不手动结束不会停止#默认 没有镜像 会自动下载 docker container inspect zxy #查看容器详细信息 container默认可以不写--restart always #开机自启
docker create zxy
docker stop zxy
docker start zxy
docker restart zxy
docker kill zxy
交互式
docker stop zxy
docker start -i zxy #不加-i连接不进去....只能输入以下命令菜能进入
## 资源限制,-cpuset-cpus用于设置容器可以使用的 vCPU 核。-c,--cpu-shares用于设置多个容器竞争 CPU 时,各个容器相对能分配到的 CPU 时间比例。假设有三个正在运行的容器,这三个容器中的任务都是 CPU 密集型的。第一个容器的 cpu 共享权值是 1024,其它两个容器的 cpu 共享权值是 512。第一个容器将得到 50% 的 CPU 时间,而其它两个容器就只能各得到 25% 的 CPU 时间了。如果再添加第四个 cpu 共享值为 1024 的容器,每个容器得到的 CPU 时间将重新计算。第一个容器的CPU 时间变为 33%,其它容器分得的 CPU 时间分别为 16.5%、16.5%、33%。必须注意的是,这个比例只有在 CPU 密集型的任务执行时才有用。在四核的系统上,假设有四个单进程的容器,它们都能各自使用一个核的 100% CPU 时间,不管它们的 cpu 共享权值是多少。
$ docker run --cpuset-cpus="0-3" --cpu-shares=512 --memory=500m nginx:alpine
3. 两类容器使用场景
交互式一般用于测试 ,工具,临时任务 用完退出就停止了,但是不会删除,以后会越来越多
docker rm -f kind_dijkstra #删除容器
run -it --name='zbbdentos' --rm 0f3e07c0138f #加rm使用完会自动删除
守护式,如tomcat等软件
docker默认只能内部访问,必须提供端口才能对外访问
docker run -d -p 8080:80 --name='zbb_nginx' nginx:1.14
2.1 容器操作命令
1. 新建并启动容器
0. 基础启动容器及参数
1. 命令
docker run nginx
命令参数说明
--name 为容器指定名称,未指定会使用系统随机分配的名称
-d 后台运行容器并返回容器ID, # 即启动守护式容器(后台运行)
-i 以交互模式运行容器,通常与-t同时使用
-t 为容器重新分配一个伪输入终端,通常与-i同时使用
-it # 启动交互式容器(前台有伪终端,等待交互)
-P 随机端口映射,大写P
-p 指定端口映射,小写p
-v 数据卷挂载(容器数据持久化)
-restart=always 每次重启doker 容器会自动重启
--privileged=true 开启读写权限
1. 启动交互式容器
# 启动交互式容器(会出现终端输入,bash为linux终端)
docker run --name nginx -it nginx:alpine /bin/bash
docker run --name nginx -it nginx:alpine bash
2. 启动守护式容器
# 启动守护式容器(后台运行)
# Docker 容器后台运行,必须有一个前台进程,容器运行的命令如果不是哪些一直挂起的命令(如top,tail),容器是会自动退出的,这个是Docker的机制问题
# 以Nginx为例,如我们配置启动服务只需要启动响应的service即可,例如service nginx start,但是这样做的话nginx为后台进程模式运行,就导致docker 前台没有运行的应用,这样的容器后台启动后,会立即自杀,因为他觉得他没事可做了
docker run --name nginx -d nginx:alpine
# 解决方案为,同时以交互式启动
docker run --name nginx -it -dnginx:alpine bash
2. 查看 正在运行的 容器列表
docker ps
命令参数说明
-a 列出当前正在运行的 + 历史运行过的 容器
-l 显示最近创建的容器
-n 显示最近n个创建的容器
-q 静默模式,只显示容器ID
3. 查看容器详细信息
# 查看容器详细信息,包括容器IP地址等
docker inspect nginx
## 查看镜像的明细信息
docker inspect nginx:alpine
4. 退出交互式容器
# 新建并启动交互式容器
docker run -it nginx bash
# 进入终端后,输入exit 退出容器,容器会停止运行
exit
# 进入终端后,ctrl+p+q 退出容器,容器不会停止运行
ctrl+p+q
5. 启动已经停止运行的容器
docker start 容器ID/容器名
6. 重启容器
docker restart 容器ID/容器名
7. 停止容器
docker stop 容器ID/容器名
8. 强制停止容器
docker kill 容器ID/容器名
9. 删除已停止的容器
docker rm 容器ID/容器名
10. 强制删除运行中的容器
docker rm -f nginx
11. 删除所有容器
docker rm -f `docker ps -a -q`
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
12. 查看容器日志
docker logs 容器名/容器ID
13. 查看容器内进程
docker top 容器名/容器ID
14. 进入守护式容器
1. 进入容器,并以命令行交互
docker exec -it nginx /bin/bash
2. 重新进入容器
docker attach 容器名/容器ID
3. 两者的区别
attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的运行停止
exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的运行停止
15. 从容器内拷贝文件到主机
docker cp 容器名/容器ID:容器内路径 目的主机路径
16. 导入/导出 容器
1. 导出容器
# export 导出容器的内容流作为一个tar 归档文件
docker export 容器名/容器ID > 文件名.tar
2. 导入容器
# import 从tar包中的内容创建一个新的文件系统再导入为镜像
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
# 命令示例
cat abcd.tar | docker import - hetuu/ubuntu:3.7.4
2.2 容器的连接
docker attach zbb #进入容器 不推荐使用子进程的方式登录[root@docker ~]# docker exec -it zbb /bin/bash exec进入调试 ,这样ctrl + D exit 就不会退出容器#原理是又开了一个 /bin/bash容器的后台及前台运行ctrl + p ,qattach 调用到前台
2.5 容器的网络访问
docker启动的所有容器都是可以内部访问的docker run -d -p 8080:80 --name='zzb_n1' nginx:1.14将nginx的80映射到宿主的8080上映射多个端口docker run -d -p 8080:80 --name='zzb_n2' nginx:1.14
2.6 容器数据持久化
# 挂载主机目录
docker run --name nginx -d -v /opt://opt -v /var/log:/var/log nginx:alpine # 如果是挂载多个 可以加多个-v
# 将容器中的mysql 挂载到宿主机上,就可以将数据持久化到宿主机上了
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -v /opt/mysql/:/var/lib/mysql mysql:5.7
2.7 docker管理命令
docker top zzb_n1 #查看进程
UID PID PPID C STIME TTY
root 9923 9907 0 20:27 ? ss nginx -g daemon off;
101 9955 9923 0 20:27 ? ss
docker logs zzb_n1
#-f 持续监控日志
#-t 显示详细时间
#--tail 10 只显示10行
23.112.18.xx - - [04/Nov/2019:12:27:17 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36" "-"
3. 镜像仓库
3.1 阿里云仓库操作
1. 镜像提交到阿里云仓库
1. 打开阿里云的容器镜像服务

2. 点击个人实例

3. 创建命名空间

4. 将本地镜像推送到阿里云
1. 将镜像推送到Registry
docker login --username=sunyu2513 registry.cn-hangzhou.aliyuncs.com
docker tag 镜像ID registry.cn-hangzhou.aliyuncs.com/hetu/docker_learning:镜像版本号
docker push registry.cn-hangzhou.aliyuncs.com/hetu/docker_learning:镜像版本号
根据实际镜像信息替换示例中的 镜像ID 和 镜像版本号 参数
2. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
3. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
docker images
docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令将该镜像推送至远程。
docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
2. 从阿里云仓库拉取镜像
1. 登录阿里云Docker Registry
docker login --username=sunyu2513 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码,可以在访问凭证页面修改凭证密码
2. 从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/hetu/docker_learning:镜像版本号
3.2 本地镜像仓库操作
1. 构建本地镜像仓库
默认仓库不带认证,若需要认证参考
https://docs.docker.com/registry/deploying/#restricting-access
1. 拉取 Docker Registry 镜像
docker pull registry
2. 启动本地镜像仓库
# 默认创建在容器的/var/lib/registry 目录下,建议用容器卷映射
docker run -d -p 5000:5000 -v /xxx/myregistry/:/tmp/registry --privileged=true registry
2. 查询本地镜像仓库的镜像列表
curl -XGET http://192.168.0.89:5000/v2/_catalog
3. 推送镜像到本地镜像仓库
1. 修改镜像名
docker tag 镜像名:版本 本地镜像仓库IP:端口/镜像名:版本
2. 修改本地镜像仓库支持http推送
# 本地镜像仓库默认不支持http的推送
vim /etc/docker/daemon.json
{
# ...... 检查是否有逗号,结尾
# 新增下面配置
"insecure-registries":["192.168.0.89:5000"]
}
3. 重启 Docker
systemctl restart docker
# 查看 Docker 是否成功运行
systemctl status docker
4. 重启本地镜像仓库
# 默认创建在容器的/var/lib/registry 目录下,建议用容器卷映射
docker run -d -p 宿主机端口:容器内端口-v /xxx/myregistry/:/tmp/registry --privileged=true registry
docker run -d -p 5000:5000 -v /xxx/myregistry/:/tmp/registry --privileged=true registry
5. 提交镜像到本地镜像仓库
docker push 本地镜像仓库IP:端口/镜像名:版本
6. 验证是否推送成功
curl -XGET http://192.168.0.89:5000/v2/_catalog
4. 从本地镜像仓库拉取镜像
docker pull 本地镜像仓库IP:端口/镜像名:版本
4. 数据卷
4.0 理论
1. 数据卷是什么
# 是什么
将 Docker 容器内的数据保存到宿主机的磁盘中
卷是目录或文件,存在于一个或多个容器中,由Docker 挂载到容器,但不属于联合文件系统,因此能绕过 Union File System 提供一些用于持续存储或共享数据的特性
卷设计的目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
2. 特点
1. 数据卷可在容器之间共享或重用数据
2. 卷中的更改可以直接实时生效
3. 数据卷中的更改不会包含在镜像的更新中
4. 数据卷的生命周期一直持续到没有容器使用它为止
4.1 操作命令
1. 必写参数
# Docker挂载目录访问如果出现 cannot open directory..:Permission denied,只要在挂载目录后加上以下参数即可
--privileged=true
2. 运行一个带有数据卷的容器
# -v 可以有多个 用于指定不同的文件或目录
docker run -it --privileed=true -v /宿主机绝对路径目录:/容器内目录 镜像名 /bin/bash
3. 查看数据卷是否挂载成功
docker inspect 容器名/容器ID
参数说明
[
"Mounts":[ // 挂载项
{
"Type": "bind",
"Source": "/tmp/host_data", // 源目录,即主机目录
"Destination": "/tmp/docker_data", // Docker 目录
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
]
4. 如果容器挂掉,同时宿主机产生了新的数据,再次启动容器时数据是否同步?
再次启动容器,依然会在容器内部的目录中出现宿主机产生的新的数据
4.2 读写规则
1. 读写(默认规则)
# rw 是默认追加的参数
docker run -it --privileed=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名 /bin/bash
2. 只读
# 容器实例内部被限制,只能读不能写,ro表示只读,read only
docker run -it --privileed=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 /bin/bash
4.3 继承和共享
1. 容器1 和 宿主机 映射
docker run -it --privileed=true -v /宿主机绝对路径目录:/容器内目录 镜像名 /bin/bash
2. 容器2 继承 容器1 的映射规则
docker run -it --privileed=true --volumes-from 容器名/容器ID 镜像名 /bin/bash

浙公网安备 33010602011771号