前言
docker可以通过读取Dockerfile来自动构建镜像,但使用时必须遵守一定的规范和格式.关于Dockerfile指令介绍可以点我
简介
一个docker镜像是由一堆由下至上,只能读的层构成的,上一层是在下一层的基础上构建起来的,每一层对应一个Dockerfile的指令.让我们观察下这个Dockerfile:
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
每个指令创建一个层
FROM以ubuntu:18.04作为基础镜像COPY添加宿主机当前文件夹所有文件到docker容器/app目录下RUN编译/app下文件CMD当容器启动时执行的命令
当你运行一个镜像并且生成一个容器的时候,会在镜像最上面添加一层读写层.所有的操作包括文件修改,删除,新增都只发生在该读写层上面.
如果想更多的了解镜像层级关系,docker是怎么构建和存储镜像的,可以查看存储驱动
一般的建议和指导
构建最小化配置镜像
我们构建镜像,应该能快速停止,摧毁,重建,并且只需要极少的配置.其实很好理解,如果说你构建的镜像每次重新部署要配置一大堆东西,为啥还要镜像? 关于理论上的事情,大家可以参考Twelve-factor应用方法论
明白构建上下文
当你使用docker build命令时,包含Dockerfile的当前文件夹就称为构建环境(构建上下文).这个文件夹中的所有内容都会发送到docker deamon(docker的服务进程)中作为构建镜像的环境. 构建上下文案例一
创建一个文件夹作为构建上下文,并进入其中.
创建一个文件
hello.txt,并写入hello world作为内容创建
Dockerfile文件,并且由它构建的镜像启动时执行cat命令使用当前文件夹作为
构建上下文,注意.表示当前文件夹mkdir myproject && cd myproject echo "hello" > hello.txt echo -e "FROM busybox\nCOPY /hello.txt /\nRUN cat /hello.txt" > Dockerfile docker build -t helloapp:v1 .
构建案例二 在案例一的基础上,把Dockerfile和hello.txt文件分开.在使用docker build时,清除掉案例一的缓存,并指定Dockerfile文件的位置
mkdir -p dockerfiles context
mv Dockerfile dockerfiles && mv hello.txt context
docker build --no-cache -t helloapp:v2 -f dockerfiles/Dockerfile context
难点解析
echo -e表示启用转义字符,例如\n代表换行COPY /hello.txt /把上下文环境中的hello.txt文件拷贝到镜像中,一定要注意COPY指令永远是从宿主机把文件拷贝到docker镜像中.--no-cache表示清除掉案例一的缓存-f dockerfiles/Dockerfile context指定Dockerfile文件位置和上下文环境文件夹,一定要注意,docker build最后结尾一定是以上下文环境文件夹结尾.
当你不小心把非构建镜像必须的文件放入了上下文环境文件夹,会使得镜像变得更大,加载更慢.所以放入其中的文件一定要精简.当你在构建镜像的过程中,会出现类似下面这样的信息,显示你上下文的大小. Sending build context to Docker daemon 187.8MB