一文搞懂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来运行我们的镜像了

相关推荐
蜜獾云10 分钟前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
小屁不止是运维11 分钟前
麒麟操作系统服务架构保姆级教程(五)NGINX中间件详解
linux·运维·服务器·nginx·中间件·架构
Hacker_Oldv16 分钟前
WPS 认证机制
运维·服务器·wps
bitcsljl24 分钟前
Linux 命令行快捷键
linux·运维·服务器
ac.char27 分钟前
在 Ubuntu 下使用 Tauri 打包 EXE 应用
linux·运维·ubuntu
Youkiup1 小时前
【linux 常用命令】
linux·运维·服务器
qq_297504611 小时前
【解决】Linux更新系统内核后Nvidia-smi has failed...
linux·运维·服务器
_oP_i1 小时前
.NET Core 项目配置到 Jenkins
运维·jenkins·.netcore
weixin_437398211 小时前
Linux扩展——shell编程
linux·运维·服务器·bash
小燚~1 小时前
ubuntu开机进入initramfs状态
linux·运维·ubuntu