一文搞懂Dockerfile

Dockerfile

Dockerfile是什么?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。我们可以用dockerfile来构建自己的镜像。

Dockerfile文件说明

执行顺序

dockerfile里的指令是从上到下依次执行的

格式

一般指令推荐使用大写字母,内容使用小写字母,#为注释

注意:dockerfile的第一行必须是非注释性的,就是说我们第一行不能写注释,一般第一行是FROM指令,用来指定基础镜像

文件命名

一般我们直接使用Dockerfile来命名我们的Dockerfile文件即可,直接vi Dockerfile来编辑文件

Dockerfile常用指令

FROM

FROM:指定基础镜像,必须为第一个命令

格式:

bash 复制代码
FROM <image>

FROM <image>:<tag>

实例:

bash 复制代码
FROM mysql:5.7

注:tag可以不填,不填默认为最新版(latest版本)

MAINTAINER

MAINTAINER: 维护者信息,用于标注作者及相关信息

格式:MAINTAINER <name> <email>

实例

bash 复制代码
MAINTAINER autor_name autor@163.com

RUN

RUN:执行命令,在构建过程中在镜像中执行命令

RUN执行格式有两种

bash 复制代码
1)shell 格式:RUN< command > ,就像直接在命令行中输入的命令一样。 

实例:RUN yum -y install wget

2)exec 格式:RUN ["可执行文件", "参数 1", "参数 2"]
 
实例:RUN ["/etc/execfile", "arg1", "arg1"]

注意:当我们需要连续执行多个命令时,不用编写多个RUN,应该使用"\"做换行分割,再用"&&"将命令串联起来。因为在Dockerfile中,每写一个RUN就会在基础镜像上增加一层镜像,Docker对镜像的层数有限制

例如:

bash 复制代码
RUN yum -y install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" 

ADD

ADD:将本地文件添加到容器中,tar类型文件会自动解压,可以访问网络资源

格式:ADD <src> <dest>

bash 复制代码
实例:
#添加 "test" 到 `WORKDIR`/conDir/
ADD test conDir/ 

#添加 "test" 到 /conDir/
ADD test /conDir/ 

ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

COPY

COPY :复制文件到镜像中

功能类似ADD,但是是不会自动解压文件,也不能访问网络资源,同样需求下,官方推荐使用 COPY

格式:COPY <src> <dest>

前面是宿主机的路径,后面的是docker镜像中的路径,中间用空格分开,可以复制文件,也可以复制目录,可以是相对路径,也可以是绝对路径,docker路径中尽量使用绝对路劲

注:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

WORKDIR

WORKDIR :指定工作目录

实例:WORKDIR /opt

注:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

CMD

CMD :执行命令

类似于RUN指令,用于运行程序,但二者运行的时间点不同,CMD在docker run时运行,RUN是在 docker build时运行。

格式:

bash 复制代码
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 

注意:CMD命令用于启动容器时,需要执行的命令,多个CMD命令,仅最后一个生效,同时CMD指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

ENTRYPOINT

ENTRYPOINT:容器启动执行命令

ENTRYPOINT 的作用和用法和 CMD 一模一样,但其不会被 docker run 的命令行参数指定的指令所覆盖,CMD 和 ENTRYPOINT 都存在时,CMD 的指令变成了 ENTRYPOINT 的参数, 并且此 CMD 提供的参数会被 docker run 后面的命令覆盖

格式:

bash 复制代码
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

示例:

bash 复制代码
假设已通过 Dockerfile 构建了 nginx:test 镜像:

FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参 

1、不传参运行

$ docker run  nginx:test

容器内会默认运行以下命令,启动主进程。

nginx -c /etc/nginx/nginx.conf

2、传参运行

$ docker run  nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

nginx -c /etc/nginx/new.conf

ENV

ENV:设置环境变量

格式:

bash 复制代码
ENV <key> <value>

ENV <key1>=<value1> <key2>=<value2>...

实例:

bash 复制代码
ENV MYSQL_VERSION 5.7

我们设置了环境变量后,可以后续的指令中可以通过 $key 引用,如上面例子中的值,我们可以直接使用$MYSQL_VERSION引用

USER

USER:指定当前用户

USER用于指定用户,假如我们先用root用户执行了部分命令,下面的命令需要使用其他用户来执行,那么可以使用USER来切换用户

实例:

bash 复制代码
USER root
······
USER myuser

VOLUME

VOLUME : 为容器创建挂载点或声明卷。

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

格式:VOLUME ["<路径1>", "<路径2>"...]

EXPOSE

EXPOSE: 声明暴露端口

格式:EXPOSE <端口1> [<端口2>...]

实例:EXPOSE 8080

注:EXPOSE 只是声明了镜像的端口,方便我们进行配置映射而已。在运行时还是需要 docker run -P 或者 docker run -p进行端口映射,-P为随机映射,-p为指定端口映射

构建镜像

我们编写好dockerfile之后,就需要将其构建成一个镜像,这样我们才可以使用镜像

构建镜像使用的命令为:docker build,docker build 命令从 Dockerfile 和上下文构建镜像

格式:docker build [OPTIONS] PATH | URL |

bash 复制代码
参数:
-f,--file :指定dockerfile路径,如果没有指定,默认读取当前目录下的dockerfile
实例:
docker build -f /path/Dockerfile .

-t,--tag:指定构建的镜像名和tag
实例:
docker build -t my-nginx:v1 . 

注:上面指令的. 是上下文路径,上下文路径是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包,所以上下文路径下不要放无用的文件

构建成功之后,我们就可以使用docker run来运行我们的镜像了

相关推荐
会讲英语的码农21 分钟前
【计算机网络】第一章 概要
运维·服务器·网络协议
小杰66627 分钟前
安装docker版rabbitmq 3.12
docker·容器·rabbitmq
podoor1 小时前
在WordPress中获取10天之内的文章更新数
运维·wordpress
张火火isgudi2 小时前
CentOS搭建KMS服务器
运维·服务器·centos
yueyingshaqiu013 小时前
指定版本ceph-common安装
运维·ceph
fen_fen3 小时前
Shell Expect自动化交互(示例)
运维·ssh
没耳朵的Rabbit3 小时前
RedHat运维-Ansible自动化运维基础7-管理变量与模块结果
linux·运维·自动化·ansible
啊取名真困难3 小时前
Meta自动化脚本机器人:构建高效社交平台工具
运维·机器人·自动化
明明跟你说过3 小时前
【云原生】服务网格(Istio)如何简化微服务通信
运维·微服务·云原生·容器·kubernetes·k8s·istio
玄武 剑4 小时前
开源自动化热键映射工具autohotkey十大用法及精选脚本
运维·自动化