- DockerFile 介绍
- DockerFile 构建过程
- DockerFile的指令
- FROM: 指定基础镜像,Dockerfile第一个命令
- MAINTAINER:维护者/创作者
- RUN: 构建镜像时执行的命令
- build 构建镜像命令
- ADD
- CMD
- ENTRYPOINT
- EXPOSE
DockerFile 构建过程 DockerFile的指令 FROM: 指定基础镜像,Dockerfile第一个命令Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
FROM:定制的镜像都是基于FROM的镜像。比如下图的php就是定制需要的基础镜像,后续操作都是基于php。
FROM php 格式: FROMFROM : FROM @
MAINTAINER:维护者/创作者ps: tag或digest是可选的,tag不选默认为latest 最新版本
RUN: 构建镜像时执行的命令格式:
MAINTAINER <名字>
RUN: 用于执行后面跟着的命令行命令。有两种格式:
shell 格式命令:
RUN ./test.php dev offline
其实就是在终端操作shell命令;
RUN command
拓展默认说明:
linux:/bin/sh -c
windows: cmd /s /c
exec格式:
RUN ["./test.php",“dev”,“offline”] // 等价于 RUN ./test.php dev offline
RUN [“可执行文件”, “参数1”, “参数2”]
说明:可将 ./test.php理解为可执行的文件,后面就是两个参数
注意:
多行命令不要写多个RUN,因为Dockerfile中每一个指令都会建一层。多少个RUN就构建多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了部署的时间,还容易出错。例如下面
root@VM-8-11-ubuntu:/home/docker# cat Dockerfile FROM php:7.4 RUN apt-get update RUN pecl install redis-5.1.1 RUN pecl install xdebug-2.8.1 RUN docker-php-ext-enable redis xdebug
root@VM-8-11-ubuntu:/home/docker# docker build -t myphp/php . Sending build context to Docker daemon 2.048kB Step 1/5 : FROM php:7.4
以上执行会创建额外4个镜像,可以简化为以下的格式
root@VM-8-11-ubuntu:/home/docker# cat Dockerfile
FROM php:7.4
RUN apt-get update
&& pecl install redis-5.1.1
&& pecl install xdebug-2.8.1
&& docker-php-ext-enable redis xdebug
如上,以&&符号连接命令,这样执行后,只会创建一层镜像。我们在查看执行步骤时可以看到
root@VM-8-11-ubuntu:/home/docker# docker build -t myphp/php . Sending build context to Docker daemon 2.048kB Step 1/2 : FROM php:7.4build 构建镜像命令
在Dockerfile文件的存放目录下,执行构建动作:
注: 最后的点如果后面没有接路径,则表示的是当前目录下的Dockerfile文件
$ docker build -t myphp/php:v1 . // v1 代表版本号 Successfully built cc4f99ce42bb Successfully tagged myphp/php:v1 // 输出上面这个表示成功了。ADD
将本地文件添加到容器中,tar类型文件会自动解压,可以访问网络资源,类似wget
格式:
格式:
ADD ...
ADD ["",... ""] 用于支持包含空格的路径
示例:
ADD home/index.php /home/www # index.php 到 /home/www下
ADD *.php /home/www # ? 替代一个单字符,例如:"*.txt"
ADD index.php relativeDir/ # 添加 "index.php" 到 `WORKDIR`/relativeDir/ 工作目录下
CMD
类似于RUN指令,用于运行程序,但两者执行的时间时不一样的。
- CMD在docker run时运行。
- RUN是在docker build的时候
作用:为启动的容器指定默认要运行的程序,程序运行结束、容器也就结束。CMD指令指定的程序可被docker run 命令行参数中指定要运行的程序所覆盖。
命令: CMDCMD ["<可执行文件或命令>", " ", " ", ....] CMD ["param1", "param2"....] (设置ENTRYPOINT, 则直接调用 ENTRYPOINT 添加参数)
注意:如果Dockerfile中如果存在多个CMD指令,则只会执行最后一条
示例:
$ root@VM-8-11-ubuntu:/home/docker# cat Dockerfile FROM php:7.4 CMD echo "第一次执行" CMD echo "最后一次执行" $ root@VM-8-11-ubuntu:/home/docker# docker build -t myphp:1.0 . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM php:7.4 ---> 8e8e75f388d4 Step 2/3 : CMD echo "第一次执行" ---> Using cache ---> 4727dd60bf0c Step 3/3 : CMD echo "最后一次执行" ---> Using cache ---> b55ba7f4d933 Successfully built b55ba7f4d933 Successfully tagged myphp:1.0 $ root@VM-8-11-ubuntu:/home/docker# docker run --name=myphp -it myphp:1.0 最后一次执行
$ root@VM-8-11-ubuntu:/home/docker# cat Dockerfile FROM php:7.4 CMD ["echo","第一次执行"] CMD ["echo","最后一次执行"] $ root@VM-8-11-ubuntu:/home/docker# docker build -t myphp:2.0 . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM php:7.4 ---> 8e8e75f388d4 Step 2/3 : CMD ["echo","第一次执行"] ---> Running in 173bbc940403 Removing intermediate container 173bbc940403 ---> 5556eaa927e3 Step 3/3 : CMD ["echo","最后一次执行"] ---> Running in 5d66c4834695 Removing intermediate container 5d66c4834695 ---> 656a4f71be6f Successfully built 656a4f71be6f Successfully tagged myphp:2.0 $ root@VM-8-11-ubuntu:/home/docker# docker run --name=myphp02 -it myphp:2.0 最后一次执行
我们可以看到确实是在run的时候只执行了最后一个指令。
ENTRYPOINT配置容器,使其可执行化,配合CMD可省去"application", 只使用参数。
Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件,优先) ENTRYPOINT command param1 param2 (shell 内部命令)
示例1 :
$ root@VM-8-11-ubuntu:/home/docker# docker build -t myphp:3.0 . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM php:7.4 ---> 8e8e75f388d4 Step 2/3 : ENTRYPOINT ["echo","第一次执行"] ---> Using cache ---> 1ffc7cfb6a59 Step 3/3 : ENTRYPOINT ["echo","最后一次执行"] ---> Using cache ---> e97046aeeadd Successfully built e97046aeeadd Successfully tagged myphp:3.0 root@VM-8-11-ubuntu:/home/docker# docker run --name=myphp03 -it myphp:3.0 最后一次运行
示例2:
$root@VM-8-11-ubuntu:/home/docker# cat Dockerfile FROM php:7.4 CMD ["date"] ENTRYPOINT ["php", "--ri"] $root@VM-8-11-ubuntu:/home/docker# docker build -t myphp:4.0 . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM php:7.4 ---> 8e8e75f388d4 Step 2/3 : CMD ["date"] ---> Running in a66b00863980 Removing intermediate container a66b00863980 ---> 5ca0aa147a5a Step 3/3 : ENTRYPOINT ["php", "--ri"] ---> Running in 2d3a82340ca9 Removing intermediate container 2d3a82340ca9 ---> cad0090fc58e Successfully built cad0090fc58e Successfully tagged myphp:4.0 $root@VM-8-11-ubuntu:/home/docker# docker run --name=myphp4 -it myphp:4.0 date date/time support => enabled timelib version => 2018.04 "Olson" Timezone Database Version => 2021.3 Timezone Database => internal Default timezone => UTC Directive => Local Value => Master Value date.timezone => no value => no value date.default_latitude => 31.7667 => 31.7667 date.default_longitude => 35.2333 => 35.2333 date.sunset_zenith => 90.583333 => 90.583333 date.sunrise_zenith => 90.583333 => 90.583333
示例三:
$ root@VM-8-11-ubuntu:/home/docker# docker run --name=myphp05 -it myphp:4.0 PDO PDO PDO support => enabled PDO drivers => sqlite
从上面三个示例中我们发现:
EXPOSE
- 示例1:Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
- 示例2: 如果我们在Dockerfile中发现同时存在 ENTRYPOINT和CMD指令,并且CMD是完整的指令,那么它们两个会相互覆盖,谁在最后谁执行。
- 示例3 docker run 执行的命令不会覆盖ENTRYPOINT,而docker run 命令中的然和参数,都会被当作参数再次传递给ENTRYPOINT。
格式:
EXPOSE[ ...]
告诉Docker 服务器容器暴露的端口,供互联网系统使用,再启动run容器时需要通过-p指定,Docker主机会自动分配一个端口转发到指定的端口。
常用的命令已经列出来给大家了,并且增加了示例,如需要查看更多详细的命令可以查看文档链接: docker命令



