热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DockerDockerFile保留字指令与简单的实例使用(上)

什么是DockerFile:用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。构建Dockerfile的三个步骤:编写

什么是DockerFile:
用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建Dockerfile的三个步骤:

  • 编写Dockerfile文件
  • docker build
  • docker run

dockerfile构建过程解析:

dockerfile内容基础知识:

  1. 每条保留字指令都必须是大写字母,且后至少跟一个参数
  2. 指令按照从上到下逐条执行
  3. #注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交
    在这里插入图片描述

docker执行dockerfile的大致流程:

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 提交生成一个新的镜像层
  4. 基于新生成的镜像运行一个容器
  5. 执行dockerfile中的下一条指令,指导所有的指令都执行完成

dockerfile体系结构(保留字指令):

  1. FROM:基础镜像,即当前镜像是基于哪个镜像的(类似于继承,当前类的父类是谁)。
  2. MAINTAINER:镜像维护者的姓名和邮箱地址。
  3. RUN:容器构建时要运行的命令。
  4. EXPOSE:当前容器对外暴露出的端口号。
  5. WORKDIR:指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点。
  6. ENV:用来在构建镜像过程中设置环境变量。见 ①
  7. ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包。
  8. COPY:类似于ADD,拷贝文件和目录到镜像。
    将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置&#xff1b;
    两种写法&#xff1a;
    1、copy xxx yyy
    2、COPY[&#39;xxx&#39;&#xff0c;&#39;yyy&#39;]
  9. VOLUME&#xff1a;容器数据卷&#xff0c;用于数据保存和持久化工作
  10. CMD&#xff1a;指定一个容器启动时要运行的命令&#xff0c;见 ②
    dockerfile文件中可以存在多个CMD命令&#xff0c;但只有最后一个生效&#xff0c;CMD后被docker run之后的参数替换。
  11. ENTRYPOINT&#xff1a;指定一个容器启动时要运行的命令。
    ENTRYPOINT和CMD的目的一样&#xff0c;都是在指定容器启动程序及参数&#xff08;不会被覆盖&#xff09;。
  12. ONBUILD&#xff1a;当构建一个被继承的dockerfile时运行命令&#xff0c;父镜像在被子镜像继承后&#xff0c;父镜像的onbuild被触发。

① ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用&#xff0c;这就如同在命令前指定了环境变量前缀一样。

也可以在其他指令中直接使用这些环境变量。
如&#xff1a;WORKDIR $MY_PATH
② CMD 容器启动命令
CMD指令的格式和 RUN 相似&#xff0c;也是两种格式&#xff1a;
1、shell格式&#xff1a;CMD <命令>
2、exec格式&#xff1a;CMD[“可执行文件”&#xff0c;“参数1”&#xff0c;“参数2”&#xff0c;…]
3、参数列表格式&#xff1a; CMD[“参数1”&#xff0c;“参数2”&#xff0c;…]&#xff0c;在指定了ENTRYPOINT指令后&#xff0c;用CMD指令的具体参数。

在这里插入图片描述

在这里插入图片描述


保留字指令的案例&#xff1a;
base镜像&#xff08;scratch&#xff09;&#xff1a;Docker Hub中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建处理的。在这里插入图片描述
自定义镜像没有一些命令&#xff08;centos为例&#xff09;
在这里插入图片描述

  1. 停止当前镜像的运行&#xff0c;编写dockerfile文件&#xff08;之前创建过mydocker目录&#xff0c;就直接在里边创建文件了&#xff09;

# 基础镜像&#xff0c;基于centos
FROM centos# 设置维护者的姓名、邮箱地址
MAINTAINER leyton# 配置环境变量
ENV MY_PATH /usr/local# 设置默认的工作目录
WORKDIR $MY_PATH# 执行两条安装语句来安装vim、net-tools
RUN yum -y install vim
RUN yum -y install net-tools# 暴露端口
EXPOSE 80# 容器启动时运行的命令
CMD echo $MY_PATH
CMD echo "success............ok"
CMD /bin/bash

在这里插入图片描述
2. 构建新的镜像&#xff08;build&#xff09;

命令&#xff1a;docker build -f /mydocker/DockerFile2 -t 新镜像名称:TAG .
docker build -f /mydocker/DockerFile2 -t mycentos:1.3 .
别忘了最后的点&#xff08;点表示当前目录&#xff09;

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 运行mycentos:1.3镜像&#xff0c;看一下工作目录是否是设置的环境变量/usr/local&#xff0c;是否可以使用vim以及ifconfig命令
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 列出镜像的变更历史

docker history 镜像ID

在这里插入图片描述

案例&#xff08;续&#xff09;&#xff1a;
此案例主要针对CMD、ENTRYPOINT
两个都是在容器启动时要运行的命令

CMD &#xff1a;docker run 之后会覆盖前边的CMD命令&#xff0c;只有最后一个生效
如运行tomcat
docker run -it tomcat
运行tomcat 改变最后的语句
docker run -it tomcat ls -l
上面一句话相当于Dockerfile中在最后添加CMD ls -l&#xff0c;覆盖上边的CMD /bin/bash
在这里插入图片描述
ENTRYPOINT&#xff1a;docker run之后的参数会被当做参数传递给ENTRYPOINT&#xff0c;之后形成新的命令组合

编写dockerfile文件&#xff1a;
FROM centos
RUN yum -y install curl
CMD [‘curl’, ‘-s’, ‘http://ip.cn’]

什么是curl&#xff1a;
在这里插入图片描述
build

docker build -f /mydocker/DockerFile3 -t myip .
别忘了最后的点
在这里插入图片描述
运行一下&#xff1a;
在这里插入图片描述
如果现实数据头headers
curl -s -i http://ip.cn
在这里插入图片描述
但是写好的dockerfile能不能这样运行呢&#xff1f;显然不能
在这里插入图片描述
dockerfile里是CMD [‘curl’, ‘-s’, ‘http://ip.cn’]&#xff0c;而运行的那句话相当于CMD -i
把上一句给覆盖掉了&#xff0c;显然是不行的。
此时可以考虑用ENTRYPOINT
编写dockerfile文件&#xff1a;
FROM centos
RUN yum -y install curl
ENTRYPOINT [‘curl’, ‘-s’, ‘http://ip.cn’]
在这里插入图片描述
此时运行命令加上 -i 的参数相当于 [‘curl’, ‘-s’, ‘-i’, ‘http://ip.cn’]&#xff0c;不会把之前的覆盖掉

案例&#xff08;续&#xff09;&#xff1a;ONBUILD
编写Dockerfile4文件&#xff08;作为父镜像的文件&#xff09;

FROM centos
RUN yum -y install curl
ENTRYPOINT [“curl”, “-s”, “https://ip.cn”]
ONBUILD RUN echo ‘father image onbuild…’

生成镜像myip_father

docker build -f /mydocker/Dockerfile4 -t myip_father .
别忘了最后的点

编写Dockerfile5文件&#xff08;作为子镜像的文件&#xff0c;继承Dockerfile4&#xff09;

FROM myip_father
RUN yum -y install curl
ENTRYPOINT [“curl”, “-s”, “https://ip.cn”]

生成镜像myip_son

docker build -f /mydocker/Dockerfile5 -t myip_father .
别忘了最后的点
此时父镜像会执行ONBUILD

生成myip_father镜像的图&#xff1a;
在这里插入图片描述

生成myip_son镜像的图&#xff1a;
在这里插入图片描述


推荐阅读
author-avatar
洪爷不是我
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有