Docker Dockerfile 语法与指令

news2024/12/27 3:39:19

一、简介

image.png

  • Docker 镜像原理、容器转成镜像

  • 随便找个案例,进入 https://hub.docker.com/ 搜索 centos,然后随便找个版本(例如:centos7)点击一下,就会进入 centos7dockerfile 文件:

    // 空镜像 scratch
    // 通常使用 Docker 镜像时会以一个已存在的镜像为基础,在其上进行定制,这个已存在的镜像就是基础镜像。
    // 在 DockerFile 中必须指定基础镜像,FROM 指令就是用于指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
    // Docker 还存在一个特殊的镜像,名为 scratch。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。在 Dockerfile 中以 scratch 为基础镜像 (FROM scratch),意味着不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。
    // 对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 FROM scratch 会让镜像体积更加小巧。使用 Go 语言开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go 是特别适合容器微服务架构的语言的原因之一。
    FROM scratch
    // 将 centos-7-x86_64 的压缩包添加到了根目录下,'/' 是根目录
    ADD centos-7-x86_64-docker.tar.xz /
    // 标签信息,一个镜像支持多个label
    LABEL \
        org.label-schema.schema-version="1.0" \
        org.label-schema.name="CentOS Base Image" \
        org.label-schema.vendor="CentOS" \
        org.label-schema.license="GPLv2" \
        org.label-schema.build-date="20201113" \
        org.opencontainers.image.title="CentOS Base Image" \
        org.opencontainers.image.vendor="CentOS" \
        org.opencontainers.image.licenses="GPL-2.0-only" \
        org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
    // 指定进入容器时使用的默认解释器类型,当创建容器时尾部如果不指定解释器类型就会使用默认的
    CMD ["/bin/bash"]
    

二、语法与指令

  • dockerfile 是用来构建 docker 镜像的构建文件,是由一系列命令和参数构成的脚本

  • 构建的三步骤:编写 dockerfile 文件build 构建docker run

  • dockerfile 指令:

    FROM:当前新镜像是基于那镜像
    
    MAINTAINER:镜像作者
    
    RUN:容器需要运行的命令
    
    EXPOSE:对外端口号
    
    WORKDIR:指定终端进入的工作目录
    
    ENV:设置环境变量
    
    ADD:将宿主机目录下的文件拷贝进镜像,ADD 命令会自动处理 URL 和解压压缩包
    
    COPY:将宿主机目录下的文件拷贝进镜像
    
    VOLUME:容器数据卷
    
    CMD:指定一个容器运行时要运行的文件(可以有很多 CMD 命令,但只有最后一个生效)
    
    ENTRYPOINT:指定一个容器运行时要运行的文件
    
    OMBUILD:构建一个被继承的 dockerfile 时运行命令,父镜像在子镜像继承之后,父镜像 onbuild 被 cufa 触发
    
    HEALTHCHECK:Docker 1.12 版本后引入的判断容器运行状态是否正常。
    

