DockerFile

  • DockerFile 介绍
  • DockerFile 构建过程
  • DockerFile的指令
    • FROM: 指定基础镜像,Dockerfile第一个命令
    • MAINTAINER:维护者/创作者
    • RUN: 构建镜像时执行的命令
    • build 构建镜像命令
    • ADD
    • CMD
    • ENTRYPOINT
    • EXPOSE

DockerFile 介绍

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

DockerFile 构建过程

DockerFile的指令

FROM: 指定基础镜像,Dockerfile第一个命令

FROM:定制的镜像都是基于FROM的镜像。比如下图的php就是定制需要的基础镜像,后续操作都是基于php。
FROM php格式:FROM <image>FROM <image>:<tag>FROM <image>@<digest>

ps: tag或digest是可选的,tag不选默认为latest 最新版本

MAINTAINER:维护者/创作者

格式:
MAINTAINER <名字>

RUN: 构建镜像时执行的命令

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.4RUN apt-get updateRUN pecl install redis-5.1.1RUN pecl install xdebug-2.8.1RUN 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.4RUN 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.4

build 构建镜像命令

在Dockerfile文件的存放目录下,执行构建动作:
注: 最后的点如果后面没有接路径,则表示的是当前目录下的Dockerfile文件

$ docker build -t myphp/php:v1 .   // v1 代表版本号Successfully built cc4f99ce42bb
Successfully tagged myphp/php:v1
// 输出上面这个表示成功了。

ADD

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

格式:ADD <src>... <dest>ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例: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 命令行参数中指定要运行的程序所覆盖。

命令:
CMD <shell 命令>
CMD ["<可执行文件或命令>", "<param1>", "<params2>", ....]
CMD ["param1", "param2"....] (设置ENTRYPOINT, 则直接调用 ENTRYPOINT 添加参数)

注意:如果Dockerfile中如果存在多个CMD指令,则只会执行最后一条
示例:

