手搓 Docker Image Creator(DIC)工具(02):预备知识

此节主要简单介绍一下 Docker、Dockerfile 的基本概念,Dockerfile 对的基本语法,Windows 和 macOS 下 Docker 桌面的安装,Docker 镜像的创建和运行测试等。

1 关于 Docker

Docker 是一个开源的应用容器引擎,它允许开发者打包应用及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。

关于 Docker 的更详细信息、以及Docker 在 CentOS 里的安装,在我的另一篇博文里做了很详细的介绍,在此就不在赘述。有需要了解的请参考此篇《Docker搭建LNMP环境实战(05):CentOS环境安装Docker-CE》。

2 关于 Dockerfile

Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建过程,通过一组指令(instructions)来指导 Docker 如何自动构建一个特定的镜像。以下是 Dockerfile 的关键命令或特性:

  • 基础镜像(FROM)

Dockerfile 通常从指定的基础镜像开始构建,例如 FROM ubuntu:latest 表示基于最新版 Ubuntu 镜像。

  • 维护者信息(MAINTAINER)

指定镜像的维护者信息,但已被官方弃用,推荐使用 LABEL 指令设置元数据。

  • 工作目录(WORKDIR)

设置镜像内部的工作目录,后续的 RUN、CMD、ENTRYPOINT 等命令将在该目录下执行。

  • 复制文件(COPY)

将本地文件或目录复制到镜像内部的指定路径。

  • 添加文件(ADD)

类似 COPY,但 ADD 还支持从 URL 下载文件并解压缩(如果文件是压缩格式)。

  • 运行命令(RUN)

执行任意 shell 命令或者脚本,用于安装软件包、修改配置等操作,每次 RUN 会创建一个新的镜像层。

  • 环境变量(ENV)

设置环境变量,可在构建时和运行时使用。

  • 暴露端口(EXPOSE)

指定镜像运行时将要监听的网络端口,但不映射到宿主机,实际端口映射需在运行容器时指定。

  • 设置容器启动命令(CMD)

指定容器启动后的默认执行命令和参数,可以被 docker run 命令后面跟的命令覆盖。

  • 入口点(ENTRYPOINT)

类似 CMD,但具有更高的优先级且不可被 docker run 命令覆盖,通常用于指定一个一直存在的长期运行的进程。

通过编写 Dockerfile 并执行 docker build -t <image-name> . 命令,可以从源代码和依赖项自动构建一个完整的、可重复使用的 Docker 镜像。这个镜像可以上传到 Docker Registry 分享给他人,或者在其他环境中拉取下来直接运行。

3 Docker 集成环境安装

  • Docker 官网:https://www.docker.com
  • Docker Desktop:https://www.docker.com/products/docker-desktop

3.1 Docker 桌面版介绍

Docker Desktop 是一款面向开发者的桌面应用程序,它允许用户在本地机器(Windows、Mac OS)上运行 Docker 容器和管理 Docker 环境。

主要特性:

  • 提供图形用户界面,方便管理和监控 Docker 容器及镜像。
  • 支持快速启动和配置 Docker 开发环境。
  • 内置 Kubernetes 支持,可以在本地进行 Kubernetes 应用的部署和测试。
  • 集成 Docker CLI 工具,支持通过命令行操作 Docker。

3.2 Docker 桌面版应用场景

  • 在开发阶段,Docker Desktop 可用于创建隔离的开发环境,确保开发人员的环境一致性。
  • 对于微服务架构的应用,开发人员可以在本地模拟多服务运行环境,便于调试和集成测试。
  • 教育培训场景下,教师可以利用 Docker Desktop 快速搭建教学环境,学生则可以在自己电脑上复现课程中的实验环境。

3.3 Docker 桌面版下载、安装与使用

用户可以下载并安装 Docker Desktop 到个人电脑上,安装过程中会自动配置所需的虚拟机、网络设置等环境。
安装完成后,用户可以通过 Docker Desktop 启动 Docker 服务,并通过 Docker CLI 或图形界面拉取、创建、运行容器。

3.3.1 Docker 桌面版下载

Docker 桌面版下载入口:
在这里插入图片描述

