前言
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
当容器启动时执行的命令
当你运行一个镜像并且生成一个容器的时候,会在镜像最上面添加一层读写层
.所有的操作包括文件修改,删除,新增都只发生在该读写层上面.(www.hedaoshe.com)
如果想更多的了解镜像层级
关系,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