$ root@VM-8-11-ubuntu:/home/docker# cat Dockerfile
FROM php:7.4CMD 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.4CMD ["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.0root@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.4CMD ["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.0datedate/time support => enabled
timelib version => 2018.04
"Olson" Timezone Database Version => 2021.3
Timezone Database => internal
Default timezone => UTCDirective => 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 PDOPDOPDO support => enabled
PDO drivers => sqlite

从上面三个示例中我们发现:

  • 示例1Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令
  • 示例2: 如果我们在Dockerfile中发现同时存在 ENTRYPOINT和CMD指令,并且CMD是完整的指令,那么它们两个会相互覆盖,谁在最后谁执行。
  • 示例3 docker run 执行的命令不会覆盖ENTRYPOINT,而docker run 命令中的然和参数,都会被当作参数再次传递给ENTRYPOINT

EXPOSE

格式:

EXPOSE <port> [<port>...]

告诉Docker 服务器容器暴露的端口,供互联网系统使用,再启动run容器时需要通过-p指定,Docker主机会自动分配一个端口转发到指定的端口。

常用的命令已经列出来给大家了,并且增加了示例,如需要查看更多详细的命令可以查看文档链接: docker命令

docker第五期 DockerFile讲解相关推荐

  1. Docker应用五:使用Dockerfile部署MongoDB

    在Docker容器中部署MongoDB 不做铺垫,直接开撸: 一.软件准备: docker(已安装) MongoDB-3.2.0.tgz 二.准备配置文件mongo.conf port=27017 d ...

  2. Docker之DockerFile讲解

    概述 DockerFile是用于构建Docker镜像的文件,是一个命令参数脚本文件. 通过DockerFile构建Docker镜像的步骤: 编写一个DockerFile文件. 通过docker bui ...

  3. 第五期送书来了,这次送的都是畅销书!

    点击上方"程序IT圈",选择"置顶公众号" 每天早晨8点50分,准点开车打卡 公众号第四期打卡采用订阅号助手排行榜功能,参照下图所示的三个指标:精选留言最多.分 ...

  4. 第五期直播《聊聊目标检测和秋招那些事》精彩回顾

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微 ...

  5. python训练营免费领取-21天训练营丨Python量化投资打卡第五期!学完押金全返!...

    原标题:21天训练营丨Python量化投资打卡第五期!学完押金全返! 关注我们,后台 毕业以后,你想找一份什么工作? 钱 多 的 也许你有点儿不好意思承认 但是确确实实地感觉到: 我很羡慕互联网行业和 ...

  6. 横跨2017-2018,云效Work Like Alibaba系列直播第五期盛大开启

    摘要: 横跨2017-2018年直播,晚上20:00在云栖社区直播间和阿里巴巴技术专家一起,探讨像阿里巴巴一样高效跨企业项目协作,像阿里巴巴一样保障软件研发质量. 阿里巴巴内部是如何高效协同工作的?有 ...

  7. Docker学习五:Docker 数据管理

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  8. 智慧创造财富,第十五期【新营销·创富大会】圆满落幕!

    有的人通过不正当的手段盗取财富,有的人用体力换取财富,有的人天生衣食无忧自带财富,还有的人通过智慧与思想吸取财富. 第一种人,揣着一大笔钱,整天战战兢兢,扳着手指头算日子: 第二种人,安于生活,却一辈 ...

  9. DD每周前端七题详解-第五期

    DD每周前端七题详解-第五期 系列介绍 你盼世界,我盼望你无bug.Hello 大家好!我是霖呆呆! 呆呆每周都会分享七道前端题给大家,系列名称就是「DD每周七题」. 系列的形式主要是:3道JavaS ...

最新文章

  1. 智能应答系统php源码,佳蓝智能应答系统 php版下载|佳蓝智能应答系统 php版官方下载-太平洋下载中心...
  2. 一文看完吴恩达最新演讲精髓,人工智能部署的三大挑战及解决方案
  3. 阿里云中间件技术 促进互联网高速发展
  4. 负样本的艺术,再读Facebook双塔向量召回算法
  5. 使用BIND安装智能DNS服务器(一)---基本的主从DNS服务器搭建
  6. vue 调用webservice_js跨域调用WebService的简单实例
  7. python和别的脚本语言_PHP与Python与其它脚本语言
  8. 20145302张薇 《信息安全系统设计基础》第14周学习总结
  9. ubuntu,win10 释放IP,重新获取IP
  10. 一套解决方案,多个项目
  11. 程序员的一种境界【转的】
  12. 【图像增强】基于matlab频域+密度分割+灰度级-彩色变换伪彩色图像增强【含Matlab源码 1011期】
  13. 计算机多媒体应用的技术手段,计算机多媒体技术的关键性技术
  14. html input 密文,HTML input text框显示为密文
  15. 3G网络通信技术与4G网络通信技术的区别
  16. IDEA使用Maven构建Spring+SpringMVC+MyBatis整合项目demo成功执行但控制台Tomcat Locahost log输出No Spring WebApplicationIn
  17. 【面试】Tomcat面试题
  18. maven plugins飘红
  19. LINUX TC介绍
  20. HarmonyOS - 华为智慧屏网络卡顿、跳帧解决方案

热门文章

  1. 计算机的两大设计思想
  2. Android Tv app 与 mobile app 界面呈现的区别
  3. 【Python基础学习笔记day05】pycharm注释的作用+单行注释(行注释)+多行注释(块注释)+关于代码规范
  4. QQ更新增加微信大火的功能,还加了好多新花样
  5. 最全的中文分词停用词表
  6. 自然语言处理--NLTK 停用词表
  7. selinux 简介
  8. 79 单词搜索(dfs)
  9. C语言——杨辉三角的实现并输出(递归)
  10. 【云快讯】之五十六《谷歌GCE为企业用户提供私有密钥加密服务》