docker镜像及构建

虚悬镜像(无标签,仓库名的镜像)

docker pull或者build,新旧镜像同名,旧的镜像的名字就变成了,这种旧的镜像可以批量删除掉

列出docker中所有的虚悬镜像

docker image ls -f dangling=true

虚悬镜像清除

docker image prune

中间层镜像

为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。

docker image ls -a

镜像加速

vi /etc/docker/daemon.json
添加如下json格式配置,

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

配置后重启服务

systemctl daemon-reload
systemctl restart docker

运行镜像,容器退出后删除该容器

本地调试时十分有用
在运行指令后加上参数 --rm
docker run --rm xxx

Dockerfile 构建镜像

FROM

from 用于指定基础镜像,作为自己镜像的底层,新的镜像在这个层的上面做修改
这个是必备的指令,而且是第一条指令
比如操作系统镜像,ubuntu,debian,centos,fedora,alpine
推荐用的是debian,
大致的理由应该是:适合服务器的操作系统,基础核心小,长期运行稳定,而且经过了生产环境的大量实践
可以考虑现在的最新稳定版本bullseye,或者用buster,stretch也行。

FROM scratch

这个scratch是docker里面的特殊镜像,表示空白镜像。
有一些相关的文档记录了构建Go语言编写的程序镜像的时候,可以用这个空白镜像,减少镜像的体积。
参考文档:

https://www.jianshu.com/p/daebace9f52c

RUN

用于执行命令行命令
注意点:可以在一起顺序执行的命令,写在一个RUN命令中,因为一个RUN,镜像就会建立一层,多次RUN会导致产生
很多层的镜像,会增加镜像的臃肿程度
可以用&&将要执行的命令串联起来,可以用\进行换行

RUN sed -i 's#xxx#xxx#g' /etc/apt/sources.list \
         && mkdir -p /usr/local/work

COPY

copy 源路径 目标路径
copy指令将构建上下文的目录中的指定文件,复制到新的一层镜像的目标路径位置
源路径可以匹配通配符,批量拷贝多个文件到目标路径中
copy的时候,默认会把文件的读写执行等权限以及文件修改时间保留与源文件一致

ADD

add也是复制文件到目标路径中,但是功能会复杂一些

  • add的源路径可以是url,docker会自动下载文件,然后复制
  • add的源文件如果是压缩文件会自动解压缩
    一般来说用copy会更好,除非以上两种情况

CMD

用于指定容器运行的服务
一般写法为exec形式,shell形式会被包装为 sh -c的形式执行,主体对象就变成了sh,
sh执行结束,容器也就结束了
所以一般来说类似的写法为 CMD ["可执行文件","参数1",“参数2”]

CMD ["./customer-service","arg1","arg2"]

ENTRYPOINT

与CMD的作用是一样的,好的地方是可以在镜像构建完成以后,在后面补充参数
个人觉得生产环境不推荐,隐藏的增加了镜像使用的复杂度,感觉启动方式越简单越好

ENV

定义环境变量,后续命令中就可以使用,一些很长的名称,路径或者版本号什么的可以用这个替换下
这个变量定义好以后,容器中的env也会生效
有一个不算坑的坑

ENV VERSION 1.0
RUN echo 'aaa$VERSIONbbb'
RUN echo "aaa$VERSIONbbb"

第一个不会被替换为环境变量,要用双引号
这个是shell的引号特性
单引号会忽略所有特殊字符
双引号忽略的字符不包括$\`

ARG

ARG USERNAME=lvhuxu
RUN echo ${USERNAME}
ARG 是在构建时参与替换的,容器启动后环境变量中不会生效
ARG的变量在多个阶段构建中要重新定义,每一个FROM后,ARG都会失效

VOLUME

VOLUME /data
这个属于匿名挂载,一般用的少,这个挂载到的主机数据在容器关闭后就没了,只是为了以防大量数据写入容器存储层
一般重要的数据存储要使用命名挂载

EXPOSE

申明启动的端口,不会实际生效,没啥用

WORKDIR

WORKDIR /dist/sbin
指定工作目录,后续的各层的当前目录将改为指定的目录

USER

指定当前用户

ONBUILD

ONBUILD xxx命令
在自己构建是不会执行,生成的镜像被其他dockfile引入时,则执行,一般用于定制继承镜像

LABEL

可以给镜像添加元数据,可以用inspect查看到,可以写自己或公司的名字,联系方式等,给你做的镜像打个label

你可能感兴趣的:(docker镜像及构建)