Docker Dockerfile 语法与指令

一、简介

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.mzph.cn/news/21020.shtml

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

相关文章

基于 Redux + TypeScript 实现强类型检查和对 Json 的数据清理

基于 Redux TypeScript 实现强类型检查和对 Json 的数据清理 突然像是打通了任督二脉一样就用了 generics 搞定了之前一直用 any 实现的类型…… 关于 Redux 的部分,这里不多赘述,基本的实现都在这里:Redux Toolkit 调用 API 的四种方式 和…

【Leetcode】73.矩阵置零

一、题目 1、题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例1: 输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例2: 输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1…

2023年华数杯数学建模C题思路代码分析 - 母亲身心健康对婴儿成长的影响

# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一,她不仅为婴儿提供营养物质和身体保护, 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况,如抑郁、焦虑、 压力等,可能会对婴儿的认知、情…

深入了解PostgreSQL:高级查询和性能优化技巧

在当今数据驱动的世界中,数据库的性能和查询优化变得尤为重要。 POSTGRESQL作为一种开源的关系型数据库管理系统,在处理大规模数据和复杂查询时表现出色。 但随着数据量和查询复杂性的增加,性能问题可能会显现出来。 本文将深入探讨POSTGR…

华为OD机试真题 Java 实现【寻找最大价值的矿堆】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》。 刷的越多…

面试题:请说下什么是重绘和重排(回流)?他们的区别是什么?

答: ● 第一次渲染 ○ html结构 解析为 dom树 ○ css样式 解析为 样式规则 ○ dom树 和 样式规则 匹配下,生成渲染树! ○ 接下来就是重排:根据渲染树,得到每个盒子的几何信息(大小位置) ○ 最后…

Golang之路---03 面向对象——反射

反射 反射的存在意义 在开发中,你或许会碰到在有些情况下,你需要获取一个对象的类型,属性及方法,而这个过程其实就是反射。 golang中变量包括(type, value)两部分 静态类型 所谓的静态类型(…

第四次作业 运维高级 安装tomcat8和部署jpress应用

1. 简述静态网页和动态网页的区别。 静态网页 静态网页是指存放在服务器文件系统中实实在在的HTML文件。当用户在浏览器中输入页面的URL,然后回车,浏览器就会将对应的html文件下载、渲染并呈现在窗口中。早期的网站通常都是由静态页面制作的。 静态网页…

【Spring框架】SpringBoot统一功能处理

目录 用户登录权限校验用户登录拦截器排除所有静态资源练习:登录拦截器拦截器实现原理 统一异常处理统一数据返回格式为什么需要统⼀数据返回格式?统⼀数据返回格式的实现 用户登录权限校验 用户登录拦截器 1.自定义拦截器 package com.example.demo.…

shell centos 7 一键部署 KVM软件脚本

这个脚本有限地方还需要完善下 设计思路: 1、创建检查内核函数 check_kernel() 2、创建升级内核函数 update_kernel() 3、创建检查是否支持虚拟化函数 check_virtual() 4、创建检查操作系统函数 check_system() 5、创建检查网络函数 check_network() 6…

MicroPython ESP32网页实时更新DHT11数据显示

MicroPython ESP32网页实时更新DHT11数据显示 📌相关篇《MicroPython ESP32 读取DHT11温湿度传感器数据》📍《【Micropython esp32/8266】网页点灯控制示例》 ✨本例综合以上两篇文章内容实现:在本地网页中显示DHT11温度传感器数据。可以做到…

【Clion 2】使用技巧

一、TODO: 说明: 有时需要标记部分代码以供将来参考: 优化和改进的领域、可能的更改、要讨论的问题等等。 支持: TODO和FIXME小写和大写。这些模式可以在任何受支持的文件类型的行注释和块注释内使用。 创建TODO项 在要添加注释的代码行中…

Python web实战之 Django 的 MVC 设计模式详解

技术栈:Python、Django、HTML、CSS、JavaScript。 概要 在 Web 开发中,MVC(Model-View-Controller)模式是一种非常常见的设计模式,它可以帮助我们更好地管理代码,提高代码的可维护性。今天就介绍如何使用 …

RTT(RT-Thread)线程管理(1.2W字详细讲解)

目录 RTT线程管理 线程管理特点 线程工作机制 线程控制块 线程属性 线程状态之间切换 线程相关操作 创建和删除线程 创建线程 删除线程 动态创建线程实例 启动线程 初始化和脱离线程 初始化线程 脱离线程 静态创建线程实例 线程辅助函数 获得当前线程 让出处…

数组中的第K个最大元 O(N)

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5,6,4], k 2…

[腾讯云Cloud Studio实战训练营]无门槛使用GPT+Cloud Studio辅助编程完成Excel自动工资结算

目录 前言一、Cloud Studio产品介绍1.1 注册Cloud Studio 二、项目实验2.1 选择合适的开发环境2.2 实验项目介绍2.3 实验步骤三、总结 前言 chatgpt简单介绍: ChatGPT是一种基于GPT的自然语言处理模型,专门用于生成对话式文本。它是OpenAI于2021年发布的&#xff0…

突破传统监测模式:业务状态监控HM的新思路 | 京东云技术团队

一、传统监控系统的盲区,如何打造业务状态监控。 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性,关于一致性的补偿,已经由算法部的大佬总结过就不再赘述。这里主要讲如何去补偿?补偿的方案哪些?这就…

TCP/IP协议

TCP/IP 是一类协议系统,它是用于网络通信的一套协议集合 物理层 所谓的物理层,是指光纤、电缆或者电磁波等真实存在的物理媒介。这些媒介可以传送物理信号,比如亮度、电压或者振幅。对于数字应用来说,我们只需要两种物理信号来分别…

leetcode 435. 无重叠区间

2023.8.3 本题和引爆气球 这题非常类似&#xff0c;利用同样的思路可以解决&#xff0c;代码如下&#xff1a; class Solution { public:static bool cmp(vector<int>& a , vector<int>& b){if(a[0] b[0]) return a[1] < b[1];return a[0] < b[0];…

SpringBoot复习:(16)TomcatStarter

直接在idea里运行SpringBoot程序时&#xff0c;内嵌的tomcat容器会调用TomcatStarter这个类的onStartup方法。TomcatStarter继承自ServletContainerInitializer 其onStartup方法会调用ServletContextInitializer&#xff08;不是ServletContainerInitializer)的onStartup方法.…