了解并构建Dockerfile

75 阅读3分钟

查看镜像及其Dockerfile

查看镜像

docker images

image-20230604073752990.png

mac没有tac命令

brew install coreutils

查看镜像的dockerfile

docker history --format {{.CreatedBy}} --no-trunc=true 21978c3803ca|sed "s/\/bin\/sh\ -c\ \#(nop)\ //g"|sed "s/\/bin\/sh\ -c/RUN/g" | tac

image-20230604074213685.png

DockerFile介绍

现在我们简单介绍一下dockerfile:

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。dockerfile 用于指示 docker image build 命令自动构建Image的源代码

# 对该目录下的dockerfile进行镜像的构建
docker build -f Dockerfile

通过dockerfile创建镜像大致上分为三步:写Dockerfile ——>docker build——>docker run

Dockerfile 可以大致分为4个部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

dockerfile也有一些需要注意的地方:

  • dockerfile是通过从上到下的顺序运行指令的。其中第一条指令是 FROM,表示源镜像是基于什么镜像,因此也就有了所有镜像的源镜像:scratch。
  • 每条保留字指令都必须是大写字母, 并且后面要跟随至少一个参数。
  • 每条指令可用 # 添加注释。
  • 每条指令都会创建一个新镜像层, 并对镜像进行提交。

Dockerfile指令解析

指令解析
FROM指定基础镜像,必须为第一个命令
MAINTAINER维护者邮箱等信息
RUN构建镜像docker build时执行的命令
ADD将本地文件添加到容器中,tar 类型文件会自动解压
COPY功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD在docker run时会执行的命令,如果存在多个则仅最后一个生效,例如一个镜像的dockerfile的结尾是“ CMD ["/bin/bash"] ”,那么进入容器可以使用docker exec -it imageName或docker exec -it imageName /bin/bash,后者是在“ CMD ["/bin/bash"] ”的指令下面多加了一个“ CMD ["/bin/bash"] ”,根据CMD的特性,存在多个时,只让最后一个CMD生效,因此不影响
ENTRYPOINT可执行化
LABEL用于为镜像添加元数据
ENV设置环境变量
EXPOSE指定于外界交互的端口
VOLUME用于指定持久化目录
WORKDIR工作目录
ARG用于指定传递给构建运行时的变量
ONBUILD用于设置镜像触发器

1 FROM

# 格式
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
# 例子
FROM mysql:5.6

2 MAINTAINER

# 格式
MAINTAINER <name>
# 例子
MAINTAINER xiehgz@foxmail.com

3 RUN

# 格式
RUN <command>
# 例子
RUN yum install -y mysql

4 ADD

# 格式
ADD <src>... <dest>
# 例子,添加 "name" 到 `WORKDIR`/dir/
ADD name Dir/

5 COPY

# 格式
COPY <src>... <dest>
# 例子
COPY name in /dir

6 CMD

# 格式
CMD ["executable","param1","param2"]
# 例子
CMD ["mysqld"]

7 ENTRYPOINT

# 格式
ENTRYPOINT ["executable", "param1", "param2"]
# 例子:让什么可执行化
ENTRYPOINT ["ls", "/usr/local"]

8 LABEL

# 格式
LABEL <key>=<value> <key>=<value> ...
# 例子
LABEL version="1.0"

9 ENV

# 格式
ENV <key> <value>
ENV <key>=<value> ...
# 例子
ENV name guazi
ENV name=guazi

10 EXPOSE

# 格式
EXPOSE <port> [<port>...]
# 例子
EXPOSE 3306

11 VOLUME

# 格式
VOLUME ["/path"]
# 例子
VOLUME ["/mydata"]

12 WORKDIR

# 格式
WORKDIR /path
# 例子
WORKDIR /mydata

13 ARG

# 格式
ARG <name>[=<default value>]
# 例子,外部传入一参数testparm,默认值为1
ARG testparm=1

14 ONBUILD

# 格式
ONBUILD [INSTRUCTION]
# 例子
ONBUILD ADD . /app/src

制作镜像

以自定义一个centos镜像为例,在官方镜像的基础上添加vim和net-tools工具

  • 首先创建dockerfile:
cat Dockerfile 
FROM centos:7
MAINTAINER xiehgz
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim   net-tools
EXPOSE 80
CMD /bin/bash
  • 构建镜像:
docker build -t mycentos:3.0 . 

image.png

  • 查看镜像:
docker images
REPOSITORY          TAG       IMAGE ID       CREATED              SIZE
mycentos            3.0       b2d59a130341   About a minute ago   453MB
  • 检验是否正常启动:
docker run -it mycentos:3.0
  • 构建成功
docker ps