当前位置: 首页 > 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上运行。 解决办…...

pam_env.so模块配置解析

在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...

[拓扑优化] 1.概述

常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...