图1 Docker 桌面版下载链接

1)Windows 版下载

Windows 安装 exe 文件

2)Mac OS 版下载

Mac OS 安装 dmg 文件 - Apple 芯片

Mac OS 安装 dmg 文件 - Intel 芯片

3.3.2 Docker 桌面版安装

1)Windows 版安装

点击 “Docker Desktop Installer.exe”文件,开始安装。
在这里插入图片描述

图2 选择默认配置即可

在这里插入图片描述
图3 安装完成

2)macOS 版安装

macOS 桌面版本的按照其实非常简单,双击执行 docker.dmg 文件,弹出下面的窗口,将图标拖到 Applications 下即可。
在这里插入图片描述

图4 macOS 桌面版安装

4 小试 Dockerfile 编译及测试

在本博客的第2部分“2 关于 Dockerfile”里,我们介绍了 Dockerfile 的基本语法,以及创建 Docker 镜像所要用到的 build 命令。下面我们通过一个简单的示例来演示 Dockerfile 的使用。
首先,点击 Docker 图标,进入 Docker 桌面版。
在这里插入图片描述

图5 点击 Docker 图标,进入桌面版

备注:Windows 桌面版和 macOS 桌面版的操作基本一样,下面以 macOS 桌面版为例演示

4.1 创建一个简单的 Dockerfile

# 此 Dockerfile 以引用官方的轻量级基础镜像作为示例# 使用官方的轻量级基础镜像
FROM busybox# 当容器启动时运行 echo 命令
CMD ["echo", "Hello World"]

此 Dockerfile 的功能很简单,在文件的注释里描述得很清楚。

4.2 编译生成和查看镜像

1)编译生成镜像

将 Dockerfile 文件保存到本地(注意文件名为 Dockerfile ),并以命令行进入到该目录。
执行 docker build -t hello-world .(注意最后有个“点”)命令,即可编译出名为 hello-world 的 Docker 镜像。

2)查看镜像

进入 Docker 桌面版,
点击 Images 菜单,即可看到 hello-world 镜像。
在这里插入图片描述

图6 查看 hello-world 镜像

4.3 运行镜像并查看容器

1)运行镜像,生成容器

执行 docker run -itd --name hello-world hello-world 命令,即可生成名为 hello-world 的容器。

2)查看容器

进入 Docker 桌面版,点击 Containers 菜单,即可看到 hello-world 容器。
在这里插入图片描述

图7 查看 hello-world 容器

点击logs,可以看到容器输出的日志信息:Hello World,说明 Dockerfile 的 CMD 命令执行成功。
在这里插入图片描述

图8 查看 CMD 命令输出的 Hello World 信息

4.4 删除镜像和容器

1)删除容器

执行 docker rm -f hello-world 命令,即可删除 hello-world 容器。

-f 表示强制删除容器,即使是运行状态下的容器也可以删除

2)删除镜像

执行 docker rmi hello-world 命令,即可删除 hello-world 镜像。

只有在删除该镜像的容器之后,才能删除镜像。

下一节内容介绍 —— 实现alpine+jre的镜像
简要介绍一下 alpine 镜像,并在引入的 alpine 镜像基础上安装 JRE,使镜像拥有 java 运行环境。


上一篇:手搓 Docker Image Creator(DIC)工具(01):前言

下一篇:手搓Docker-Image-Creator(DIC)工具(03):实现alpine+jre的镜像


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

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

相关文章

各种坐标系辨析

