从小白到大神之路之学习运维第71天-------Docker容器引擎操作(创建私有仓库、docker资源限制、数据持久化、volume的基本使用)

news2024/9/20 16:33:58

第四阶段

时  间:2023年8月1日

参加人:全班人员

内  容:

Docker容器引擎操作

目录

一、Docker 容器操作

1、创建容器与运行容器

2、容器的启动与停止

3、容器的运行与终止

4、容器的进入

5、容器的导出与导入

6、容器的删除

7、文件复制

8、查看容器资源使用率

9、查看容器进程状态

二、创建私有仓库

三、Docker资源限制

(一)CPU使用率

(二)CPU共享比例

(三)CPU周期限制

(四)CPU核心限制

(五)CPU 配额控制参数的混合案例

(六)内存限制

(七)Block IO 的限制

(八)限制bps 和iops

四、Docker数据持久化

数据持久化介绍

五、Volume的基本使用

(一)管理卷

(二)创建使用指定卷的容器

(三)清理卷


一、Docker 容器操作

        容器是Docker 的另一个核心概念,简单说,容器是镜像的一个运行实例,是独立运行的一个或一组应用以及它们所必需的运行环境,包括文件系统、系统类库、shell 环境等。

        镜像是只读模板,而容器会给这个只读模板一个额外的可写层。

下面将具体介绍围绕容器的具体操作。

1、创建容器与运行容器

Docker 的创建就是将镜像加载到容器的过程,Docker 的容器十分轻量级,用户可以随时创建或者删除。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器,这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全停止。停止的容器可以重新启动并保留原来的修改。可以使用docker create 命令新建一个容器。

命令格式:docker create [选项]… 镜像运行的程序

常用选项:

-i 让容器的输入保持打开

-t 让Docker 分配一个伪终端

-d 守护进程形式运行

[root@huyang1 ~]# docker create -it centos /bin/bash

        注意:如果创建容器命令报错“WARNING: IPv4 forwarding is disabled. Networking will not work.

”,就使用vi编辑器打开/etc/sysctl.conf文件,在其中添加net.ipv4.ip_forward=1,然后使用sysctl -p命令加载配置。

        使用docker create 命令创建新容器后会返回一个唯一的ID。

        可以使用docker ps 命令来查看所有容器的运行状态。添加-a 选项可以列出系统中所有容器状态。

[root@huyang1 ~]# docker ps -a

        输出信息显示容器的ID 号、加载的镜像、运行的程序、创建时间、目前所处的状态、端口映射。其中状态一栏为空表示当前的容器处于停止状态。

2、容器的启动与停止

启动停止容器可以使用docker start 命令。

命令格式:docker start 容器的ID/名称

[root@huyang1 ~]# docker start f4

[root@huyang1 ~]# docker ps -a

        容器启动后,可以看到容器状态一栏已经变为UP,表示容器已经处于启动状态。如果用户想创建并启动容器,可以直接执行docker run 命令,等同于先执行docker create 命令,再执行docker start 命令。需要注意只要后面的命令运行结束,容器就会停止。

        当利用docker run 来创建容器时,Docker 在后台的标准运行过程是这样的:检查本地是否存在指定的镜像,当镜像不存在时,会从公有仓库下载;利用镜像创建并启动一个容器;分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;分配一个地址池中的IP 地址给容器;执行用户指定的应用程序;执行完毕后容器被终止运行。

例如,创建容器并启动执行一条shell 命令:

[root@huyang1 ~]# docker run centos /bin/bash -c ls /

        这和在本地直接执行命令几乎没有区别。

[root@huyang1 ~]# docker ps -a

查看容器的运行状态,可以看出容器在执行完”/usr/bin/bash -c ls” 命令之后就停止了

        有时候需要在后台持续的运行这个容器,就需要让docker 容器在守护态形式在后台进行运行。可以在docker run 命令之后添加-d 选项来实现。但是需要注意容器所运行的程序不能结束。

        例如,下面的容器会持续在后台进行运行:

[root@huyang1 ~]# docker run -d nginx /bin/bash -c "while true;do echo hello;done"

docker ps查看容器,-a 查看所有容器,-q 只查看容器ID

[root@huyang1 ~]# docker ps -a

查看容器的运行状态,可以看出容器始终处于UP,运行状态。

查看容器内的输出

[root@huyang1 ~]# docker logs 737a3707b305