三、案例

  • 案例一:

    // 基于 centos 镜像
    FEOM centos
    // 作者信息 dzm
    MAINTAINER  dzm
    // 自定义环境变量
    ENV mypath /usr/local
    // 定义工作目录
    WORKDIR /usr
    // 添加 jdk×86 到 /usr/loca
    COPY jkd-8u171-linux-×86.tar.gz /usr/local
    // 添加并解压 jdk×64 到 /usr/local
    ADD jkd-8u171-linux-×64.tar.gz /usr/local
    // 添加并解压 tomcat 到 /usr/local
    ADD apache-tomcat-9.0.6.tar.gz /usr/local
    # 配置 java 与 tomcat 的环境变量
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CLASS_HOME /usr/local/apache-tomcat-9.0.6
    ENV CLASS_BASE /usr/local/apache-tomcat-9.0.6
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    // 加入三个容器卷
    VOLUME ["/mydata1","/mydata2","/mydata3"]
    // 安装 vim 组件
    RUN yum -y instatll vim
    // 安装网络组件
    RUN yun -y install net-tool
    // 监听端口
    EXPOSE 80
    // 指定 CMD
    CMD bin/bash
    
  • 案例二:

    // 基于 nginx:1.17.9 镜像构建
    FROM nginx:1.17.9
    // 指定信息
    LABEL maintainer="hogwarts@testing-studio.com>"
    // 设置环境变量
    ENV NGINX_VERSION 1.17.9
    // 切换 root 用户
    USER root
    // 执行命令,安装 curl 软件,设置软链接把 nginx 服务的日志显示到终端输出上。
    RUN apt-get -yq update && apt-get install -y curl && \
    ln -sf /dev/stdout /var/log/nginx/access.log && \
    ln -sf /dev/stderr /var/log/nginx/error.log
    // 设置容器内 /data 目录为匿名卷
    VOLUME ["/data"]
    // 设置工作目录
    WORKDIR /data/html/
    // 复制 index.html 文件到 WORKDIR 目录下
    COPY index.html .
    // 映射 80 端口
    EXPOSE 80
    // 此处 CMD 作为 ENTRYPOINT 的参数。
    // CMD ["nginx", "-g", "daemon off;"]
    CMD ["-g", "daemon off;"]
    // 设置容器启动的命令
    ENTRYPOINT ["nginx"]
    // 检查容器健康,通过访问 Nginx 服务 80 端口,来判断容器服务是否运行正常。
    HEALTHCHECK --interval=5s --timeout=3s \
    CMD curl -fs http://localhost/ || exit 1
    
  • 写好 dockerfile 后,则需要构建镜像(附:Docker build 命令详解)

    # -f:指定要使用的 Dockerfile 路径
    # -t:镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签
    $ docker build -f /home/dockerfile -t centos_tomcat
    
    或
    
    # .:Dockerfile 路径为当前目录
    $ docker build -t centos_tomcat .
    
  • 有了镜像后,则需要创建容器(附:Docker 常用命令与指令参数)

    $ docker run --name dzmtest -p 8080:80 centos_tomcat
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/825817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用python画满天星花朵,用python绘制漫天雪花

这篇文章主要介绍了用python绘制漫天雪花,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。 import turtle as t import random t.pensize(1) t.screensize(800,800,black) def s…

全新升级!腾讯云大数据 ES Serverless 服务开启日志分析新体验

2023年8月1号,腾讯云大数据 ES Serverless服务重磅发布,拥有自动弹性、完全免运维、极致成本、Elastic Stack生态兼容、灵活易用、稳定可靠等优势特性,提供开箱即用的云端Elasticsearch体验,助力企业高效上云! 自建El…

【云原生K8s】初识Kubernetes的理论基础

K8S由google的Borg系统(博格系统,google内部使用的大规模容器编排工具)作为原型,后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。 云原生基金会(CNCF)于2015年12月成立,隶属于Linux基金会。CNCF孵化的第一个项目…

swing布局详解

1. 布局管理器接口 (1)说明 布局管理器接口为LayoutManager和LayoutManager2,LayoutManager2是LayoutManager的子类。 (2)常用方法 方法描述LayoutManageraddLayoutComponent(String name, Component comp) removeL…

使用HBuilderX如何创建一个vue项目?

要在HBuilderX中创建一个Vue项目,可以按照以下步骤进行操作: 1.【创建】打开HBuilderX,点击菜单栏中的"文件",然后选择"新建",再选择"项目"。 在弹出的对话框中,选择"…

【简单认识GFS分布式文件系统】

