Docker三要素
-
Images:镜像,是容器的一个“静态版本”,即容器可操作,而镜像不可操作。
-
Containers:容器,是镜像的一个运行实例,一个简易版的Linux环境和运行在其上面的应用程序。
-
Registry:仓库,上面存放着各种各样的镜像版本供用户下载。
UnionFS(联合文件系统)
UnionFS
是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加。同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。特性:一次加载多个文件系统,但是在外部看来,只能看到一个文件系统,联合文件系统加载各层文件并叠加起来,这样最终的文件系统会包含
BootFS
主要包括BootLoader
和Kernel
,BootLoader
主要是引导加载Kernel
。Linux
刚启动时会加载BootFS
文件系统,在Docker
最底层就是BootFS
。这一层与典型的Linux/Unix
系统是一样的,包括BootLoader
和Kernel
。当BootLoader
加载完Kernel
之后,整个内核就在内存中了,此时内存使用权由BootLoader
交由Kernel
,此时系统将卸载Kernel
。RootFS
包含了Linux
系统的/dev, /proc, /bin, /etc, /usr
等标准目录和文件,即Linux
系统不同的发行版本,如CentOS
、Ubuntu
等。Docker
中的Linux
镜像之所以小,是因为可以与宿主机子公用BootFS
内核部分,而镜像只需要提供不同发行版本不同的RootFS
即可。
Why?为什么Docker要使用这种分层结构?
为了资源共享,每个单独镜像所包含的文件并不是绝对独立的,比如Zookeeper
与Tomcat
,他们都依赖于CentOS
、Kernel
内核与JDK
,则他们会进行资源共享,共同用同一份资源,节省了资源。
Docker自定义镜像
docker commit
- 通过编写
docker file
与docker build
Docker容器数据卷Volume
Docker容器数据持久化与数据共享
- 数据持久化(将Docker容器数据与宿主机文件进行共享传递)
docker run -v [宿主机文件夹]:[docker容器内文件夹] [image]:[version]
- 编写
dockerfile-volumes
创建多个数据卷文件夹
- 数据共享
docker run -it --name xxx volumes-from xxx [image]:[version]
实现继承- 继承的父子容器间(整个有关联到的继承体系)都存在数据卷共享
- 数据卷的生命周期一直持续到没有容器使用它为止
Docker 保留字指令
FROM
基础镜像
MAINTAINER
镜像维护者的姓名与邮箱
RUN
容器构建时需要运行的命令
EXPOSE
对外暴露端口
WORKDIR
初始化容器之后默认进入的目录
ENV
在构建镜像的过程设置环境变量
COPY
将文件拷贝进镜像内
ADD
将文件拷贝进镜像内,并解压缩
VOLUME
容器数据卷,用于数据保存和持久化工作
CMD
指定一个容器启动时要运行的命令, dockerfile中可以有多个CMD指令,但只有最后一个会生效,CMD会被
docker run
之后的参数所替换ENTRYPOINT
指定一个容器启动时要运行的命令,ENTRYPOINT目的与CMD一样,都是在指定容器启动程序及参数,但是ENTRYPOINT不会覆盖之前的参数,而是追加
ONBUILD
当构建一个子镜像继承于父镜像时,父镜像在被子镜像继承后,父镜像的ONBUILD命令触发