3、容器的运行与终止

如果需要终止运行的容器,可以使用docker stop 命令完成。

命令格式:docker stop 容器的ID/名称

[root@huyang1 ~]# docker stop 737a3707b305

[root@huyang1 ~]# docker ps -a

查看容器的运行状态,可以看出容器处于Exited,终止状态。

4、容器的进入

需要进入容器进行相应操作时,可以使用docker exec 命令或者docker attach命令进入运行着的容器。

命令格式:docker exec -it 容器ID/名称/bin/bash

其中,

-i 选项表示让容器的输入保持打开;

-t 选项表示让Docker 分配一个伪终端。

例如:进入正在运行着的容器12214903978f:

[root@huyang1 ~]# docker exec -it b9145ebaec4b /bin/bash

[root@b9145ebaec4b /]# exit

用户可以通过所创建的终端来输入命令,通过exit 命令退出容器。

通过Ctrl+pq命令退出容器并保证容器在后台继续运行。

[root@huyang1 ~]# docker attach 888

[root@888f5cfff2ab /]# exit

   我们再启动一个容器测试!

[root@huyang1 ~]# docker run -itd centos /bin/bash

[root@huyang1 ~]# docker attach b7

[root@b7e664a53618 /]# read escape sequence

(ctrl  p+q)

小结:

        通过上述实验可以发现,使用docker exec进入容器内,不论是使用exit还是使用(ctrl  p+q),退出后,容器仍在运行;但是使用docker attach进入容器之后,使用exit退出则会停止运行这个容器,而使用(ctrl  p+q),容器状态则不会收到影响!

5、容器的导出与导入

        用户可以将任何一个Docker 容器从一台机器迁移到另一台机器。在迁移过程中,首先需要将已经创建好的容器导出为文件,可以使用docker export 命令实现,无论这个容器是处于运行状态还是停止状态均可导出。导出之后可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

命令格式:docker export 容器ID/名称>文件名

例如,导出888f5cfff2ab容器到文件centos-test:

[root@huyang1 ~]# docker run -it centos /bin/bash

[root@888f5cfff2ab /]# touch 123.txt

[root@huyang1 ~]# docker export 21f5e00a42e7 > centos-exp

[root@huyang1 ~]# ls -l centos-test

导出的文件从A 机器拷贝到B 机器,之后使用docker import 命令导入,成为镜像。

命令格式:cat 文件名| docker import – 生成的镜像名称:标签

例如,导入文件centos7.tar成为本地镜像:

[root@huyang1 ~]# cat centos-exp | docker import - centos:test

[root@huyang1 ~]# docker images

        备注:在导入容器和导入镜像的时候有些区别!例如,导入容器需要用到cat,而导入镜像的时候需要用到的是load,要注意甄别!

6、容器的删除

        docker start|stop|restart|kill //运行已停止的容器|停止一个正在运行的容器|重启一个容器|杀死一个正在运行的容器,可以使用docker rm 命令将一个已经终止状态的容器进行删除。

命令格式:docker rm 容器ID/名称

例如,删除ID 号为21f5e00a42e7的容器:

[root@huyang1 ~]# docker rm -f 19

[root@huyang1 ~]# docker rm   5a

        如果删除一个正在运行的容器,可以添加-f 选项强制删除,但是建议先将容器停止再做删除操作。

Docker 默认的存储目录为/var/lib/docker,Docker的镜像、容器、日志等内容全部都存储在此,可以单独使用大容量的分区来存储这些内容,并且一般选择建立LVM 逻辑卷。从而避免Docker 运行过程中存储目录容量不足。

[root@huyang1 ~]# docker rm -f $(docker ps -qa)   

一键删除所有正在运行的容器

7、文件复制

将主机/root/abc.txt目录拷贝到容器79e689b541e的/tmp目录下。

[root@huyang1 ~]# docker cp /root/abc.txt

79e689b541e:/tmp

[root@huyang1 ~]# docker attach 79e689b541e

79e689b541e:/# ls /tmp

8、查看容器资源使用率

[root@huyang1 ~]# docker stats

9、查看容器进程状态

[root@huyang1 ~]# docker top ba

更新容器配置

--restart=always  #在docker服务重启时自动启动容器

[root@huyang1 ~]# docker update --restart=always d7

[root@huyang1 ~]# docker run --restart=always  -itd nginx /bin/bash  设置开机自启

、创建私有仓库

