Docker 学习文档(知识结构整理)

2020-06-17 06:57:09易采站长站整理

从基础镜像开始就已经在缓存中了,下一个指令会对比所有的子镜像寻找是否执行相同的指令,如果没有则缓存失效。在大多数情况下只对比Dockerfile指令和子镜像就足够了。ADD和COPY指令除外,执行ADD和COPY时存放到镜像的文件也是需要检查的,完成一个文件的校验之后再利用这个校验在缓存中查找,如果检测的文件改变则缓存失效。RUN apt-get -y update命令只检查命令是否匹配,如果匹配就不会再执行更新了。

为了有效地利用缓存,你需要保持你的 Dockerfile 一致,并且尽量在末尾修改。

Dockerfile 指令FROM: 只要可能就使用官方镜像库作为基础镜像RUN: 为保持可读性、方便理解、可维护性,把长或者复杂的RUN语句使用分隔符分成多行不建议RUN apt-get update独立成行,否则如果后续包有更新,那么也不会再执行更新避免使用RUN apt-get upgrade或者dist-upgrade,很多必要的包在一个非privileged权限的容器里是无法升级的。如果知道某个包更新,使用apt-get install -y xxx标准写法RUN apt-get update && apt-get install -y package-bar package-foo

例子:


RUN apt-get update && apt-get install -y
aufs-tools
automake
btrfs-tools
build-essential
curl
dpkg-sig
git
iptables
libapparmor-dev
libcap-dev
libsqlite3-dev
lxc=1.0*
mercurial
parallel
reprepro
ruby1.9.1
ruby1.9.1-dev
s3cmd=1.1.0*

CMD: 推荐使用CMD [“executable”, “param1”, “param2”…]这种格式,CMD [“param”, “param”]则配合ENTRYPOINT使用

EXPOSE: Dockerfile 指定要公开的端口,使用docker run时指定映射到宿主机的端口即可ENV: 为了使新的软件更容易运行,可以使用ENV更新PATH变量。如ENV PATH /usr/local/nginx/bin:$PATH确保CMD [“nginx”]即可运行

ENV也可以这样定义变量:


ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADDorCOPY:ADD比COPY多一些特性「tar 文件自动解包和支持远程 URL」,不推荐添加远程 URL

如不推荐这种方式:

ADD http://example.com/big.tar.xz /usr/src/things/

RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things

RUN make -C /usr/src/things all

推荐使用 curl 或者 wget 替换,使用如下方式:

RUN mkdir -p /usr/src/things

&& curl -SL http://example.com/big.tar.gz | tar -xJC /usr/src/things

&& make -C /usr/src/things all

如果不需要添加 tar 文件,推荐使用COPY。

参考文档: