DockerFile文件详细解析

DockerFile是用于构建Docker镜像的文本文件,包含了一系列构建指令。从应用软件角度看,DockerFile代表软件原材料,镜像是交付品,容器是运行状态。关键指令包括FROM指定基础镜像,RUN执行命令,EXPOSE暴露端口等。通过编写DockerFile,使用dockerbuild构建镜像,然后用dockerrun运行容器实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DockerFile文件详细解析

所有文章不设限,我们相遇偶然,相散坦然,互不打扰,各自安好,向阳而生

致敬尚硅谷周阳老师,此处内容迁移学习来自于阳哥!

DockerFile是什么

DockerFile是用来构建Docker镜像的文本文件,是一条条构建镜像所需要的指令和参数构成的脚本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7xcz1fr-1681201363658)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20230411095427028.png)]

构建三步骤

  1. 编写DockerFile文件
  2. Docker build命令构建镜像
  3. docker run 依据镜像运行容器实例

DockerFile构建过程解析

DockerFile内容基础知识

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上向下,顺序执行
  3. #表示注释
  4. 每个指令都会创建一个新的镜像层并且对于镜像进行提交

Docker执行DockerFile的大致流程

  1. Docker从基础镜像运行一个容器
  2. 执行一条指令并且对于容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. Docker再基于刚提交的镜像运行一个新的容器
  5. 执行DockeFile 中的下一条指令直到所有指令都执行完成

小总结

从应用软件的角度而言,DockerFile,Docker镜像和Docker容器分别代表了软件的三个不同阶段

  • DockerFile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件镜像的运行状态,也是依照镜像运行的容器实例

DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署和运维,三者缺一不可,合理充当Docker体系的基石!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ceyWR9vr-1681201363659)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20230411101339880.png)]

  1. Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
  2. Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;
  3. Docker容器,容器是直接提供服务的。

DockerFile常用保留字指令

FROM指令

基础镜像,当前镜像是基于那个镜像的,指定一个已经存在的镜像作为模版,第一条必须是from

MAINTAINER 指令

镜像维护者的姓名和邮箱地址

RUN 指令

  • 第一种 shell格式

    RUN yum -y install vim

  • 第二种

    exec格式 RUN[“可执行文件”,“参数1”,“参数2”]

RUN实在docker bilid时进行运行

EXPOSE 指令

当前容器对外暴露出的端口

WORKDIR 指令

指定在创建容器后,终端默认进入后的目录

USER 指令

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

ENV 指令

用来构建镜像的过程中设置环境变量

ADD 指令

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

COPY 指令

类似ADD,拷贝文件和目录到镜像中

将从构建上下文目录中的<源路径> 的文件/目录复制到新的一层的镜像内的<目标路径>位置

  • 第一种写法

    COPY src dest

  • 第二种写法

    COPY [“src”,‘dest’]

    <src源路径>:源文件或者源目录

    <dest目标路径>:容器内指定的路径,该路径不用事先建好,路径不存在,会自动创建

VOLUME 指令

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-efh3rcFc-1681201363660)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20230411131159420.png)]

实操案例

自定义镜像mycentosjava8

要求

centos7镜像具备vim+ifconfig+jdk8

jdk下载地址

https://mirrors.yangxingzhen.com/jdk/jdk-8u192-linux-x64.tar.gz

自己可以先下载到宿主机

[root@WangHui WangHui]# wget  https://mirrors.yangxingzhen.com/jdk/jdk-8u192-linux-x64.tar.gz -P  /usr/local/src/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EQHfFKfA-1681201363661)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20230411133141792.png)]

编写

注意啊,镜像加版本号,否则会报错

Dockerfile中 RUN yum -y install vim失败Cannot prepare internal mirrorlist: No URLs in mirrorlist

#拉取基础镜像
FROM centos:7
#设置用户名(非必选)
MAINTAINER wanghui <25459384987@qq.com>
#设置环境变量
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
#将安装包添加到容器中
ADD jdk-8u192-linux-x64.tar.gz   /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_192
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
构建