仓库(Repository)是集中存放镜像的地方。

        仓库注册服务器才是存放仓库具体的服务器(Registry),每个服务器上都可以放置多个仓库,而每个仓库下可以放置多个镜像,每个镜像上可以运行多个容器,每个容器上可以跑一个应用或应用组。

        仓库自身可以分为:公共仓库和私有仓库

                官方仓库: http://hub.docker.com

                国内仓库: http://dl.dockerpool.com

安装docker后,可以通过官方提供的registry镜像部署一套本地的私有仓库环境

[root@huyang1 ~]# mkdir -p /opt/data/registry

[root@huyang1 ~]# docker run -d --restart=always -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

[root@huyang1 ~]# docker ps -l

准备测试镜像

[root@huyang1 ~]# docker run -d -p 8000:80 nginx 

//将宿主机8000端口映射给容器的业务端口

[root@huyang1 ~]# docker ps -l

宿主机(192.168.100.131)访问8000端口测试:

[root@huyang1 ~]# docker logs dfdf455c8790

        将修改过的nginx镜像做标记封装,准备上传到私有仓库

[root@huyang1 ~]# docker tag nginx

192.168.100.131:5000/nginx-test

[root@huyang1 ~]# docker push

192.168.200.117:5000/nginx-test

可以发现此时发生错误,需要以下配置:

[root@huyang1 ~]# cat /etc/docker/daemon.json

重启dock服务:

[root@huyang1 ~]# systemctl daemon-reload

[root@huyang1 ~]# systemctl restart docker

将镜像上传到私有仓库

[root@huyang1 ~]# docker push

192.168.100.131:5000/nginx-test

从私有仓库中下载镜像到本地

[root@huyang1 ~]# docker rmi    删除现有的文件

192.168.100.131:5000/nginx-test

[root@huyang1 ~]# docker images

[root@huyang1 ~]# docker pull   下载镜像192.168.100.131:5000/nginx-test

[root@huyang1 ~]# docker images

  可以发现速度很快,因为是从私有仓库导入的镜像!

 docker整体流程:

、Docker资源限制

        Docker容器技术底层是通过Cgroup(Control Group 控制组)实现容器对物理资源使用的限制,限制的资源包括CPU、内存、磁盘三个方面。基本覆盖了常见的资源配额和使用量控制。

                Cgroup 是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制,被LXC及Docker等很多项目用于实现进程的资源控制。

Cgroup 是提供将进程进行分组化管理的功能和接口的基础结构,Docker中I/O 或内存的分配控制等具体的资源管理功能都是通过Cgroup功能来实现的。

        这些具体的资源管理功能称为Cgroup子系统,以下是对几大子系统的介绍:

                blkio:限制块设备的输入输出控制。如:磁盘、光盘、USB等。

                cpu:限制CPU资源的访问

                cpuacct:产生Cgroup 任务的CPU资源报告。

                cpuset:限制分配单独的cpu 和内存资源。

                devices:允许或拒绝对设备的访问。

                freezer:暂停和恢复Cgroup 任务。

                memory:设置每个Cgroup 的内存限制以及产生内存资源报告。

                net_cls:用于标记每个网络包。

                ns:命名空间子系统。

                perf_event:增加了对每group 的监测跟踪的能力,可以监测属于某个特定的group 的所有线程以及运行在特定CPU 上的线程。

使用下面的Dockerfile 来创建一个基于CentOS的stress工具镜像:

[root@huyang1 ~]# cat centos-7-x86_64.tar.gz | docker import - centos:7

[root@huyang1 ~]# mkdir stress

[root@huyang1 ~]# cd stress

[root@huyang1 stress]# vim Dockerfile

[root@huyang1 ~]# cd stress/

[root@huyang1 stress]# docker build -t centos:stress .

(一)CPU使用率

        在CentOS7中可以通过修改对应的Cgroup配置文件cpu.cfs_quota_us的值来实现,直接执行echo命令将设定值导入到文件中就会立即生效。

例如将容器face0aee201c的CPU使用设置为20000,设置CPU的使用率限定为20%。

[root@huyang1 ~]# docker run -itd centos:stress /bin/bash

[root@huyang1 ~]# docker ps -a

[root@huyang1 ~]# echo "20000" >

