卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
1.数据卷可在容器之间共享或重用数据
2.卷中的更改可以直接生效
3.数据卷中的更改不会包含在镜像的更新中
4.数据卷的生命周期一直持续到没有容器使用它为止
docker run -it -v /宿主机绝对路径目录:/容器内目录 <镜像名>
查看数据卷是否挂载成功
docker inspect 容器ID
默认挂载的路径权限为读写。如果指定为只读可以用:ro
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro <镜像名>
注:Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可
补:还可以通过DockerFile添加数据卷,在之后DockerFile会讲到。
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
1.以centos镜像为模板运行容器dc01作为父容器
docker run -it -v /usr/centos/mycentos:/usr/centos/mycentos --name dc01 centos
在/usr/centos/mycentos目录下添加dc01.txt
touch dc01.txt
2.dc02、dc03继承自dc01
docker run -it --name dc02 --volumes-from dc01 centos
docker run -it --name dc03 --volumes-from dc01 centos
分别在dc02、dc03的mycentso目录下添加dc02.txt、dc03.txt
3.回到dc01容器中mycentos目录下可以看到dc02、dc03各自添加的文件都能共享了
4.删除dc01,dc02的mycentos目录下新建dc02_update.txt后,查看dc03容器内文件还是可以共享
6.此时只有一个dc03了,现在我们在dc03的mycentos目录下新建dc03-update.txt
7.新建dc04继承dc03,在dc04的mycentos目录下可以看到共享的文件
docker run -it --name dc04 --volumes-from dc03 centos
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤
1.每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2.指令按照从上到下,顺序执行
3.#表示注释
4.每条指令都会创建一个新的镜像层,并对镜像进行提交
总结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
3 Docker容器,容器是直接提供服务的。
指令 | 说明 |
---|---|
FROM | 基础镜像,当前新镜像是基于哪个镜像的 |
MAINTAINER | 镜像维护者的姓名和邮箱地址 |
RUN | 容器构建时需要运行的命令 |
EXPOSE | 当前容器对外暴露出的端口 |
WORKDIR | 指定在创建容器后,终端默认登陆的进来工作目录 |
ENV | 用来在构建镜像过程中设置环境变量,例如ENV MY_PATH /usr/mytest,后续其他指令可以通过$MY_PATH使用 |
ADD | 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 |
COPY | 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件或目录复制到新的一层的镜像内的 <目标路径> 位置。 例如: COPY src dest或COPY [“src”, “dest”] |
VOLUME | 容器数据卷,用于数据保存和持久化工作 |
CMD | 指定一个容器启动时要运行的命令。 格式: CMD CMD ["<可执行文件或命令>","","",…] CMD ["","",…] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数 Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换 |
ENTRYPOINT | 指定一个容器启动时要运行的命令ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数 |
ONBUILD | 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发 |
登录阿里云开发者平台https://dev.aliyun.com/search.html,创建镜像仓库
镜像创建完毕
将镜像推送到Registry(此处点开仓库列表的管理,可以看到详细步骤)
$ sudo docker login --username=relive27 registry.cn-beijing.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-beijing.aliyuncs.com/relive/mycentos:[镜像版本号]
$ sudo docker push registry.cn-beijing.aliyuncs.com/relive/mycentos:[镜像版本号]