Docker 镜像本质是什么?
是一个分层文件系统
统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
Docker镜像是由特殊的文件系统叠加而成,
最底端是 bootfs
,并使用宿主机的 bootfs
。
第二层是root文件系统rootfs
,称为base image
然后再往上可以叠加其他的镜像文件

Centos的iso镜像文件包含bootfs
和rootfs
,而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/