注意啊,下载jdk的时候没有放到和DockerFile同一路径,这个后期会报错,尽管你的DockerFile配置的是绝对路径也没用用的

所以必须安装包和DockerFile同一路径

[root@WangHui WangHui]# cp /usr/local/src/jdk-8u192-linux-x64.tar.gz ./  
[root@WangHui WangHui]# ls
docker-client         docker-engine  docker-latest-logrotate     test2.tar
docker-client-latest  DockerFile     docker-logrotate
docker-common         docker-latest  jdk-8u192-linux-x64.tar.gz
[root@WangHui WangHui]# docker build -f ./DockerFile -t mycentosjava8:1.0.0 .
[+] Building 24.3s (3/10)                                                                              
 => [internal] load build definition from DockerFile                                              0.1s
 => => transferring dockerfile: 834B                                                              0.1s
 => [internal] load .dockerignore                                                                 0.1s
 => => transferring context: 2B                                                                   0.1s
 => [internal] load metadata for docker.io/library/centos:latest                                 15.2s
 => [1/6] FROM docker.io/library/centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55  9.0s
 => => resolve docker.io/library/centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55  0.0s
 => => sha256:a1d0c75327776413fa0db9ed3adcdbadedc95a662eb1d360dad82bb913f8a1d1 45.09MB / 83.52MB  9.0s
 => => sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 762B / 762B        0.0s
 => => sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc 529B / 529B        0.0s
 => => sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6 2.14kB / 2.14kB    0.0s
 => [internal] load build context                                                                 9.0s
 => => transferring context: 57.94MB 
查看
[root@WangHui WangHui]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
mycentosjava8   1.0.0     af9ec3d7f1c1   2 hours ago     951MB
redis           latest    7614ae9453d1   15 months ago   113MB
[root@WangHui WangHui]#
启动
[root@WangHui WangHui]# docker run -it af9ec3d7f1c1  /bin/bash
[root@1d3ef2bad8fa local]# if 
if         ifconfig   ifenslave  
[root@1d3ef2bad8fa 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 13  bytes 1102 (1.0 KiB)
        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@1d3ef2bad8fa local]# 

虚拟机运行很慢,只能等着,估计两分钟

Dockerfile 是用于构建 Docker 镜像的一种文本文件。它包含了一系列的指令,用于描述构建镜像的步骤和配置。 下面是 Dockerfile 的一些常见指令和解释: 1. FROM:指定基础镜像,用于构建当前镜像。例如,可以使用 `FROM ubuntu:latest` 表示基于最新版本的 Ubuntu 镜像构建。 2. RUN:在镜像中执行命令。可以使用多个 RUN 指令来执行多个命令,每个 RUN 指令都会在前一个指令的基础上创建新的镜像层。 3. COPY:将文件或目录从主机复制到镜像中。可以使用 `COPY <src> <dest>` 来指定源文件/目录和目标路径。 4. ADD:类似于 COPY,但功能更强大。它可以复制远程文件、解压缩文件等。尽量使用 COPY 来避免不必要的复杂性。 5. WORKDIR:设置工作目录,后续的命令都会在该目录下执行。可以使用 `WORKDIR /path/to/directory` 来指定工作目录。 6. ENV:设置环境变量。可以使用 `ENV <key>=<value>` 来设置环境变量的键值对。 7. EXPOSE:声明容器运行时需要监听的端口。例如,可以使用 `EXPOSE 80` 来声明容器将监听 80 端口。 8. CMD:指定容器启动时要执行的命令。可以使用多个 CMD 指令,但只有最后一个生效。如果在运行容器时提供了命令,则 CMD 中的命令会被覆盖。 以上是一些常见的 Dockerfile 指令,还有其他指令如 ENTRYPOINT、LABEL 等,可根据具体需求进行使用。编写一个 Dockerfile 可以根据应用的需求进行定制化配置和设置,最终可以通过 Dockerfile 构建出一个可执行的 Docker 镜像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小辉同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值