/sys/fs/cgroup/cpu,cpuacct/docker/558fa9a052eb7488534577683f0ef3c29ba8e65cfb217ab0c70f8a61442e301c/cpu.cfs_quota_us

        在cpu.cfs_quota_us这个文件内修改-1,是不可以用vim进入进行修改的,如果使用vim进入修改,会发现无论怎么修改都不能改变-1,这里只能用echo重定向!

(二)CPU共享比例

        当多个容器任务运行时,很难计算CPU的使用率,为了使容器合理使用CPU资源,可以通过--cpu-shares选项设置容器按比例共享CPU资源,

        这种方式还可以实现CPU使用率的动态调整。

        命令中的--cpu-shares 选项值不能保证可以获得1 个vcpu 或者多少GHz 的CPU 资源,仅仅只是一个弹性的加权值。

例如,运行3个新建容器A、B、C。占用CPU资源的比例为1:1:2:4

docker run --name A -itd --cpu-shares 1024 centos:stress /bin/bash

docker run --name B -itd --cpu-shares 1024 centos:stress /bin/bash

docker run --name C -itd --cpu-shares 2048 centos:stress /bin/bash

docker run --name D -itd --cpu-shares 4096 centos:stress /bin/bash

        如果又一个容器D需要更多CPU资源,则可以将其--cpu-shares的值设置为4096,那么ABCD的CPU资源比例变为1:1:2:4。

        默认情况下,每个docker容器的cpu份额都是1024。单独一个容器的份额是没有意义的。

                只有在同时运行多个容器时,容器的CPU加权的效果才能体现出来。

例如,两个容器A、B的CPU份额分别为1000和500,在CPU进行时间片分配的时候,容器A比容器B多一倍的机会获得CPU的时间片。但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器A一定能获得CPU时间片。比如容器A的进程一直是空闲的,那么容器B 是可以获取比容器A更多的CPU时间片的。极端情况下,比如说主机上只运行了一个容器,即使它的CPU份额只有50,它也可以独占整个主机的CPU资源。

        Cgroups 只在容器分配的资源紧缺时,也就是说在需要对容器使用的资源进行限制时才会生效。因此无法单纯根据某个容器的CPU份额来确定有多少CPU 资源分配给它,资源分配结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。

        换句话说,可以通过cpu shares可以设置容器使用CPU的优先级,比如启动了两个容器及运行查看CPU使用百分比。

[root@huyang1 ~]# docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10

[root@huyang1 ~]# docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10

[root@huyang1 ~]# docker ps -a

[root@huyang1 ~]# docker exec -it 8c0d2ee56229 /bin/bash

[root@8c0d2ee56229 /]# top

[root@huyang1 ~]# docker exec -it 4d1368e3537f /bin/bash

[root@4d1368e3537f /]# top

        开启了10 个stress 进程,目的是充分让系统资源变得紧张。只有这样竞争资源,设定的资源比例才可以显现出来。如果只运行一个进行,会自动分配到空闲的CPU,这样比例就无法看出来。由于案例的环境不一样,可能导致上面两张图中占用CPU 百分比会不同,但是从cpu share 来看两个容器总比例一定会是1:2。

(三)CPU周期限制

        docker 提供了--cpu-period、--cpu-quota 两个参数控制容器可以分配到的CPU 时钟周期。

        --cpu-period 是用来指定容器对CPU的使用要在多长时间内做一次重新分配。

        --cpu-quota 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。与--cpu-shares 不同的是:这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU 资源的使用绝对不会超过配置的值。

        cpu-period cpu-quota 单位为微秒(μs)。cpu-period 的最小值为1000 微秒,

        最大值为1 秒(10^6 μs),默认值为0.1 秒(100000 μs)。cpu-quota 的值默认为-1,

        表示不做控制。cpu-period、cpu-quota 这两个参数一般联合使用。

        举个例子,如果容器进程需要每1 秒使用单个CPU 的0.2 秒时间,可以将cpu-period 设置为1000000(即1 秒),cpu-quota 设置为200000(0.2 秒)。

        当然,在多核情况下,如果允许容器进程需要完全占用两个CPU,则可以将cpu-period 设置为100000(即0.1 秒),cpu-quota 设置为200000(0.2 秒)。

[root@huyang1 ~]# docker run -it --cpu-period 100000 --cpu-quota 200000 centos:stress /bin/bash

