博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019/08/01 docker镜像和卷(04)
阅读量:3924 次
发布时间:2019-05-23

本文共 4114 字,大约阅读时间需要 13 分钟。

之前演示了如何基于容器去制作一个所谓的镜像文件,可以把镜像文件push到官方仓库当中,或者是自己的repository中制作镜像并给予此镜像运行容器,改变原有镜像文件默认启动的服务

现在想要运行基于centos的nginx
在这里插入图片描述
基于一个centos镜像跑起来一个容器,而后在里面安装号nginx程序,配置默认页面路径,启动nginx服务
之前运行了,可以进入c1进行操作
在这里插入图片描述
基于此容器安装nginx,为了可以探测网络信息,把network-tools,需要配置好epel仓库在这里插入图片描述在这里插入图片描述
安装以后可以直接访问epel仓库在这里插入图片描述
就有epel仓库了在这里插入图片描述在这里插入图片描述在这里插入图片描述
还是需要把那个源启动起来。需要依赖在这里插入图片描述在这里插入图片描述
在容器当中,必须要让程序跑在前台,一旦放到后台,容器就中止了,对于,nginx,如何运行在前台在这里插入图片描述
表示不运行在后台
在这里插入图片描述在这里插入图片描述
先关掉
在这里插入图片描述
在这里插入图片描述
清理掉缓存,不然缓存的大量文件会到容器里
-g可以额外写配置选项执行
在这里插入图片描述
基于刚才的容器创建c1,所属仓库为空,标签为空,打标签即可,标签为docker.io/magedu/nginx:v0.1.0在这里插入图片描述
把容器启动起来,不打算交互式运行,去掉-it,-d运行在后台,ps可以看到在这里插入图片描述在这里插入图片描述
可以进行访问在这里插入图片描述
还需要修改nginx默认页,直接把网页文件放到镜像打包即可,改内部数据使得我们的镜像没有灵活性了,我们不应该把变化的网页放到容器里
基于容器做镜像,commit,commit以后可以push到仓库里,然后可以pull到镜像,dockerfile创建镜像使用build命令,
镜像下载时需要从仓库拖进来,能否有快捷方式加载镜像,可以使用save命令把制作好的镜像打包备份出来,将一个镜像文件保存为一个归档文件,然后拿这个归档文件,在任何主机上装一个docker去load,就可以装载镜像了
save
load
在这里插入图片描述
node5上现在并没有nginx镜像,在node6上可以把nginx镜像保存为tar格式文件,直接传给node5
save保存为存储格式的https://docs.docker.com/engine/reference/commandline/save/在这里插入图片描述在这里插入图片描述
将镜像文件导出为tar文件:
docker save
Save one or more images to a tar archive (streamed to STDOUT by default)
docker save [OPTIONS] IMAGE [IMAGE…]

-o保存在root目录下,叫nginx-v0,1,0.tar,就可以复制到另外的节点上在这里插入图片描述https://docs.docker.com/engine/reference/commandline/load/

需要load装载这几个tar文件在这里插入图片描述在这里插入图片描述

从tar文件导入镜像 :

docker load
Load an image from a tar archive or STDIN
docker load [OPTIONS]
–input, -i Read from tar archive file, instead of STDIN 导入
–quiet, -q false Suppress the load output 静默模式,不输出任何内容

现在nginx的镜像文件就过来了,只不过没有标签在这里插入图片描述在这里插入图片描述

现在对应的网页文件直接加载的是镜像文件内的数据,现在要改变,可以用docker data volume改变在这里插入图片描述Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层
(称为联合挂载)
如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制
这个机制可以使得每个镜像做的很薄
对于最顶层才是可读可写层,容器关闭,镜像文件不会删除,最上面的层,如果没保存就删除,读写层的生命周期如果没保存就是容器关闭就没 了
在这里插入图片描述
所谓卷就是容器运行的宿主机之上的,一个目录而已,启动一个容器以后,在容器内部找一个目录,这个目录和宿主机的目录建立关联,绑定关系,mount --bind,能够把两个目录绑定在一起,容器的数据都不保存在容器的目录,而绕过联合文件系统,保存在宿主机上在这里插入图片描述
mount目录可以绑定var 看起来跟var一眼,可以把一个目录挂载到另外一个目录上,用这种方式,被绑定的目录是宿主机的,所有文件访问,都不再是容器的文件系统本地数据,而是宿主机上的目录,如果多个容器都需要用,docker有个目录专门管理这些功能
在这个目录下创建子目录来管理,会在底下自动创建
在这里插入图片描述

**docker使用卷有两种方式

Bind mount volume 绑定挂载卷
Docker-managed volume docker 管理卷
区别在于绑定挂载卷容器内的目录是自己指定的,宿主机上的目录也是用户 指定的,而不是由docke自己决定的,
Docker-managed volume docker 管理卷
容器挂载使用卷的时候,用户自己指定,宿主机目录在/var/lib/docker
**在这里插入图片描述
两种方式使用起来非常简单在这里插入图片描述
宿主机卷和容器卷就建立起了关系
在这里插入图片描述在这里插入图片描述
现在先把容器都删除了,避免找起来麻烦在这里插入图片描述

容器名h1 --rm -v 启动挂载至/data/html -it 镜像文件是对应的 bbox-v0.1.0