坐标系辨析 0. 地球椭圆体1. 大地坐标系2. eci地心惯性坐标系3. 地心地固坐标系(ECEF坐标系&#xff0c;E系)4. 站心坐标系(ENU坐标系)5. LTM坐标系6. IMU坐标系7. 代码部分7.1 LLA(大地坐标系坐标、经纬度海拔)坐标转LTM系(ENU系)下的三维笛卡尔坐标 0. 地球椭圆体 地球表面是…

游泳耳机哪个牌子最好?2024好评率爆表的四款游泳耳机推荐!

在当今快节奏的生活中&#xff0c;运动成为了我们保持健康和放松身心的重要方式之一。游泳作为一项全身运动&#xff0c;不仅可以帮助我们塑造身材&#xff0c;还能让我们在水中尽情享受自由的感觉。然而&#xff0c;在游泳过程中&#xff0c;音乐却往往因为防水问题而成为一种…

【氮化镓】同质GaN垂直PiN二极管的SEB

【Single-event burnout in homojunction GaN vertical PiN diodes with hybrid edge termination design. Appl. Phys. Lett. 124, 132101 (2024)https://doi.org/10.1063/5.0189744】 概括&#xff1a; 本研究探讨了具有混合边缘终止设计&#xff08;Hybrid Edge Terminati…

LabVIEW挖坑指南

一、挖坑指南 1.1、输出变量放在条件框内 错误写法&#xff1a; 现象&#xff1a;如果没进入对应的分支&#xff0c;输出为默认值 正常写法&#xff1a; 让每个分支输出的值都在预料之内。 1.2、统计耗时不准 错误写法 现象&#xff1a;统计出来的耗时是2000ms 正常写法&a…

【Java代码审计】SSRF篇

【Java代码审计】SSRF篇 1.SSRF漏洞2.Java-SSRF漏洞常见接口3.SSRF漏洞演示URLConnectionURLConnection绕过 4.SSRF修复白名单方式过滤方式通用预防SSRF方法 1.SSRF漏洞 SSRF 是 Server-Side Request Forge 的英文首字母缩写&#xff0c;中文意思是服务器端请求伪造。Web 应用…

Coze工作流介绍(一)

Coze工作流介绍 工作流支持通过可视化的方式&#xff0c;对插件、大语言模型、代码块等功能进行组合&#xff0c;从而实现复杂、稳定的业务流程编排&#xff0c;例如旅行规划、报告分析等。 当目标任务场景包含较多的步骤&#xff0c;且对输出结果的准确性、格式有严格要求时…

鱼哥赠书活动第17期:看完这本《Python数据分析》菜鸟也能做Python数据分析?

鱼哥赠书活动第17期&#xff1a;看完这本《Python数据分析》菜鸟也能做Python数据分析&#xff1f; 一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一内容简介:第一部分&#xff08;第1~7章…

c++|vector使用及模拟实现

目录 一、vector的介绍 二、vector的使用(常用接口) 2.1string类的成员函数 2.1.1构造函数 2.1.2析构函数 2.1.3“”运算符重载函数 2.2 迭代器(iterator) 及 对象的遍历访问 2.2.1iterator 2.2.2 operator[] && at() 2.2.4 back() && front() 2.2…

Node.js环境调用百度智能云(百度云)api鉴权认证三步走

方式一 :Postman脚本的方式生成v1版本的认证字符串 Postman脚本下载 下载Postman pre-request Script 设置 Authorization 示例脚本 方式二&#xff1a;在线签名工具生成 (试用于验证编程字符串签名是否有错误) 签名计算工具 https://cloud.baidu.com/signature/index.html …

【蓝桥杯嵌入式】六、真题演练(一)-1演练篇:第 14 届真题

温馨提示&#xff1a; 真题演练分为模拟篇和研究篇。本专栏的主要作用是记录我的备赛过程&#xff0c;我打算先自己做一遍&#xff0c;把遇到的问题和不同之处记录到演练篇&#xff0c;然后再返回来仔细研究一下&#xff0c;找到最佳的解题方法记录到研究篇。 目录 解题记录&…

索引的概念

索引的概念    1.索引是一种可选的与表相关的数据库对象&#xff0c;用于提高数据的查询效率。    2.索引是一种有序的数据结构。    3.如果一个表没有创建索引&#xff0c;则对该表进行查询时需要进行全表扫描&#xff1b;如果创建了索引&#xff0c;则在有条件查询时…

java 枚举

枚举的格式 枚举是一种特殊的类 枚举类的最开始必须罗列所有类型 枚举类提供了一些父类的方法 values() :获取所有的的枚举对象,是一个数组 public enum A {A1, A2, A3;String name;A() {this.name "default";}String getName() {return name;}void setName(Strin…