[root@2474ee0f7e62 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us

[root@2474ee0f7e62 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us

(四)CPU核心限制

        多核CPU的服务器Docker还可以控制容器运行限定使用哪些CPU内核,可以使用--cpuset-cpus选项来使某些程序独享CPU核心,以便提高其处理速度,对应的Cgroup文件为/sys/fs/cgroup/cpuset/docker/容器ID号/cpuset.cpus。

        选项后直接跟参数0、1、2……表示第1个内核,第2个内核,第3个内核,与/proc/cpuinfo中的标号相同。

如果服务器有16个核心,那么CPU编号为0~15,使新建容器绑定第1~4的核心使用:

docker run -itd --cpuset-cpus 0,1,2,3 centos:stress /bin/bash

或者

docker run --itd --cpuset-cpus 0-3 centos:stress /bin/bash

那么该容器内的进程只会在0,1,2,3的CPU上运行。        

通过下面指令也可以看到容器中进程与CPU 内核的绑定关系,可以认为达到了绑定CPU 内核的目的。

[root@huyang1 ~]# docker exec 2474ee0f7e62 taskset -c -p 1

pid 1's current affinity list: 0-3 //容器内部第一个进程编号一般为1

        尽量使用绑定内核的方式分配CPU资源给容器进程使用,然后在配合--cpu-shares选项动态调整CPU使用资源的比例。

(五)CPU 配额控制参数的混合案例

        通过--cpuset-cpus 指定容器A 使用CPU 内核0,容器B 只是用CPU 内核1。在主机上只有这两个容器使用对应CPU 内核的情况,它们各自占用全部的内核资源,--cpu-shares 没有明显效果。

        --cpuset-cpus、--cpuset-mems 参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的。

        在系统具有多个CPU 内核的情况下,需要通过cpuset-cpus 为容器CPU 内核才能比较方便地进行测试。

用下列命令创建测试用的容器:

[root@huyang1 ~]# docker run -itd --name cpu1 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1

[root@huyang1 ~]# docker exec -it容器ID /bin/bash

输入top 命令查看

[root@huyang1 ~]# docker run -itd --name cpu4 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1

[root@huyang1 ~]# docker exec -it容器ID /bin/bash

输入top 命令查看

        上面的centos:stress 镜像安装了stress 工具,用来测试CPU 和内存的负载。通过在两个容器上分别执行stress -c 1 命令,将会给系统一个随机负载,产生1 个进程。这个进程都反复不停的计算由rand() 产生随机数的平方根,直到资源耗尽。

        观察到宿主机上的CPU 试用率,第三个内核的使用率接近100%,并且一批进程的CPU 使用率明显存在2:1 的使用比例的对比。

(六)内存限制

        与操作系统类似,容器可使用的内存包括两部分:物理内存和swap。Docker 通过下面两组参数来控制容器内存的使用量。

        -m 或--memory:设置内存的使用限额,例如100M, 1024M。

        --memory-swap:设置内存swap 的使用限额。

当执行如下命令:

其含义是允许该容器最多使用200M 的内存和300M 的swap。

[root@huyang1 ~]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

--vm1:启动1 个内存工作线程。

--vm-bytes 280M:每个线程分配280M 内存。

默认情况下,容器可以使用主机上的所有空闲内存。与CPU 的cgroups 配置类似,docker 会自动为容器在目录/sys/fs/cgroup/memory/docker/<容器的完整长ID>中创建相应cgroup 配置文件。

因为280M 在可分配的范围(300M)内,所以工作线程能够正常工作,其过程是:

分配280M 内存。

释放280M 内存。

再分配280M 内存。

再释放280M 内存。

一直循环......

如果让工作线程分配的内存超过300M,分配的内存超过限额,stress 线程报错,容器退出。

(七)Block IO 的限制

        默认情况下,所有容器能平等地读写磁盘,可以通过设置--blkio-weight 参数来改变容器block IO 的优先级。

        --blkio-weight 与--cpu-shares 类似,设置的是相对权重值,默认为500。

在下面的例子中,容器A 读写磁盘的带宽是容器B 的两倍。

[root@huyang1 ~]# docker run -it --name container_A --blkio-weight 600 centos:stress /bin/bash
[root@a4b63e72a03b /]# cat /sys/fs/cgroup/blkio/blkio.weight
600
[root@huyang1 ~]# docker run -it --name container_B --blkio-weight 300 centos:stress /bin/bash
[root@ee688a3bba2b /]# cat /sys/fs/cgroup/blkio/blkio.weight
300

(八)限制bps 和iops

        如果在一台服务器上进行容器的混合部署,那么会存在同时几个程序写磁盘数据的情况,这时可以通过--device-write-iops选项来限制每秒写io次数来限制制定设备的写速度。相应的还有--device-read-iops选项可以限制读取IO的速度,但是这种方法只能限制设备,而不能限制分区,相应的Cgroup写配置文件为/sys/fs/cgroup/blkio/容器ID/ blkio.throttle.write_iops_device。

bps 是byte per second,每秒读写的数据量。

iops 是io per second,每秒IO 的次数。

        可通过以下参数控制容器的bps 和iops:

                --device-read-bps,限制读某个设备的bps

                --device-write-bps,限制写某个设备的bps

                --device-read-iops,限制读某个设备的iops

                --device-write-iops,限制写某个设备的iops

下面的示例是限制容器写/dev/sda 的速率为5 MB/s。

[root@huyang1 ~]# docker run -it --device-write-bps /dev/sda:5MB centos:stress /bin/bash [root@7fc31cd1514b /]# dd if=/dev/zero of=test bs=1M count=100 oflag=direct

100+0 records in

100+0 records out

104857600 bytes (105 MB) copied, 20.0051 s, 5.2 MB/s

通过dd 测试在容器中写磁盘的速度。因为容器的文件系统是在host /dev/sda 上的,在容器中写文件相当于对宿主机/dev/sda 进行写操作。另外,oflag=direct 指定用directIO 方式写文件,这样--device-write-bps 才能生效。

结果表明,bps 5.2 MB/s 在限速5MB/s 左右。作为对比测试,如果不限速,结果如下:

[root@huyang1 ~]# docker run -it centos:stress /bin/bash

[root@9128099a8947 /]# dd if=/dev/zero of=test bs=1M count=100

100+0 records in

100+0 records out

104857600 bytes (105 MB) copied, 0.384372 s, 273 MB/s

、Docker数据持久化

数据持久化介绍

在Docker中若要想实现容器数据的持久化(所谓的数据持久化即数据不随着Container的结束而销毁),需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。

(1)Volumes:Docker会管理宿主机文件系统的一部分资源,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)

测  试:

[root@huyang1 ~]# docker run -it -v /opt/ centos /bin/bash

[root@bda59433abd2 /]# touch /opt/test.txt

[root@bda59433abd2 /]# ls /opt/

test.txt

验  证:

[root@huyang1 ~]# ls

/var/lib/docker/volumes/7e6ef064e82bb0551336c11e053d8958e861c440a62d96ad142060e4a96a1f44/_data/

test.txt

  目前所有Container的数据都保存在/var/lib/docker/volumes/目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名(就上面这一堆很长ID的名字)卷。

        (2)bind mounts:意为着可以指定存储在宿主机系统的任意位置;(比较常用的方式)

但是bind mounts在不同的宿主机系统之间是不可移植的,比如Windows和Linux的存储结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为会导致Dockerfile无法移植。

        (3)tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)

