`
goalietang
  • 浏览: 25348 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于Docker的学习资料 - 03 - Dockerfile 文件内容介绍

阅读更多
1. Dockerfile 文件内容
   基本上,一个Dockerfile包含以下的内容:
引用
# version 0.0.1-snapshot
# 从一个基础镜像centos:6.8开始构建
FROM centos:6.8
# 维护者信息
MAINTAINER hylexus "hylexus@163.com"
# 将Dockerfile上下文中的nginx.repo复制到容器中的yum源位置
COPY ./nginx.repo /etc/yum.repos.d/nginx.repo
RUN yum makecache
# 安装nginx
RUN yum install -y nginx
# 修改nginx首页信息
RUN echo "home page of container niginx server" > /usr/share/nginx/html/index.html
# 暴露80端口
EXPOSE 80


2. Dockerfile  基本指令介绍
2.1. FROM
        用法:FROM <image>
说明:第一个指令必须是FROM了,其指定一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,没有指定镜像的标签会使用默认的latest标签,可以出现多次,如果需要在一个Dockerfile中构建多个镜像。
例如:FROM centos:6.8
2.2. MAINTAINER
    用法:MAINTAINER <name> <email>
说明:描述镜像的创建者,名称和邮箱
例如:
引用
MAINTAINER hylexus "hylexus@163.com"

2.3. RUN
    用法:RUN "command" "param1" "param2"
说明:RUN命令是一个常用的命令,执行完成之后会成为一个新的镜像,这里也是指镜像的分层构建。一句RUN就是一层,也相当于一个版本。这就是之前说的缓存的原理。我们知道docker是镜像层是只读的,所以你如果第一句安装了软件,用完在后面一句删除是不可能的。所以这种情况要在一句RUN命令中完成,可以通过&符号连接多个RUN语句。RUN后面的必须是双引号不能是单引号(没引号貌似也不要紧),command是不会调用shell的,所以也不会继承相应变量,要查看输入RUN "sh" "-c" "echo" "$HOME",而不是RUN "echo" "$HOME"。一个dockerfile可以有多个RUN,但是要记住每行的RUN都表示在一个新的镜像上面执行。
例如:如果要在同一个镜像上执行多段命令,需要用&&连接命令,如:
引用
RUN /bin/sh -c 'cd /usr/share/nginx/html/ && npm install'

这段RUN由两段命令组成,第一段是cd到一个指定文件夹下,第二段是在该文件夹下安装npm工具。但是如果写成了下面这样:
引用
RUN cd /usr/share/ngnix/html
RUN npm install

表示先在一个镜像上cd到一个指定文件夹,然后又到新的镜像上的根目录安装了npm
2.4. CMD
用法:CMD command param1 param2
说明:CMD在Dockerfile中只能出现一次,如果有多个,只有最后一个会有效。其作用是在启动容器的时候提供一个默认的命令项。如果用户执行docker run的时候提供了命令项,就会覆盖掉这个命令。没提供就会使用构建时的命令。
例如:当我们dockerfile生成了一个叫做test/ubuntu的镜像,我们要run这个镜像并且进入到这个test_ubuntu里面,我们平时需要执行:
Docker run -I -t -name testserver test/Ubuntu /bin/bash

如下段命令添加在了dockerfile中。
CMD ["/bin/bash"]
启动了容器后进入系统,我们就不需要写 /bin/bash了。或者我们run docker容器的时候,我们可以放其他命令,就可以覆盖/bin/bash这个CMD命令。
2.5. EXPOSE
     用法:EXPOSE <port> [<port>...]
说明:告诉Docker服务器容器对外映射的容器端口号,在docker run -p的时候生效。可以有多个EXPOSE
例如:
引用
EXPOSE 80

2.6. EVN
用法:EVN <key> <value> 一行只能设置一个
      EVN <key>=<value>允许一行一次设置多个
说明:设置容器的环境变量,可以让其后面的RUN命令使用,容器运行的时候这个变量也会保留。
例如:
引用
RUN set -ex && apt-get update && apt-get install -y iputils-ping 
ENV PATH /usr/local/bin:$PATH 
ENV LANG C.UTF-8 
ENV TERM xterm 
ENV PYTHON_VERSION 3.5.3 
ENV name1=ping name2=on_ip 
CMD $name1 $name2 

        由于镜像的层次文件系统,ENV定义的环境变量在后续层次中才能够被应用,示例如下:
引用
ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc

上述定义的结果中,def=hello,ghi=bye
2.7. ADD
用法:ADD <src>  <dest>
说明:复制本机文件或目录或远程文件,添加到指定的容器目录,支持GO的正则模糊匹配。路径是绝对路径,不存在会自动创建。如果源是一个目录,只会复制目录下的内容,目录本身不会复制。ADD命令会将复制的压缩文件夹自动解压,这也是与COPY命令最大的不同。事实上,当要读取URL远程资源的时候,并不推荐使用ADD指令,而是建议使用RUN指令,在RUN指令中执行wget或curl命令。
例如:
引用
#test
FROM ubuntu
MAINTAINER hello
ADD test1.txt test1.txt
ADD test1.txt test1.txt.bak
ADD test1.txt /mydir/
ADD data1  data1
ADD data2  data2
ADD zip.tar /myzip

有如下注意事项:
1. 如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。如果目标路径不存在,则会自动创建目标路径。
2. 如果源路径是个文件,且目标路径是不是以 / 结尾,则docker会把目标路径当作一个文件。
如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;
如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。
3. 如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。
如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。
4. 如果源文件是个归档文件(压缩文件),则docker会自动帮解压。
2.8. COPY
用法:COPY <src> <dest>
说明:COPY除了不能自动解压,也不能复制网络文件。其它功能和ADD相同。
因为有ADD的强大,对COPY不做更多说明。
2.9. ENTRYPOINT
用法:ENTRYPOINT "command" "param1" "param2"
说明:这个命令和CMD命令一样,唯一的区别是不能被docker run命令的执行命令覆盖,如果要覆盖需要带上选项--entrypoint,如果有多个选项,只有最后一个会生效。
因为不会被run覆盖,ENTRYPOINT可以配合docker run来使用。Docker run后面跟的参数作为ENTRYPOINT的参数来使用
例如:
引用
FROM centos
MAINTAINER allocator
RUN yum install -y nginx
RUN echo 'hello world' > /usr/share/nginx/html/index.html
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]

当我们启动镜像的时候不给参数
  
docker run --name test -p 5000:80 -it test_nginx

系统会用CMD指定的参数-h来运行ENTRYPOINT的命令。
当我们启动镜像的时候加了参数
  
docker run --name test -p 5000:80 -it test_nginx -g "daemon off"

系统会替换到CMD的参数用 -g "daemon off"来运行ENTRYPOINT的命令
2.10. VOLUME
用法:VOLUME ["path"]
说明:在主机上创建一个挂载,挂载到容器的指定路径。docker run -v命令也能完成这个操作,而且更强大。这个命令不能指定主机的需要挂载到容器的文件夹路径。但docker run -v可以,而且其还可以挂载数据容器。
2.11. USER
  用法: USER <user>[:<group>] or
USER <UID>[:<GID>]
说明:指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定的用户运行命令。
2.12. WORKDIR
用法:WORKDIR path
说明:为RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。
例如:WORKDIR  /home  WORKDIR test 。最终的路径就是/home/test。path路径也可以是环境变量,比如有环境变量HOME=/home,WORKDIR $HOME/test也就是/home/test。
2.13. ONBUILD
用法:ONBUILD [INSTRUCTION]
说明:配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。意思就是,这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令。
分享到:
评论

相关推荐

    docker、docker-compose 一键安装sentinel高可用redis集群

    docker、docker-compose 一键安装sentinel高可用redis集群 (一台虚拟机上安装的伪高可用集群,学习使用,可以修改文件配置相关参数,非原创,亲测可用) 安装前先安装 docker、docker-compose 第一步(脚本文件可以...

    docker、docker-compose 安装redis集群 (一台虚拟机上安装的伪集群,学习使用)

    docker、docker-compose 一键安装redis集群 (一台虚拟机上安装的伪集群,学习使用,可以修改文件配置相关参数,非原创,亲测可用) 第一步 /usr/local/下依次建docker、redis目录“/usr/local/docker/redis” 第二步 ...

    docker学习思维笔记.xmind

    docker 介绍 架构 安装 组成 命令 帮助命令 docker version docker info docker --help 镜像命令 docker images ... Dockerfile介绍 是什么 执行流程 关键字 数据卷 容器

    Rstudio Server + Docker + tensorflowR的dockerfile文件

    Rstudio Server + Docker + tensorflowR - 云端使用R语言与GPU深度学习

    Docker基础学习视频.zip

    目录网盘文件永久链接 01-Docker基础应用 01-Docker介绍 02-Docker应用场景 03-Docker镜像和容器 04-Docker进入容器和网络访问 05-Docker数据管理. 06-Docker镜像构建-手动构建 07-Docker镜像构建-Dockerfile 08-...

    docker-community-all-hands:参考链接指向我为Docker Community All-Hands事件所做的每个演讲

    使用Docker和Docker Compose创建可用于生产环境的Web应用程序的最佳实践2021年3月11日在本讲座中,我们将介绍使用别名和锚点,创建运行状况检查,使用覆盖文件模式并充分利用环境变量的实用Docker Compose示例。...

    multi-stage-docker-example:多阶段Dockerfile的示例文件

    多阶段Docker示例 这些是与创建多阶段docker示例相关的示例文件。 请遵循本文以获取更多详细信息: : 贡献 如果您想为此学习资源做出贡献,请提交PR或问题进行讨论!

    DockerElKitabi:我在学习Docker时所做的笔记

    # 内容 Docker空-满卷行为 绑定坐骑 货柜102 Docker网络驱动程序 Docker网络对象-1 Docker网络对象2端口发布 Docker网络对象3 记录应用程序日志 Docker统计与分析 容器Cpu和内存限制 环境变量 图像和注册表 图像...

    docker-demo

    demo项目的Docker管理命令文件Dockerfile用于构建包含python和此Django项目的映像的Docker文件docker-compose.yml -Docker Compose文件以启用使用常用选项启动Docker指令将Dockerfile构建为可运行的映像: docker ...

    docker学习笔记.zip

    docker学习笔记,内含html版与markdown版,两个版本类型的文件。里面概括性介绍了docker的使用方法,可跟着步骤实际操作。内容主要包括docker常用命令的使用方法,容器数据卷技术做持久化,dockerfile编写,docker...

    Docker入门基础笔记

    本笔记记录入门的Docker学习笔记,通俗易懂,适合没有学过docker的小伙伴作一个参看,码字不易,且看且珍惜 Docker的由来背景 Docker的基本操作 Docker应用 Docker自定义镜像 Docker-Compose Dockerfile文件

    中文-docker-compose-学习笔记:docker compose learning(Markdown)中文docker-compose学习笔记

    Docker进阶 按照做的笔记。 Docker撰写 官方介绍: Compose是用于定义和运行多容器Docker应用程序的工具。 通过Compose,您可以使用YAML文件来配置应用程序的服务。 然后,使用一个命令,就可以从配置中创建并启动...

    learning-docker:如何使用Docker创建自己的容器的简单实用示例

    Dockerfile是一个文本文件,其中包含用于构建Docker映像的命令。 # Arquivo Dockerfile FROM php:5.6-apache RUN docker-php-ext-install mysqli 在FROM我们指出将使用哪个图像作为基础。 在RUN我们将执行命令,...

    docker-brownbag:码头工人

    您可以按照本教程学习Docker的基础知识,从运行hello world容器到运行多机群。 它是Docker自己的一些文档和其他文章的精简版(请参阅底部的)。 注意:示例命令输出中显示的某些名称和ID是随机生成的或与上下文...

    Dockerfile制作基于Ubuntu的java应用镜像

    基于Ubuntu18镜像,打包jre8以及自己的java应用jar包到镜像,包含Dockerfile文件和启动截图等,环境为Win10 Pro + Docker Desktop,仅供学习参考。

    docker-file-lint:基于阿尔卑斯的Docker映像,用于对源代码执行常规文件检查,以提高存储库中的一致性(例如,便于在CI中使用)

    用于file-lint Docker映像 所有 Docker映像 • • •• • •• • • • • • • • • • • • • • • • • • 所有 Makefiles 访问以实现无缝项目集成,最低要求的最佳实践代码linting和CI。 在GitHub上...

    基于Shell和CSS的Apache Spark Docker镜像设计源码

    此外,还包括1个Git忽略文件,1个基础Dockerfile文件,1个CSS样式文件,1个YAML配置文件,以及3个Dockerfile文件(分别对应主节点、提交任务和模板Java Dockerfile)。这些文件详细展示了如何使用Shell和CSS构建...

    docker-mssql:Microsoft SQL Server 2017开发人员版的Docker容器

    克隆到桌面启动您的外壳程序和cd到克隆目录使用自定义TSQL修改setup.sql文件在下面选择以下选项之一选项1:使用docker-compose.yml文件启动您的外壳程序和cd到克隆目录运行以下命令:docker-compose up Docker随后...

    Docker使用Dockerfile来创建镜像

    dockerfile可以说是docker的描述符,该文件定义了docker镜像的所能拥有哪些东西.基本格式如下: 第一行指定该镜像基于的基础镜像(必须) FROM java:8 维护者信息 MAINTAINER quding niudear@foxmail.com 镜像操作指令 ...

    .net 4.5部署到docker容器的完整步骤

    本文主要给大家介绍了关于.net 4.5部署到docker容器的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 .net4.5部署到docker容器 部署到windows容器 部署到linux容器 部署到windows...

Global site tag (gtag.js) - Google Analytics