文章目录 一.GlusterFS 概述1.GlusterFS简介2.特点3.GlusterFS 术语4.模块化堆栈式架构5.GlusterFS 的工作流程6.GlusterFS的卷类型1、**分布式卷(Distribute volume)**2、条带卷(Stripe volume)3、复制卷(Replica vol…

安达发|浅谈如何加强企业成本管理

成本管理是指企业生产经营过程中各项成本核算、成本分析、成本决策和成本控制等一系列科学管理行为的总称。成本管理充分动员和组织企业全体人员,在保证产品质量的前提下,对企业生产经营过程的各个环节进行科学合理的管理,力求以最少生产耗费…

windows11 音量图表 点击无法弹出

今天,发现右下角的 声音图标 点击了没有反应,这样调节音量很不方便: 黄老师来教你如何恢复正常: 1. 打开运行窗口 打开注册表以下位置: 计算机\HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explore…

Nginx学习教程(基础篇)

目录 一、Nginx安装 二、Nginx基本使用 2.1、目录结构 conf html logs sbin 2.2、基本运行原理 2.3、nginx.conf最小配置解析 worker_processes worker_connections include mime.types default_type application/octet-stream sendfile on keepalive_timeout…

无脑入门pytorch系列(一)—— nn.embedding

本系列教程适用于没有任何pytorch的同学(简单的python语法还是要的),从代码的表层出发挖掘代码的深层含义,理解具体的意思和内涵。pytorch的很多函数看着非常简单,但是其中包含了很多内容,不了解其中的意思…

云安全攻防(四)之 云原生技术

云原生技术 容器技术 容器与虚拟化 虚拟化(Virtualization)和容器(Container)都是系统虚拟化的实现技术,可实现系统资源的”一虚多“共享。容器技术可以理解成一种”轻量的虚拟化“方式,此处的”轻量“主…

工业机器人运动学与Matlab正逆解算法学习笔记(用心总结一文全会)(四)——雅可比矩阵

文章目录 建立DH模型机器人正运动学机器人逆运动学机器人雅可比矩阵△ 机器人速度雅可比矩阵○ 雅可比矩阵相关概念○ 以二连杆平面机器人举例说明雅可比矩阵 △ 机器人雅克比矩阵与速度分析△ 雅克比矩阵的奇异性○ 机器人的奇异位形(奇异形位、奇异点)…

Docker中容器数据卷

容器数据卷 一.什么是容器数据卷二.使用数据卷方式一:直接使用命令来挂载 -v 三.具名和匿名挂载 一.什么是容器数据卷 docker理念 将应用和环境打包成一个镜像! 数据?如果数据都在容器中,那么我们的容器删除,数据就会…

一文吃透UML图(海贼版)

先来简单的说一说什么是UML? UML是统一建模语言,是用来设计软件的可视化建模语言,它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息,UML从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图…

spring boot 服务健康检测返回OUT_OF_SERVICE,导致服务无法成功注册到consul

一、背景 健康检测接口返回OUT_OF_SERVICE curl -X GET http://192.168.5.53:8085/mgm/health{"status":"OUT_OF_SERVICE"}从日志启动看,没有任何报错信息;而且jvm进程也启动成功。 关键的一点信息是,服务的swagger地…

docker 资源限制

目录 1、CPU使用率 2、CPU共享比例 3、CPU周期限制 4、CPU核心限制 5、CPU 配额控制参数的混合案例 6、内存限制 7、Block IO 的限制 8、限制bps 和iops docker资源限制 Docker容器技术底层是通过Cgroup(Control Group 控制组)实现容器对物理资…

iOS多线程——pthread、NSThread

pthread NSThread 多线程的常见方案pthreadpthread 简介pthread 使用方法pthread 其他相关方法 NSThread创建、启动线程线程相关用法线程状态控制方法线程之间的通信NSThread 线程安全和线程同步NSThread 非线程安全NSThread 线程安全 多线程的常见方案 技术方案特点使用语言线…

[企业权限管理项目](二)环境搭建

数据库与表结构 oracle Oracle 为每个项目创建单独user,oracle数据表存放在表空间下,每个用户有独立表空间 创建用户及密码 语法[创建用户]: create user 用户名 identified by 口令[即密码]; 例子: create user tes…

bigemap在草原行业的应用案例

一.为什么选择Bigemap 1.使用软件一般都用于套坐标以及空间规划图,方便于项目选址和居民建房报建 2.在卫星图上找到用地范围,然后打点,导出点位范围的2000坐标,用于汇报出图 3.CGCS2000坐标系通过矢量转换转成地方坐标系

Noah-MP陆面过程模型建模方法与站点、区域模拟教程

详情点击链接:Noah-MP陆面过程模型建模方法与站点、区域模拟教程 陆面过程的内容(陆表能量平衡、水循环、碳循环等),陆面过程研究的重要性。 图 1 陆面过程主要研究内容 陆面过程模型的发展、基本原理、常用陆面过程模型等。 图…