、Volume的基本使用

(一)管理卷

创建一个自定义容器卷

[root@huyang1 ~]# docker volume create nginx-data

查看所有容器卷

[root@huyang1 ~]# docker volume ls

查看指定容器卷详情信息

[root@huyang1 ~]# docker volume inspect nginx-data

(二)创建使用指定卷的容器

        有了自定义容器卷,我们可以创建一个使用这个数据卷的容器

[root@huyang1 ~]# docker run -d -it --name=nginx -p 8000:80 -v nginx-data:/usr/share/nginx/html nginx

[root@huyang1 ~]# docker exec -it nginx /bin/bash

root@59d8ae8657b9:/# ls /usr/share/nginx/html/

50x.html  index.html

        选项-v代表挂载数据卷,这里使用自定数据卷nginx-data,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。

注意:

        数据卷下无文件,显示容器对应目录下的文件

        数据卷下有文件,显示数据卷原有文件,并将容器对应目录的文件隐藏,显示数据卷文件

可以看到网页目录下有两个默认页面,这时我们可以查看宿主机文件系统的数据

[root@huyang1 ~]# ls /var/lib/docker/volumes/nginx-data/_data/

   可以看到容器里面的两个默认页面,由此可知Volume帮我们做了类似于一个软链接的功能。在容器里边的改动,我们可以在宿主机里感知,而在宿主机里面的改动,在容器里边可以感知到。

  如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有随着容器被删除掉。

