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