(七)Dockerfile

itmahy
itmahy
发布于 2024-01-18 / 40 阅读
0
0

(七)Dockerfile

Dockerfile介绍

Dockerfile是用于构建Docker镜像的文本文件,它包含了一系列的指令和参数,用于指导Docker引擎在基础镜像上进行一系列的操作,从而构建出一个新的镜像。

Dockerfile的优势在于它可以通过简单的文本文件来描述镜像的构建过程,使得镜像的构建过程可重复、可自动化,并且可以与版本控制系统集成,方便团队协作。

Dockerfile命令解释

下面是一些常用的Dockerfile命令的解释:

  1. FROM:指定基础镜像,用于构建新镜像。例如:FROM ubuntu:latest表示基于最新的Ubuntu镜像构建新镜像。

  2. RUN:在镜像中执行命令。例如:RUN apt-get update && apt-get install -y curl表示在镜像中执行apt-get命令更新软件包,并安装curl工具。

  3. COPY:将文件或目录从构建环境复制到镜像中。例如:COPY app.py /app/表示将当前目录下的app.py文件复制到镜像的/app/目录下。

  4. ADD:类似于COPY命令,但更强大,可以自动解压缩文件和远程文件下载。例如:ADD https://example.com/file.tar.gz /tmp/表示从远程URL下载文件并解压缩到镜像的/tmp/目录下。

  5. WORKDIR:设置工作目录,后续命令将在该目录下执行。例如:WORKDIR /app表示将/app/目录设置为工作目录。

  6. EXPOSE:声明容器运行时监听的端口。例如:EXPOSE 8080表示容器将监听8080端口。

  7. CMD:指定容器启动时要执行的命令。例如:CMD ["python", "app.py"]表示容器启动时执行python app.py命令。

  8. MAINTAINER:镜像维护者的姓名和邮箱地址

  9. USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是 root

  10. ENV:用来在构建镜像过程中设置环境变量 ENV MY_PATH /usr/mytest

  11. ENTRYPOINT:也是用来指定一个容器启动时要运行的命令,类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成<ENTRYPOINT> "CMD"

  12. VOLUME:容器数据卷,用于数据保存和持久化工作

生成镜像

构建步骤

  • 编写Dockerfile文件

  • docker build命令构建镜像

  • docker run依镜像运行容器实例《

规范

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数

  • 指令按照从上到下,顺序执行

  • #表示注释

  • 每条指令都会创建一个新的镜像层并对镜像进行提交

流程

  • docker从基础镜像运行一个容器

  • 执行一条指令并对容器作出修改

  • 执行类似docker commit的操作提交一个新的镜像层

  • docker再基于刚提交的镜像运行一个新容器

  • 执行 dockerfile 中的下一条指令直到所有指令都执行完成

案例

  • 要求:Centos7镜像具备 vim + ifconfig + jdk8

  • 准备:下载好 jdk8 并跟 Dockerfile 文件放在一个目录中

  • 编写Dockerfile文件

FROM centos:7
MAINTAINER itmahy<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u381-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u381-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_381 #注意 这个要个jdk-8u381-linux-x64.tar.g解压目录一样
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
  • 在 DockerFile文件所在目录中执行docker build -t itmahy-centos:1.0 . 生成镜像。注意:不要忽略最后的 .

  • 执行docker run -it itmahy-centos:1.1 /bin/bash

  • 在容器中验证软件是否安装成功

[root@7b3a38e3e211 local]# java -version
java version "1.8.0_381"
Java(TM) SE Runtime Environment (build 1.8.0_381-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.381-b09, mixed mode)
[root@7b3a38e3e211 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@7b3a38e3e211 local]# vim test
[root@7b3a38e3e211 local]#

虚悬镜像

仓库名、标签都是的镜像,俗称 dangling image

  • 使用 Dockerfile 写一个

from ubuntu
CMD echo 'action is success'
  • 执行

docker build .
  • 查看虚悬镜像:

docker image ls -f dangling=true
  • 删除虚悬镜像:

docker image prune


评论