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的分层构建原理,节省了资源,加快了速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值