Docker数据卷及镜像管理
背景
在程序中,数据结果是用户的最终目的,而程序是处理数据的工具,二者因为业务走到了一起,但彼此本质是相互独立的。默认情况下docker所有的数据和容器绑定,删除容器的同时也会将其产生的数据删除。很明显这不是我们要的结果,最好的方式是将数据卷和程序独立开。docker针对这样的业务也提供了自己的处理方案:数据卷
,
内容
数据卷
Docker创建通过volume
创建数据卷,它存放的路径默认为:/var/lib/docker/volumes
下
1 | docker volume create [数据卷名称] |
同样还可以查看数据卷的详细描述信息
1 | docker volume inspect [数据卷名称] |
也可以列出已有的数据卷
1 | docker volume ls |
还可以清理和删除无用的数据卷
1 | 删除数据卷 |
同样,在我们创建容器的时候,可以通过--mount
将任意路径指定为该容器的数据卷
1 | docker run -d --mount type=[数据卷类型],source=[宿主机路径],target/destination=[容器映射路径] [镜像名] |
至于上面的source
和target/destination
则需要看情况进行设定,这主要因为type
的不同,type分三种:volume(普通数据卷,直接将docker默认路径下的文件夹映射到容器中)、bind(绑定数据卷,直接将主机下任意路径映射到容器中)、tmpfs(临时数据卷,直接存在内存中)
1 | 除了volume类型外,其他的都要指定为destination |
仔细观察会发现,bind和-v一样。其实挂载在容器下的数据卷默认拥有可读可写的权限,我们也可以设置只写权限
1 | docker run -itd -v [宿主本地绝对路径]:[容器路径]:ro [容器名称]:[版本] /bin/bash |
那么对于多容器之间进行数据交互呢?此时可以使用数据卷容器(即先创建一个数据卷容器,然后在其他容器中直接加载该数据卷). 指令为--volumes-from
,参数为容器名,表示挂载对应容器下的数据卷
1 | 先创建一个有数据卷的容器,它会在容器根目录下创建文件夹shuai |
当我们删除容器的时候,该数据卷默认是不会删除的,除非手动删除。通过数据卷,我们则可以实现多容器对同一个目录下内容的访问,同时借助它,还可以实现数据卷的备份和迁移。
1 | 备份:创建一个容器,用于备份已存在的数据卷.这样就可以将备份的文件存到当前路径下了 |
上面的内容其实并不好理解,主要是因为容器本身是无法访问宿主机的内容的,所以需要将当前的路径映射到容器中才能够正常的进行访问,至于为什么使用ubuntu
,其实只是借助其中的tar
命令压缩文件夹而已。
容器互联
如果不对容器进行设置的话,在容器的外部本质上是无法访问容器内部的应用和服务的,而让外部能够访问容器内部的服务,则需要通过-p或-P
指定端口映射.
1 | -P:随机映射宿主机49000~49900端口之间的一个到容器内部开放的网络端口 |
如果要查看当前容器的端口配置,则可以
1 | docker port [容器ID] |
如果要修改容器内部的文件的话,你会发现是没有vi、vim等编辑方式的,解决办法是利用docker cp命令将文件复制出来修改
,然后再复制回去.
1 | docker cp [容器ID]:路径 [宿主机路径] |
上述只是将容器的端口对外开放,便于外部访问容器内部的内容,并没有实现容器内部的互联,容器内部的互联需要通过参数:--link
1 | 注意link的使用,其他的并无什么异常 |
创建完以后,则目标容器就可以与新建的容器之间相互联系了,并且由于没有使用-P、-p
,避免了将端口暴露在宿主机上,提高了安全性。如果想查看内部的网络的使用情况,则可以通过env
参数
1 | 主机env参数即可,--rm表示退出容器后就直接删除该容器 |
同样,你也直接进入相关联的其中一个容器中检查/etc/host
文件,其中带别名的就是主容器,一串符号的就是当前容器。
然后如果有所疑问的话,可以在容器中使用ping
命令检测一下主容器是否可链接。
1 | ping 172.168.0.2 |
But,会收到提示说没有ping命令,没错,是真的没有,如果你确实需要在容器中安装其他软件,可以进入容器,然后:
1 | 先更新,否则会提示找不到软件 |
镜像管理
镜像管理,主要是描述利用dockerfile配置文件创建自定义镜像的内容,然而才疏学浅,文中多处描述实属看得一脸懵,需要配合实际案例来理解,现下只记录一下利用dockerfile创建镜像的命令
1 | docker build -t [仓库名/新镜像名:版本] [镜像所需文件的绝对路径] |