`
goalietang
  • 浏览: 26313 次
  • 性别: 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和docker-compose,集成ClickHouse、Elasticsearch、Kafka、M.zip

    在该压缩包中,可能包含了一系列配置文件、Dockerfile 和 docker-compose.yml 文件,用于构建和配置这些组件的容器。用户通过学习这个资源,可以了解如何在Docker环境下配置和运行ClickHouse、Elasticsearch、Kafka...

    docker学习思维笔记.xmind

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

    Docker-compose 教程全集 PDF 53页

    Docker-Compose项目是Docker官方的开源项目,... 使用一个Dockerfile模板文件, 可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某 项任务的情况。例如要实现一个Web项目,

    Rstudio Server + Docker + tensorflowR的dockerfile文件

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

    基于PHP的Docker实训课程-Dockerfile设计源码

    其中,PHP文件479个,JavaScript文件306个,CSS文件153个,PNG图片115个,GIF图片63个,文本文件18个,SVG文件12个,SCSS文件10个,配置文件6个,EOT文件6个。该源码适用于Docker容器化部署,适用于学习Docker和PHP...

    bitnami-docker-configmap-reload-源码.rar

    - 解压后的源码中可能包含 Dockerfile,这是一个定义构建 Docker 映像步骤的文本文件。 - Dockerfile 描述了如何构建一个 Docker 映像,包括基础镜像选择、复制源代码、设置环境变量、安装依赖、定义启动命令等。 ...

    存放各种docker image构建脚本或者快速启动的docker-compose文件 一处构建,处处可用,方便健忘人士和减轻

    学习和掌握Dockerfile的编写,以及docker-compose的使用,对于开发者和系统管理员来说极为重要。它们能够帮助我们实现服务的标准化、可移植性和自动化部署,同时减少因为环境不一致带来的问题。在实际操作中,我们...

    docker-compose-collection

    通过这个集合,你不仅可以学习如何编写 Docker Compose 配置文件,还可以了解到如何有效地组织多容器应用,理解服务间的依赖关系,以及如何通过 Dockerfile 自定义和优化你的应用环境。此外,对于开发、测试和部署...

    Docker基础学习视频.zip

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

    SpringCloudAlibaba微服务docker容器打包和部署示例实战.doc

    Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建过程。Docker-Compose 是一个用于定义和运行多容器的工具,允许开发者快速定义和部署多容器应用程序。 知识点5: Maven plug-in Maven 是一个项目管理工具...

    非常详细的-Docker-学习笔记.docx

    "非常详细的Docker学习笔记" Docker是开源的容器虚拟化平台,主要由两个部分组成:Docker和Docker Hub。Docker是一个容器虚拟化平台,Docker Hub是一个用于分享、管理Docker容器的SaaS平台。Docker使用客户端-...

    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文件来配置应用程序的服务。 然后,使用一个命令,就可以从配置中创建并启动...

Global site tag (gtag.js) - Google Analytics