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
posted @ 2021-10-20 11:52  河图s  阅读(216)  评论(0)    收藏  举报