本文共 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/