当前位置: 首页 > news >正文

【DevOps】Dockerfile详解,做自己的docker镜像

学会使用DockerHub找自己想要的镜像以后,我们会很方便的使用一些公用镜像仓库的Docker镜像。但是开发和部署的过程中,能找到的镜像可能并不能满足我们需要,这样我们就需要自己制作Docker镜像。我们通过需要编写一个 Dockerfile,然后来生成一个Docker镜像。Dockerfile 是一个文本文件,包含了从基础镜像构建新镜像所需的一系列命令和参数。这些命令涵盖了复制文件、安装软件、设置环境变量等多种操作,它们在 Docker 镜像构建过程中按顺序执行。

一、Dockerfile 基本结构和常用指令

  1. FROM - 指定基础镜像

    FROM ubuntu:20.04
    

    这条指令设置了使用 Ubuntu 20.04 作为基础镜像。

  2. RUN - 执行命令

    RUN apt-get update && apt-get install -y nginx
    

    运行命令来更新包管理器的索引并安装 Nginx。

  3. CMD - 提供容器启动时的默认执行命令

    CMD ["nginx", "-g", "daemon off;"]
    

    设置容器启动时默认运行 Nginx。

  4. EXPOSE - 声明端口

    EXPOSE 80
    

    告知 Docker 镜像意图在运行时开放 80 端口。

  5. ENV - 设置环境变量

    ENV NGINX_VERSION 1.14
    

    设置环境变量 NGINX_VERSION

  6. COPY 和 ADD - 复制文件/目录

    COPY . /app
    

    将当前目录下的所有文件复制到镜像的 /app 目录中。

  7. WORKDIR - 设置工作目录

    WORKDIR /app
    

    设置后续的 RUN、CMD、ENTRYPOINT 命令的工作目录。

  8. ENTRYPOINT - 设置容器启动时执行的命令

    ENTRYPOINT ["python3", "-m", "http.server"]
    

    设置容器启动时运行 Python3 的 HTTP 服务器。

  9. USER - 设置运行用户

    USER myuser
    

    指定接下来的 RUN、CMD 以及 ENTRYPOINT 命令的运行用户。

  10. ARG - 定义构建参数

    ARG version
    

    定义一个名为 version 的参数,可在构建时提供。

  11. VOLUME - 定义匿名卷

    VOLUME /var/log/nginx
    

    在容器中创建一个点 /var/log/nginx,可以用来存储数据。

二、构建和运行 Docker 镜像

1、编写 Dockerfile:根据需要创建一个包含上述指令的 Dockerfile。假设文件内容如下:

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
COPY . /var/www/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

以下是 Dockerfile 的详细解释:

  • FROM ubuntu:20.04:指定基础镜像为 Ubuntu 20.04。这意味着构建的 Docker 镜像将基于 Ubuntu 20.04 镜像。
  • RUN apt-get update && apt-get install -y nginx:执行命令,更新软件包列表和安装 Nginx。这里使用了 && 符号,表示在更新软件包列表后再安装 Nginx。-y 参数表示在安装过程中自动回答 yes。
  • COPY . /var/www/html:将当前目录中的所有文件复制到容器的 /var/www/html 目录中。这里的 . 表示当前目录,/var/www/html 是 Nginx 的默认网站目录。
  • EXPOSE 80:声明容器将监听 80 端口。这里的 80 端口是 Nginx 的默认端口。
  • CMD ["nginx", "-g", "daemon off;"]:指定容器启动时执行的命令。这里的命令是启动 Nginx,并使用 daemon off; 参数以前台模式运行。

 这个 Dockerfile 构建了一个简单的 Nginx 服务器,它基于 Ubuntu 20.04,安装了 Nginx,并配置了服务器以运行你提供的网站内容。当构建并运行这个镜像时,它将启动 Nginx 并使其能够提供静态内容,监听在容器的 80 端口上。这种配置非常适合托管静态网站或作为 Web 应用的前端服务器。

2、构建镜像:在 Dockerfile 所在目录执行以下命令:

docker build -t my-nginx-image .

这将构建一个新的镜像,并标记为 my-nginx-image

命令的参数说明如下:

  • docker:Docker 命令行工具的名称。
  • build:构建 Docker 镜像的命令。
  • -t:指定镜像的标签(tag)。这里的标签为 my-nginx-image,表示构建的 Docker 镜像的名称为 my-nginx-image
  • .:指定 Dockerfile 所在的路径。这里的路径为 .,表示 Dockerfile 位于当前目录。

执行 docker build -t my-nginx-image . 命令后,Docker 会在当前目录中查找 Dockerfile,然后根据 Dockerfile 中的指令,构建 Docker 镜像。构建完成后,镜像会被存储在本地,可以使用 docker images 命令查看。

3、运行容器

docker run -p 8080:80 my-nginx-image

这会启动一个容器实例,使用该镜像,并将本地的 8080 端口映射到容器的 80 端口。

