Docker学习(五)——Dockerfile指令介绍与构建镜像
1. 什么是dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,其中每一行构建指令,都用于构建image中的每一层。通过自定义的dockerfile,可以制作属于个人的镜像。
Ps: dockerfile文件无后缀,一般直接命名为dockerfile
2. dockerfile指令
网上一幅很好的dockerfile常用指令介绍图
dockerfile文件的指令全部为大写字母
FROM Image:tag
指定基础镜像,用java语言来说就是指定继承的父类
…
MAINTAINE 名称<信息>
中文译为:维护者。即描述镜像构建者的信息,用于未来dockerhub中的索引
…
RUN 命令
RUN [“命令”, “参数1”, “参数2” … ]
运行镜像时需要执行的命令,等同命令行中的docker run
…
ADD 源文件/目录 目标文件/目录
配置环境的时候,在基础镜像上添加其他服务【可自动执行解压】
…
COPY 源文件/目录 目标文件/目录
将指定包拷贝到容器中【无法自动执行解压】
…
WORKDIR 路径
镜像run成容器后的工作目录,容器内工作目录,等同于命令行中的/bin/bash指令
…
VOLUME [“目录”]
挂载容器卷的目录,【匿名挂载的形式】
…
EXPOSE 端口号
暴露端口,等同命令行中的 -p
…
CMD 命令 参数1 参数2 …
CMD [“命令”,”参数1”,”参数2”…]
容器运行后需要执行的指令【若有多个命令,只有最后一个命令生效】
例:docker run dockerfile构建的镜像ID -l
无论dockerfile中CMD写了什么命令,都会被上面的命令-l代替(最后一个添加的命令)
…
ENTRYPOINT 命令 参数1 参数2 …
ENTRYPOINT [“命令”,”参数1”,”参数2”…]
指定容器运行后需要执行的指令【若有多个命令,命令会相继执行】
例:docker run dockerfile构建的镜像ID -l
执行完dockerfile中写的命令后,在追加执行-l命令,而不是被替代
…
ENV 环境变量 变量值
设置环境变量,例如启动JDK环境时,指定环境变量
…
ONBUILD 命令
指定本镜像作为基础镜像时执行的命令
…
3. Dockerfile构建实战
3.1 编写Dockerfile文件
#dockerfile文件
FROM python
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN pip install numpy
EXPOSE 80
CMD echo "------success------OK------"
3.2 构建Image
使用docker build命名进行构建,主要使用 -f dockerfile文件名 -t 构造镜像的名称:tag 参数
#查看docker build 帮助文档
root@iZ:~$ sudo docker build --help
Usage: docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
Options:
...
-f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile')
--force-rm Always remove intermediate containers
--iidfile string Write the image ID to the file
--isolation string Container isolation technology
--label list Set metadata for an image
...
-t, --tag list Name and optionally a tag in the 'name:tag' format
--target string Set the target build stage to build.
--ulimit ulimit Ulimit options (default [])
#构建镜像
root@iZ:~$ sudo docker build -f ./dockerfile -t test:1.0 .
Sending build context to Docker daemon 104.8MB
Step 1/6 : FROM python
latest: Pulling from library/python
...
Status: Downloaded newer image for python:latest
---> da24d18bf4bf
Step 2/6 : ENV MYPATH /usr/local
---> Running in a3b7e7b35293
Removing intermediate container a3b7e7b35293
---> d9f96c5d8169
Step 3/6 : WORKDIR $MYPATH
---> Running in 2dff8950ee1f
Removing intermediate container 2dff8950ee1f
---> ab188c8a8aba
Step 4/6 : RUN pip install numpy
---> Running in 51f05310cf1a
...
---> d00c4a475ef4
Step 5/6 : EXPOSE 80
---> Running in 94d95590af3d
Removing intermediate container 94d95590af3d
---> 99105785a25c
Step 6/6 : CMD echo "------success------OK------"
---> Running in 845685b17cc7
Removing intermediate container 845685b17cc7
---> 3121e43b7e2f
Successfully built 3121e43b7e2f
Successfully tagged test:1.0
注意:构造镜像是的命令,最后需要加 . ,否则会报错
docker build -f ./dockerfile -t test:1.0 .
**原因:**镜像的构建是在Docker引擎(Docker守护进程)中完成的。 在执行docker build命令后,本机会将Dockerfile文件所在路径下的所有文件打包上传给Docker引擎,由Docker引擎完成镜像的构建。. 号是指镜像构建时打包上传到 Docker引擎中的文件的目录,不是本机目录
3.3 查看并运行构建的镜像
#查看构建的镜像
root@iZ:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 1.0 3121e43b7e2f 4 minutes ago 966MB
#启动构造的镜像,发现进入了设定的WORKDIR工作目录
root@iZ:~$ sudo docker run -it --name du test:1.0 /bin/bash
root@f62d0a8fab09:/usr/local$ python -V
Python 3.9.1 #成功构建了python环境镜像
root@f62d0a8fab09:/usr/local$ python
Python 3.9.1 (default, Jan 12 2021, 16:45:25)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.__version__ #numpy被成功安装至python环境中
'1.20.0'
3.4 查看镜像构造过程docker history
root@iZ:~$ sudo docker history 3121e43b7e2f
IMAGE CREATED CREATED BY SIZE COMMENT
3121e43b7e2f 17 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
99105785a25c 17 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
d00c4a475ef4 17 minutes ago /bin/sh -c pip install numpy 81.2MB
ab188c8a8aba 18 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
d9f96c5d8169 18 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
da24d18bf4bf 2 weeks ago /bin/sh -c #(nop) CMD ["python3"] 0B
<missing> 2 weeks ago /bin/sh -c set -ex; wget -O get-pip.py "$P… 7.31MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PYTHON_GET_PIP_SHA256… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PYTHON_GET_PIP_URL=ht… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PYTHON_PIP_VERSION=20… 0B
<missing> 2 weeks ago /bin/sh -c cd /usr/local/bin && ln -s idle3… 32B
<missing> 2 weeks ago /bin/sh -c set -ex && wget -O python.tar.x… 55.7MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PYTHON_VERSION=3.9.1 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV GPG_KEY=E3FF2839C048B… 0B
<missing> 2 weeks ago /bin/sh -c apt-get update && apt-get install… 18MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PATH=/usr/local/bin:/… 0B
<missing> 3 weeks ago /bin/sh -c set -ex; apt-get update; apt-ge… 510MB
<missing> 3 weeks ago /bin/sh -c apt-get update && apt-get install… 146MB
<missing> 3 weeks ago /bin/sh -c set -ex; if ! command -v gpg > /… 17.5MB
<missing> 3 weeks ago /bin/sh -c set -eux; apt-get update; apt-g… 16.5MB
<missing> 3 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:53e587afdbeaee60c… 114MB
missing的layer为本机已经存在的镜像层,无需重新下载。这正是docker的分层构建原理,节省了资源,加快了速度。