[root@huyang1 ~]# docker stop nginx

nginx

[root@huyang1 ~]# docker rm nginx

nginx

[root@huyang1 ~]# ls

/var/lib/docker/volumes/nginx-data/_data/

   所以在数据卷里边的东西是可以持久化的。如果下次还需要创建一个nginx容器,那么时候复用当前数据卷里面文件的。

[root@huyang1 ~]# docker run -d -it --name=nginx2 -p 8001:80 -v nginx-data:/usr/share/nginx/html nginx

f21efa07e66d89004327f6cbb705af9d4464b0f423ffdcec54d9c352b90cbdcb

[root@huyang1 ~]# docker exec -it nginx2 /bin/bash

root@f21efa07e66d:/# ls /usr/share/nginx/html

50x.html  index.html

  此外,我们还可以启动多个nginx容器实例,共享同一个数据卷。数据卷的复用性和扩展性较强的。

(三)清理卷

如果不再使用自定义数据卷了,那么可以手动清理掉:

[root@huyang1 ~]# docker volume rm nginx-data

nginx-data

[root@huyang1 ~]# docker volume ls

        备注:当卷正在被容器所使用的时候,是不可以删除的,强制删除也不可以,此时应当停止使用这个卷,才可以删除这个卷!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/821052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】关键字static——static修饰局部变量、全局变量和函数详解!

在C语言中&#xff0c;static是修饰变量和函数的。static修饰局部变量称为静态局部变量&#xff0c;static修饰全局变量称为静态全局变量&#xff0c;static修饰函数称为静态函数。 文章目录 静态变量在静态区分配内存static修饰全局变量static修饰局部变量static修饰函数 静态…

2023Q2纯电汽车销量统计,特斯拉遥遥领先,比亚迪和大众横向对比

根据8月1日的消息&#xff0c;国际科技媒体insideevs最近针对2023年第2季度特斯拉、比亚迪和大众三家电动汽车制造商的纯电动汽车销量做了横向比较。 根据媒体报道&#xff0c;2023年第2季度&#xff0c;三家汽车制造企业的销量都有不同程度的增长&#xff0c;较去年同期和今年…

千云探探监测到7月25日法国巴黎Facebook网络恢复正常

前情回顾&#xff1a;针对法国近期出现的骚乱&#xff0c;法国总统马克龙7月4日表示&#xff0c;如果事态失控&#xff0c;法国政府可能需要监管或关闭社交网络。北京时间2023年7月4日17时45分&#xff0c;埃文科技的千云探探发现法国巴黎地区访问Facebook社交网络的网络时延从…

iPhone 8 Plus透明屏应用范围详解

iPhone 8 Plus是苹果公司于2017年推出的一款智能手机&#xff0c;它采用了全新的玻璃机身设计&#xff0c;支持无线充电&#xff0c;并且搭载了更强大的A11仿生芯片。 而透明屏则是一种新型的屏幕技术&#xff0c;可以使手机屏幕呈现出透明的效果。 透明屏是一种将屏幕背后的元…

网络层:IP协议/Mac协议

IP协议 主机: 配有IP地址, 但是不进行路由控制的设备; 路由器: 即配有IP地址, 又能进行路由控制; 节点: 主机和路由器的统 称; IP 目标网络&#xff08;前半部分&#xff09; 目标主机&#xff08;后半部分&#xff09; IP层的核心&#xff1a;IP地址定位主机&#xff08;定…

MySQL篇

文章目录 一、MySQL-优化1、在MySQL中&#xff0c;如何定位慢查询?2、SQL语句执行很慢, 如何分析呢&#xff1f;3、了解过索引吗&#xff1f;&#xff08;什么是索引&#xff09;4、索引的底层数据结构了解过嘛 ?5、什么是聚簇索引什么是非聚簇索引 ?6、知道什么是回表查询嘛…

安达发|APS智能排程软件推动企业智能转型

随着智能化技术的飞速发展&#xff0c;企业在构建智能计划排产规划方面有了新的可能性。APS排程软件&#xff08;Advanced Planning and Scheduling&#xff09;作为一种强大的工具&#xff0c;为企业提供了实现智能计划排产规划的新模式&#xff0c;主要是利用计算机运算速度快…

面向对象程序三大特性一:封装(超详细)

