数据卷
为了很好的实现数据保存和数据共享,
Docker
提出了
Volume
这个概念,简单的说就是绕过默认的联合
文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。
数据卷
是一个可供一个或多个容器使用的特殊目录,它绕过
UFS
,可以提供很多有用的特性:
数据卷
可以在容器之间共享和重用
对
数据卷
的修改会立马生效
对
数据卷
的更新,不会影响镜像
数据卷
默认会一直存在,即使容器被删除
创建数据卷
docker volume create my-vol

查看所有数据卷
docker volume ls
查看数据卷信息
docker volume inspect my-vol

删除一个
volume
docker volume rm my-vol
数据卷 是被设计用来持久化数据的,它的生命周期独立于容器, Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷,无主的数据卷可能会占据很多空间,所以要及时删除 .
挂载数据卷
在用 docker run 命令的时候,使用 -- mount 标记来将 数据卷 挂载到容器里。在一次 dockerrun 中可以挂载多个 数据卷 。
docker run -itd \ --name 容器名字 \ --mount source=数据卷名称,target=容器中的对应目录 \ 镜像名称
最好是通过 run 而非 create/start 创建启动容器, create/start 命令创建启动容器后,再挂载数据卷相当麻烦,要修改很多配置文件,但并非不可以加了 “\” 意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车如果数据卷不存在, docker 会自动创建如果容器上目录不存在, docker 会自动创建
在cent01容器中将my-vol数据卷中的var文件夹挂载 ,镜像为centos
docker run -itd --name cent01 --mount source=my-vol,target=/var centos
在数据卷的_data文件夹中新建一个1.jpg文件做验证
开启另一个窗口查看
语句:docker images && docker ps -a (&&表示多条一起执行)
查看数据卷的具体信息
docker inspect name
挂载目录
docker run -itd \ --name 容器名字 \ --mount type=bind,source=宿主机目录,target=容器中的对应目录 \ 镜像名称
数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。
创建数据卷容器
docker run -itd --name name -v dir centos

挂载数据卷容器
docker run -itd --name name --volumes-from db_data centos
Dockerfile构建镜像
Dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像,另外,使用 Dockerfile 去构建镜像好比使用 pom 去构建 maven 项目一样,有异曲同工之妙
构建基础镜像
1. 空间大小差异, alpine 默认 5M 左右, centos 等都在 200M 左右。2. 默认软件包差异, alpine 选用 busybox , centos 等则是 bash+coreutils 几件套。3. alpine 中,国际化组件被优化掉了。4. 还有一点, alpine 中选用的都是 “ 最简依赖 ” ,这点和 archlinux 比较像,举个例子,openssh 包不会自带 pam 插件,于是他也就不支持 ldap 。这点我给 alpinelinux 官方提过issue 。和 php 不一样, php 可以做成 php-pdo , php-dom 的包,然后动态加载共享库。openssh 不行, “ 没带就是没写 ” 。5. glibc 差异, alpine 选用 musl , centos 等选用 glibc ,其他的倒还好, libc 的差异对开发很重要。
基本结构
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
准备工作
创建文件夹上传 jdk 的安装包 , 和在同级目录下编写 Dockerfile 文件编写 Dockerfile 文件
#1. 指定基础镜像,并且必须是第一条指令FROM centos:latest#2. 指明该镜像的作者和其电子邮件MAINTAINER xx "xx@qq.com"#3. 在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录WORKDIR /usr/local/java#4. 一个复制命令,把 jdk 安装文件复制到镜像中 , 注意: jdk*.tar.gz 使用的是相对路径ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/#5. 配置环境变量ENV JAVA_HOME=/usr/local/java/jdk1.8.0_221ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV PATH=$JAVA_HOME/bin:$PATH# 容器启动时需要执行的命令 如果仅仅是把本地的文件拷贝到容器镜像中, COPY 命令是最合适不过的。其命令的格式为: COPY <src> <dest>ADD 命令的格式和 COPY 命令相同,也是: ADD <src> <dest>区别: ADD 解压压缩文件并把它们添加到镜像中
创建镜像
编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像。
docker build -t jdk8:v1.0 .
注 1 : -t jdk8:v1.0 给新构建的镜像取名为 jdk8 , 并设定版本为 v1.0注 2 :注意最后有个点,代表使用当前路径的 Dockerfile 进行构建