Docker 的数据管理
1.Docker 的数据管理
Docker镜像是由一层一层的文件系统堆叠起来的,镜像中的这些层都是只读的,当我们运行容器的时候,就是在这些只读的镜像层之上添加新的可写层,也就是容器层,对于运行中的容器所做的所有更改(比如写入新文件、修改现有文件、删除文件)都将写入这个容器层。
(1)管理 Docker 容器中数据主要有两种方式
数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)。
(1)数据卷
数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作。
(2)数据卷容器
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。
2.docker 镜像结构的分层
(1)镜像加载原理
bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。
rootfs,在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
docker 镜像结构的分层
3.Docker 镜像的创建
(1)基于现有的镜像创建
(1)先用现有的镜像创建启动容器
docker run
(2)再进入容器进行内容更新
docker exec
(3)最后将容器提交成新的镜像
docker commit
(2)基于模板文件创建
先获取模板文件
1)docker export 将本地容器导出成模板文件
2)从网上下载现成的模板文件
再 docker import 将模板文件导入成镜像
cd /opt/
rz -E上传debian-7.0-x86-minimal.tar.gz
ls
#导入为镜像
docker import debian-7.0-x86-minimal.tar.gz -- debian:7.0
docker images
docker run -id debian:7.0 sh
docker ps -a
(3)基于Dockerfile创建
FROM 指定基础镜像(是Dockerfile的第一行指令)
MAINTAINER|LABEL 指定镜像维护人的信息和元数据(可选)
RUN 指定linux命令,尽量将多条命令合并在一个RUN指令里,用 ; 或 && 或 <<EOF 串起来使用
EXPOSE 指定容器要开启的端口号
ENV 指定容器的环境变量
ADD|COPY 复制本地文件或目录到镜像里
VOLUME 指定容器的匿名数据卷(作用类似于 docker run -v /var/lib/docker/volumes/容器ID/:容器数据卷目录/)
USER 指定容器的运行用户
WORKDIR 指定镜像层后续的工作目录
ARG 指定构建镜像时传入的参数变量(docker build --build-arg 变量=值)
CMD|ENTRYPOINT 指定容器启动时执行的命令和参数
(1)ADD 和 COPY 的区别?
共同点:都可以将本地的文件或目录复制到镜像里
区别:ADD可以通过URL地址下载文件并复制到镜像里,还能将本地的压缩包文件解压后再复制到镜像里(URL下载和压缩包解压特性不能同时生效,即通过URL下载的压缩包只能以压缩包的形式复制到镜像里)。而COPY没有URL下载和压缩包解压的特性。
(2)CMD 和 ENTRYPOINT 的区别?
共同点:都可以用来指定容器的启动命令
区别:ENTRYPOINT指定的容器启动命令优先级更高,如果ENTRYPOINT和CMD同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的参数使用
(3)容器启动命令的优先级排行
docker run --entrypoint="命令" --> 镜像里的ENTRYPOINT指令指定的"命令" --> docker run .... 镜像 "命令" --> 镜像里的CMD指令指定的"命令"
4.使用Dockerfile构建镜像的步骤
(1)编写Dockerfile文件,在第一行用 FROM 指令指定基础镜像
(2)用 MAINTAINER 或 LABEL 指令指定镜像的元数据信息(可选)
(3)用 RUN COPY ADD ENV EXPOSE 等指令编写操作镜像的过程
(4)最后用 CMD 或 ENTRYPOINT 指令指定容器启动命令
(5)完成Dockerfile文件的编写后,用 docker build -t 镜像名:标签 . 命令来构建镜像
5.如何缩小镜像的体积大小?
1)尽可能的使用较小体积的基础镜像(推荐使用 alpine 镜像)
2)尽可能的减少Dockerfile中的指令数量,从而减少镜像的层数
3)在RUN指令结尾添加清空安装软件的缓存和软件包的命令
4)使用 .dockerignore 文件,添加不需要复制到镜像里的文件名或子目录名
5)容器镜像里一般只运行单个应用
6)使用多阶段构建的方法
FROM 第一构建阶段的基础镜像 as 阶段别名 #在第一阶段,安装依赖项并构建项目
....
FROM 第二构建阶段的基础镜像
#在第二阶段,复制上一阶段构建产物的文件或目录,并使用它来运行应用程序,这样最终的镜像中就不会有不必要的依赖和代码
COPY --from=第一构建阶段的别名 第一构建阶段的项目文件或目录 当前阶段的路径
....
CMD或ENTRYPOINT 指定容器启动命令
6.docker容器的重启策略
docker run --restart=no | always | on-failure | unless-stopped ...
no:不管容器是正常退出还是异常退出,都不会重启容器。默认策略。
always:不管容器是正常退出还是异常退出,总是会重启容器。
on-failure:只在容器异常退出时重启容器。on-failure:N 表示容器异常退出时最多重启容器N 次
unless-stopped:总是重启容器,但不考虑docker服务端进程启动时就已经处于退出状态的容器
注:文件操作说明