前言

docker可以通过读取Dockerfile来自动构建镜像,但使用时必须遵守一定的规范和格式.关于Dockerfile指令介绍可以点我

简介

一个docker镜像是由一堆由下至上,只能读的层构成的,上一层是在下一层的基础上构建起来的,每一层对应一个Dockerfile的指令.让我们观察下这个Dockerfile:

FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py

每个指令创建一个层

  • FROMubuntu:18.04作为基础镜像
  • COPY 添加宿主机当前文件夹所有文件到docker容器/app目录下
  • RUN 编译/app下文件
  • CMD 当容器启动时执行的命令

当你运行一个镜像并且生成一个容器的时候,会在镜像最上面添加一层读写层.所有的操作包括文件修改,删除,新增都只发生在该读写层上面.

如果想更多的了解镜像层级关系,docker是怎么构建和存储镜像的,可以查看存储驱动

一般的建议和指导

构建最小化配置镜像

我们构建镜像,应该能快速停止,摧毁,重建,并且只需要极少的配置.其实很好理解,如果说你构建的镜像每次重新部署要配置一大堆东西,为啥还要镜像? 关于理论上的事情,大家可以参考Twelve-factor应用方法论

明白构建上下文

当你使用docker build命令时,包含Dockerfile的当前文件夹就称为构建环境(构建上下文).这个文件夹中的所有内容都会发送到docker deamon(docker的服务进程)中作为构建镜像的环境. 构建上下文案例一

  1. 创建一个文件夹作为构建上下文,并进入其中.

  2. 创建一个文件hello.txt,并写入hello world作为内容

  3. 创建Dockerfile文件,并且由它构建的镜像启动时执行cat命令

  4. 使用当前文件夹作为构建上下文,注意.表示当前文件夹

    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 .

构建案例二 在案例一的基础上,把Dockerfilehello.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

THE END
开启精彩搜索

历史搜索

用户名或邮箱
密码
用户名
密码
重复密码
邮箱
注册
找回密码
注册 登录
邮箱
邮箱验证码
发送验证码
59秒后可重发
新密码
重复密码
请选择支付方式
余额支付

购买将消耗【10

微信支付
微信扫码支付 0 元
[ 04分50秒 ]
请使用微信扫一扫
扫描二维码支付
支付宝支付
支付宝扫码支付 0 元
[ 04分50秒 ]
请使用支付宝扫一扫
扫描二维码支付
已完成支付
未完成支付

请输入验证码

点击验证码可以刷新

你确认吗?

确认

2024年10月1日

新增

新增