现在根目录下就直接有data目录在这里插入图片描述在这里插入图片描述
现在在宿主机就可以看到这个文件了,哈希码是卷的ID
docker volume list 可以列出已有的卷
在这里插入图片描述https://docs.docker.com/engine/reference/commandline/volume/在这里插入图片描述
可以使用insepct去探测一个卷的详细信息https://docs.docker.com/engine/reference/commandline/volume_inspect/在这里插入图片描述
显示一个卷的详细信息
mount point 挂载点是谁
labels
scope作用于仅是当前docker主机
在这里插入图片描述
destination挂载至卷内的路径
在这里插入图片描述在这里插入图片描述在这里插入图片描述
-f表示filter,只显示对应的mounts
而mounts是整个json格式的顶级路径
在这里插入图片描述
刚才镜像是没有/data/html。如果有的话,会把容器的目录和宿主机上的卷,关联关系,直接把容器上的内部的文件直接放到宿主机上去用了,可以在宿主机上直接修改

把原来的kill掉,这次启动的是另外一个镜像,httpd里有/data/html,基于这个来创建试试,不让默认运行httpd了,运行/bin/sh进入交互模式看看

默认文件本来就有,接下来看看宿主机上
在这里插入图片描述

-f指明为.mounts在这里插入图片描述

在宿主机上就可以看到目录了在这里插入图片描述
可以在宿主机上直接提供内容
再次启动容器,执行默认命令,-d可以运行在后台
在这里插入图片描述在这里插入图片描述
修改成这样
在这里插入图片描述在这里插入图片描述
现在把容器删除了。卷还有数据,就还在,容器管理的卷,在删除容器后,卷有可能直接删除,所以尽量不要使用容器管理的卷 在这里插入图片描述
卷有可能被删除在这里插入图片描述
所以使用第二种形式的卷,直接指明主机上的某个目录,把卷目录写在后面,hotsdir写前面(主机目录)
在这里插入图片描述
比如在主机上创建目录
在这里插入图片描述在这里插入图片描述
现在创建一个容器和这个目录建立关联关系在这里插入图片描述
现在可以直接使用curl来访问,访问的是容器内部的http服务,网页文件确实是主机上的/appdata下的在这里插入图片描述
源:目标
在这里插入图片描述
这就是容器管理的卷和用户管理的卷

如果容器有卷的话,默认是不会自动删除的,如果要一并删除,使用-v,把容器相关的卷,删除时一并移除了

https://docs.docker.com/engine/reference/commandline/rm/在这里插入图片描述
没有-v数据还在在这里插入图片描述
https://docs.docker.com/engine/reference/commandline/create/
在创建容器的时候,-v是指定卷的 **
在这里插入图片描述
指明卷的驱动
在这里插入图片描述
可以多个容器的转使用同一个主机目录在这里插入图片描述多个容器的卷使用
同一个主机目录,例如
ɰ ~]# docker run –it --name c1 -v /docker/volumes/v1:/data busybox 使用第1个容器制定一个卷
ɰ ~]# docker run –it --name c2 -v /docker/volumes/v1:/data busybox 使用第二个容器制定一个卷**

复制使用其它容器的卷,为docker run命令使用–volumes-from选 项

ɰ ~]# docker run -it --name bbox1 -v /docker/volumes/v1:/data busybox 第一个容器指明卷是如何关联
ɰ ~]# docker run -it --name bbox2 --volumes-from bbox1 busybox 复制另外一个容器的卷
在这里插入图片描述
可能有个容器起来就一个目的,定义一个卷让其他容器复制用的在这里插入图片描述
启动容器在这里插入图片描述
再启动一个容器,这个容器默认是没有卷的,也没有目录,但是可以复制h2的卷定义,这样就是两个容器使用同一个卷在这里插入图片描述
将来可以定义一个容器,容器的目录可以跟宿主机的目录建立关联关系,本身不打算访问数据,启动任何其他容器的时候为了免自己定义路径,run form这个卷,就直接复制卷定义,
这个容器存在的定义就是为了其他卷提供卷模版
这种方式也可以让多个容器使用同一个模版来访问同一个目录
在这里插入图片描述
在使用create 和run的时候还有一个选项,link和网络有关在这里插入图片描述在这里插入图片描述在这里插入图片描述https://docs.docker.com/engine/reference/commandline/volume_rm/
专门删除卷的,强行删除在这里插入图片描述
现在就可以绕过容器生命周期来使用数据存储,这个卷还有另外的使用方式,如果你的卷在宿主机上也不是本地的,在宿主机上是挂载的分布式存储,每个容器使用卷的目录路径都在对应的存储上,只要宿主机能访问,容器关联到路径,就能访问
这时候驱动就不是local了而是cluster fs
在这里插入图片描述

转载地址:http://xckgn.baihongyu.com/

你可能感兴趣的文章
拥抱.NET 5,从自研微服务框架开始
查看>>
C# 中的 is 真的是越来越强大,越来越语义化
查看>>
简单理解CAP-BASE
查看>>
gRPC-微服务间通信实践
查看>>
Firefox 18周岁
查看>>
IdentityServer4系列 | 初识基础知识点
查看>>
为什么我们总是「习惯性辩解」?
查看>>
.NET 异步解说
查看>>
Magicodes.IE 2.4发布
查看>>
程序员修神之路--它可能是分布式系统中最重要的枢纽
查看>>
诊断日志知多少 | DiagnosticSource 在.NET上的应用
查看>>
Chrome正在启用HTTP/3,支持IETF QUIC
查看>>
Net5 已经来临,让我来送你一个成功
查看>>
System.Text.Json中时间格式化
查看>>
怎么将SVG转成PNG(.NET工具包编写)
查看>>
为什么曾经优秀的人突然变得平庸?
查看>>
.NET 5 中的隐藏特性
查看>>
.NET5都来了,你还不知道怎么部署到linux?最全部署方案,总有一款适合你
查看>>
我画着图,FluentAPI 她自己就生成了
查看>>
BenchmarkDotNet v0.12x新增功能
查看>>