命令的参数说明如下:

  • docker:Docker 命令行工具的名称。
  • run:运行 Docker 容器的命令。
  • -p:指定端口映射。这里的端口映射是将容器的 80 端口映射到宿主机的 8080 端口。这意味着当访问宿主机的 8080 端口时,会被转发到容器的 80 端口。
  • my-nginx-image:指定要运行的 Docker 镜像。这里的镜像名称为 my-nginx-image,是之前构建的 Docker 镜像。

通过这些步骤,你可以创建几乎任何类型的 Docker 镜像,以满足各种应用场景和需求。

三、基础镜像选择

基础镜像(Base Image)是构建 Docker 镜像的起点,所有 Docker 镜像都是从一个基础镜像开始构建的。基础镜像包含了操作系统的最小化安装或特定应用的运行环境,从中可以添加更多的层次(Layer)来创建最终的镜像。

常见的基础镜像
  • Ubuntu

    • 描述:Ubuntu 是一个基于 Debian 的开源操作系统,广泛用于云和服务器环境中。
    • 优点:广泛的社区支持,丰富的包库,频繁的更新。
    • 使用场景:适用于需要稳定、多功能和易于使用的 Linux 环境的应用。
  • Alpine Linux

    • 描述:Alpine Linux 是一个面向安全的轻量级 Linux 发行版,使用 musl libc 和 busybox。
    • 优点:非常小的镜像大小(通常在 5MB 左右),提高了安全性和资源效率。
    • 使用场景:非常适合创建小型、安全的容器化应用。
  • CentOS

    • 描述:CentOS 是一个基于 Red Hat Enterprise Linux 的开源操作系统,具有企业级的稳定性和安全性。
    • 优点:长期支持,企业级部署的好选择。
    • 使用场景:适用于需要企业级支持和广泛兼容性的应用。
  • Debian

    • 描述:Debian 是一个极其稳定的操作系统,它是 Ubuntu 和许多其他 Linux 发行版的基础。
    • 优点:稳定性强,支持周期长,包管理系统成熟。
    • 使用场景:适合需要长期稳定支持的服务器和应用。
  • Scratch

    • 描述:在 Docker 的上下文中,scratch 是一个空白的镜像,不包含任何文件或内容。
    • 优点:可以从零开始构建镜像,完全控制镜像内容。
    • 使用场景:适合需要极致轻量化的专用容器,或者构建基于 C/C++ 等不依赖于操作系统发行版的应用。
  • BusyBox

    • 描述:BusyBox 结合了多个 UNIX 实用工具的单个小型可执行文件,经常用在嵌入式环境中。
    • 优点:非常小巧,适合嵌入式系统和资源受限环境。
    • 使用场景:适用于需要最小化 Linux 系统的简单容器。
如何选择基础镜像

选择基础镜像时,应考虑以下因素:

  1. 镜像大小:选择更小的基础镜像可以减少构建时间和提高容器启动速度。
  2. 安全性:一些基础镜像如 Alpine Linux 专注于提供最小化的安全风险。
  3. 兼容性:某些应用可能依赖于特定的系统库或环境,选择兼容这些需求的基础镜像是关键。
  4. 社区和支持:广泛使用的基础镜像通常有较大的社区和更好的支持。
  5. 更新和维护:选择活跃维护和定期更新的基础镜像以保证安全和最新。

通过这些考虑,你可以选择最适合你的项目需求的基础镜像。在 Dockerfile 中使用基础镜像非常简单,只需在文件顶部使用 FROM 指令指定即可。

相关文章:

【DevOps】Dockerfile详解,做自己的docker镜像

学会使用DockerHub找自己想要的镜像以后,我们会很方便的使用一些公用镜像仓库的Docker镜像。但是开发和部署的过程中,能找到的镜像可能并不能满足我们需要,这样我们就需要自己制作Docker镜像。我们通过需要编写一个 Dockerfile,然…...

CSRF 攻击实验:Token 不存在绕过验证

前言 CSRF(Cross-Site Request Forgery),也称为XSRF,是一种安全漏洞,攻击者通过欺骗用户在受信任网站上执行非自愿的操作,以实现未经授权的请求。 CSRF攻击利用了网站对用户提交的请求缺乏充分验证和防范…...

c#教程——索引器

前言: 索引器(Indexer)可以像操作数组一样来访问对象的元素。它允许你使用索引来访问对象中的元素,就像使用数组索引一样。在C#中,索引器的定义方式类似于属性,但具有类似数组的访问方式。 索引器&#x…...

麒麟服务器上执行可执行脚本报错:bash: ./xx: Permission denied(完整版)

前情提要 本来都好好的,我重启了服务器以后就开始报这个错了,而我的麒麟服务器目前是这个情况: 已经在服务器上配置好了 ssh 免密登录,在命令行里执行 ssh -o StrictHostKeyCheckingno -p 22 usernamexxx.xxx.xxx.xxx 可以正常登…...

触觉美学:移动端UI设计的视觉盛宴

...

前端起dev从110秒减少到7秒, 开发体验大幅提升