目录 目录 封装 1.1访问限定符 1.2封装介绍 1.3封装的实现步骤 (三步) 总结 封装 1.1访问限定符 Java 中主要通过类和访问权限来实现封装&#xff1a; 类可以将数据以及封装数据的方法结合在一起&#xff0c;&#xff0c;而访问权限用来控制方法或者字段能否直接在类…

linux驱动定时器实现按键按下打印字符

#include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/interrupt.h>struct device_node *dev; unsigned int irqno; //中断处理函数 irqreturn_t myirq_handler(int irq,void *…

后端整理(集合框架、IO流、多线程)

1. 集合框架 Java集合类主要有两个根接口Collection和Map派生出来 Collection派生两个子接口 List List代表了有序可重复集合&#xff0c;可以直接根据元素的索引进行访问Set Set代表无序不可重复集合&#xff0c;只能根据元素本身进行访问 Map接口派生 Map代表的是存储key…

Vue2面试题

1. Vue 的基本原理 当 一 个 Vue 实 例 创 建 时 &#xff0c; Vue 会 遍 历 data 中 的 属 性 &#xff0c; 用 Object.defineProperty &#xff08; vue3.0 使 用 proxy&#xff09; 将 它 们 转 为 getter/setter&#xff0c;并且在内部追踪相关依赖&#xff0c;在属性被访…

linux系统中详细分析MMU的具体实现

先来看一张图 ​第一&#xff1a;MMU内存管理 MMU&#xff08;Memory Management Unit&#xff0c;内存管理单元&#xff09;是一种硬件模块&#xff0c;用于在CPU和内存之间实现虚拟内存管理。 其主要功能是将虚拟地址转换为物理地址&#xff0c;同时提供访问权限的控制和缓存…

控制反转ioc理解,配置说明

先写个例子吧 配置文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"h…

价值 1k 嵌入式面试题-单片机 main 函数之前都做了啥?

开门见山 请说下单片机&#xff08;Arm&#xff09;在运行到 main() 函数前&#xff0c;都做了哪些工作&#xff1f; 常见问题 系统初始化工作&#xff0c;太泛泛硬件初始化&#xff0c;比较不具体 答题思路 这道题应该从两方面回答&#xff0c;一个是比较表面的硬件的初始化…

leetcode(力扣) 剑指 Offer 12. 矩阵中的路径(回溯 DFS)

文章目录 题目描述思路分析完整代码 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff…

不用这些网站,你哪来的时间摸鱼?

Postcat - 在线API 开发测试工具 postcat.com/ API 开发测试工具 Postcat 是一个强大的开源、免费的、跨平台&#xff08;Windows、Mac、Linux、Browsers...&#xff09;的 API 开发测试工具&#xff0c;支持 REST、Websocket 等协议&#xff08;即将支持 GraphQL、gRPC、TCP…

LLM - LLama 模型读取报错 TypeError: not a string

一.引言 读取 LLama2 模型时报错 TypeError: not a string 看异常栈是 AutoTokenizer.from_pretrained 时候的异常。 二.问题解决 出现类似加载模型异常的问题&#xff0c;大致分两类&#xff1a; ◆ 模型地址异常 脚本里传的 pretrained_model Path 有问题&#xff0c;加 …

Python 3.X环境下搭建Robot Framework过程及问题汇总

目录 一、基础RF环境搭建&#xff1a; 二、问题处理&#xff1a; Python 3.X环境下搭建Robot Framework过程 python3.X已经支持robot framework了&#xff0c;更新一版安装过程。总体来说安装过程简化了很多&#xff0c;但依然有一些小地方需要注意。 一、基础RF环境搭建&a…

【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—上篇)

探究Redis服务启动的过程机制的技术原理和流程分析的指南&#xff08;Redis集群管理&#xff09; Redis集群管理查看集群中各个节点状态集群(cluster)cluster info的执行效果指令结果分析 cluster nodes的执行效果指令结果分析 节点(node)CLUSTER MEETCLUSTER FORGETCLUSTER RE…

python实现视频转GIF动图(无水印,包含代码详解和.exe执行文件)

该代码提供了一个简单的界面&#xff0c;允许用户将视频转换为GIF动画&#xff0c;并且可以自定义采样率、GIF帧率和输出大小。修改后的代码将视频帧的大小调整为固定的尺寸&#xff0c;并在生成GIF动画时保持这个尺寸。 一、核心代码实现 核心代码如下&#xff1a; import c…