Docker镜像原理与Dockerfile

Docker 镜像本质是什么?

是一个分层文件系统

统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。

当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?

Docker镜像是由特殊的文件系统叠加而成,
最底端是 bootfs,并使用宿主机的 bootfs

第二层是root文件系统rootfs,称为base image
然后再往上可以叠加其他的镜像文件

Docker镜像原理与Dockerfile

Centos的iso镜像文件包含bootfsrootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层

Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?

由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB

使用docker inspect 镜像名也可以看到layers,即分层镜像。

dockerfile

容器转成镜像:

docker commit 容器id 镜像名称:版本号

压缩和解压:

docker save -o 压缩文件名称 镜像名称:版本号
docker load -i 压缩文件名称

除此之外,可以用dockerfile来制作镜像。

语法

FROM & RUN & USER

From debian:wheezy
USER cowsay
Run apt-get update && apt-get install -y cowsay fortune

FROM指令指定初始镜像,这里使用debian,并且指定了wheezy版本

USER指定build或启动的时候,run cmd entrypoint执行时使用的用户。

RUN用于执行指令

ENTRYPOINT

ENTRYPOINT ["/usr/games/cowsay"]

ENTRYPOINT指定一个可执行文件,传给docker run作参数,一般在制作一些执行就关闭的容器中会使用。

COPY & ADD

COPY entrypoint.sh /
ADD entrypoint.sh /

把一个文件从主机(可使用dockerfile所在路径的相对路径)复制到镜像的文件系统。COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。

ENV & ARG

ENV NGINX_VERSION   1.17.9

指定环境变量

ARG some_variable_name=default_value

RUN echo "Oh dang look at that $some_variable_name"

可以用来作为构建的参数(当然也可以使用环境变量)。

MAINTAINER & LABEL

MAINTAINER John Smith <john@smith.com>

LABEL maintainer="John Smith <john@smith.com>"

MAINTAINER设定作者的联系信息,可以使用LABEL代替,LABEL设置的属性最终可以在docker image的基本属性中查看

EXPOSE

EXPOSE 80

暴露端口

VOLUME & WORKDIR

VOLUME /data

WORKDIR /data

VOLUME定义外部可以挂载的数据卷,WORKDIR指定工作目录,如果没有自动创建

CMD

第一种用法:

CMD java -jar app.jar

运行一个可执行的文件并提供参数。

第二种用法:为ENTRYPOINT指定参数。

第三种用法:

CMD["/bin/bash"]

设置启动容器默认打开的终端

使用Dockerfile创建镜像

docker build -f ./centos_dockerfile -t vim_centos:1 .

-f Dockerfile指定dockerfile的位置

-t image_name:tag指定镜像的名字及标签

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/docker%e9%95%9c%e5%83%8f%e5%8e%9f%e7%90%86%e4%b8%8edockerfile/