[webpack由浅入深]系列的内容 第一层: 了解一个小功能的完整流程. 看完可以满足好奇心和应付原理级别面试.第二层: 源码陪读, webpack源码比较灵活, 自己看容易陷入迷惑. 文章里会贴出关键流程的代码来辅助阅读源码. 如果你正在自己调试, 在这些方法上下断点会节约你宝贵的时间…...

Flink CDC 原理

简介 Flink CDC(Change Data Capture)是 Apache Flink 提供的一个变更数据捕获工具集。它可以监控数据库的变更,并将这些变更实时地以流的形式提供给下游系统,这些变更包括插入、更新和删除操作。 Flink CDC 适用于需要实时数据…...

Axure网上超市用户端APP原型 (O2O生鲜电商/买菜到家/数字零售/京东到家/抖音超市领域)

作品概况 页面数量:共 100 页 源文件格式:rp格式,兼容 Axure RP 9/10,非程序软件无源代码 适用领域:O2O生鲜电商、网上超市、买菜到家、数字零售 作品特色 本作品为网上超市用户消费端Axure交互原型,属于…...

外包公司中能学到技术的都是那些人?

在外包公司能够有效学习并提升技术的人,通常具备以下特点和行为模式: 自我驱动力强:这类人有强烈的学习欲望和提升自我的动机,不依赖公司安排的培训,而是主动寻找学习资源,如在线课程、技术书籍、开源项目等…...

JavaEE初阶-多线程进阶2

文章目录 前言一、CAS1.1 CAS的概念1.2 原子类1.3 CAS的ABA问题 二、JUC中常用类2.1 Callable接口2.2 ReentrantLock(可重入)2.3 Semaphore信号量2.4 CountDownLatch类2.5 CopyOnWriteArrayList类2.6 ConcurrentHashMap 前言 对于多线程进阶的部分&…...

B/S和C/S框架

一、B/S框架 B/S框架是指Browser/Server框架,即基于浏览器和服务器的应用程序开发框架。在B/S架构中,用户通过浏览器(Browser)访问服务器(Server)上的应用程序或网站,而无需在用户端安装额外的客…...

机器学习中常用的几种距离——欧式、余弦等

目录 一、欧式距离(L2距离)二、曼哈顿距离(L1距离)三、汉明距离四、余弦相似度 一、欧式距离(L2距离) (1)二维空间的距离公式(三维空间的在这个基础上类推)&…...

2024 Google I/O Android 相关内容汇总

2024 Google I/O Android 相关内容汇总 本次 Google I/O 的核心虽然是 AI ,但是 Android 也是作为主要议题出现, Android 部分可以简单分为产品和开发相关内容,接下来主要介绍这两部分的相关更新。 重点开始开发相关,内容不少 产…...

# 从浅入深 学习 SpringCloud 微服务架构(十八)

从浅入深 学习 SpringCloud 微服务架构(十八) 一、开源配置中心 Apollo:概述 1、开源配置中心 Apollo Apollo -A reliable configuration management system Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理…...

在SQL Server中使用临时表与普通表的性能差异分析

在SQL Server中,临时表和普通表的性能确实存在差异,具体表现和影响因素如下: 临时表和普通表的区别 存储位置: 临时表:存储在tempdb数据库中,生命周期仅限于当前会话或批处理。当会话结束或批处理完成时&a…...

数据中台管理系统原型

数据中台是一个通用性的基础平台,适用于各类行业场景,数据中台包含多元数据汇聚、数据标准化、数据开发、数据共享、数据智能、数据资产管理等功能,助力企业数字化转型。 数据汇聚 数据汇聚是将不同系统、不同类型的多元源数据汇聚至目标数据…...

数据库练习

在数据库中创建一个表student,用于存储学生信息 CREATE TABLE student( id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, grade FLOAT ); 1、向student表中添加一条新记录(记录中id字段的值为1,name字段的值为"monkey"&#xff0c…...

Rust学习笔记(上)

前言 笔记的内容主要参考与《Rust 程序设计语言》,一些也参考了《通过例子学 Rust》和《Rust语言圣经》。 Rust学习笔记分为上中下,其它两个地址在Rust学习笔记(中)和Rust学习笔记(下)。 编译与运行 Ru…...

【SRC实战】文件名回显导致反射型XSS,URL重定向

挖个洞先 https://mp.weixin.qq.com/s/hnrm-snkETuR-gqPOSnQXQ “ 以下漏洞均为实验靶场,如有雷同,纯属巧合 ” 01 — 漏洞证明 一、反射型XSS “ 文件名回显,能否触发XSS?” 1、灯塔扫到敏感文件,发现1.txt会在…...

mysql高版本导入低版本Unknown collation: utf8mb4_0900_ai_ci

MySQL数据库导入SQL报错 Unknown collation: ‘utf8mb4_0900_ai_ci‘ 错误原因:我本地的MySQL数据包版本为8.0的,而服务器上的MySQL版本为5.7,双方的版本不兼容,这样就导致我在本地写好的SQL无法在服务器上的MySQL上运行。 解决办…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...