K8S - 从零构建 Docker 镜像与容器

一、基础概念

1.1 镜像(Image)

“软件的标准化安装包” ,包含代码、环境和配置的只读模板。

技术解析

镜像由多个层组成,每层对应一个Dockerfile指令:

应用代码 → 运行时环境 → 系统工具链 → 启动配置

核心特性

  • 分层存储(每层对应 Dockerfile指令)

  • 内容寻址(SHA256 哈希防篡改)

  • 不可变性(构建后无法修改)

1.2 容器(Container)

“镜像的运行时实例,基于镜像创建的独立进程,像轻量级隔离的进程沙箱”。

技术解析

容器实例化后,会添加可写层,并应用进程隔离与资源限制机制:

镜像 → 可写层 → 进程隔离(Namespace)→ 资源限制(Cgroups

核心能力

  • 进程隔离(Linux Namespaces)

  • 资源限制(CPU/内存配额 Cgroups)

  • 临时存储(OverlayFS可写层)

1.3 Dockerfile

“镜像的构建说明书”,以 文本文件形式定义如何组装镜像。

技术解析

FROM python:3.8-slim  # 选择基础镜像
WORKDIR /app          # 设置工作目录
COPY requirements.txt .  
RUN pip install -r requirements.txt  # 安装依赖
COPY . .              # 复制应用代码
CMD ["python", "app.py"]  # 设置默认启动命令

关键原则

  • 指令顺序影响构建效率

  • 每个 RUN 生成新层(可合并命令减少层数)

核心价值
在这里插入图片描述

1.4 概念关系图

Dockerfile(docker build) → 镜像 → (docker run) → 容器 → (修改) → 可写层
可写层 -x (容器删除) → 数据丢失

二、 构建第一个镜像

1.环境准备(Mac/Win/Linux通用)

# 安装Docker
# 官网下载:https://www.docker.com/products/docker-desktop
# 验证安装
docker --version
# 预期输出示例:Docker version 20.10.17, build 100c701

2. 示例代码

项目结构概览

my-first-image/           # 项目根目录
│── app.py               # Flask 应用主程序
│── requirements.txt      # Python 依赖文件
│── Dockerfile           # 构建镜像的 Dockerfile

步骤1:创建项目文件

app.py

# 新建项目目录
mkdir ~/my-first-image && cd ~/my-first-image# 创建Python应用文件
cat <<EOF > app.py
from flask import Flask
app = Flask(__name__)@app.route('/')
def hello():return "Hello, 这是我的第一个容器!"if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
EOF# 生成依赖文件
echo "Flask==2.2.2" > requirements.txt

requirements.txt

Flask==2.2.2

步骤2:编写 Dockerfile (基础版,单阶段)

# 使用官方Python轻量版镜像
FROM python:3.8-slim# 设置容器内工作目录(自动创建)
WORKDIR /app# 1. 先复制依赖文件(利用缓存优化)
COPY requirements.txt .# 2. 安装依赖
RUN pip install --no-cache-dir -r requirements.txt# 3. 复制应用代码
COPY . .# 声明容器监听端口(实际映射需通过-p参数)
EXPOSE 5000# 容器启动命令(JSON格式避免shell解析问题)
CMD ["python", "app.py"]

步骤3:构建镜像

# 构建镜像(注意最后的点 . )
docker build -t my-first-app:v1 .# 查看生成的镜像
docker images
预期输出示例:REPOSITORY     TAG    IMAGE ID      SIZE
my-first-app   v1     a1b2c3d4e5    123MB

步骤4:运行容器

# 启动容器(前台运行,便于调试)
docker run -p 8000:5000 my-first-app:v1# 新开终端,测试访问:
curl http://localhost:8000
# 或在浏览器访问:http://localhost:8000

预期输出:

Hello, 这是我的第一个容器!

关键说明:

  • 缓存优化:先单独复制 requirements.txt安装依赖,代码变更时避免重复安装。

  • –no-cache-dir:禁用 pip缓存,减少镜像体积。

  • EXPOSE:仅为文档说明,实际端口映射需通过 -p 8000:5000实现。

三、Dockerfile实践与高效构建

3.1 Dockerfile 三大核心特性

特性1:分层构建(Layer)

title 镜像层组成
"基础镜像" 
"依赖安装" 
"应用代码" 
"元数据" 

缓存机制:重复构建时未变化的层直接复用缓存。

特性2:声明式语法

Dockerfile 示例

FROM python:3.8-slim  # 声明环境
COPY . /app           # 声明文件
CMD ["python", "app.py"]  # 声明启动

特点:描述 “做什么”而非 “怎么做”。

特性3:跨平台一致性

  • 构建结果与宿主机环境无关

  • 相同 Dockerfile 在任何平台生成相同镜像

3.2 核心指令解析

Dockerfile 基础指令集 (结合第二章示例)
在这里插入图片描述

指令说明

FROM :必须是 Dockerfile 的第一条有效指令。

最佳实践:

• 选择官方维护的基础镜像(如 python:3.8-slim)

• 避免使用 未经审计的第三方镜像

• -slim或 alpine版本可减少镜像体积

WORKDIR

• 会自动创建目录(如果不存在)。

• 比 RUN cd /app && … 更规范。

COPY

• 比 ADD 更推荐使用(除非需要自动解压功能)。

• 受 .dockerignore 文件影响。

RUN

• 每个 RUN 指令都会创建一个新的镜像层。

• 建议合并相关命令(如 apt-get update && apt-get install)。

CMD

生产环境建议
在这里插入图片描述

3.3 基础镜像选择指南

1. 官方镜像仓库推荐

# 通用搜索语法(所有语言适用)
docker search --filter "is-official=true" [技术栈关键词]# 示例:
docker search --filter "is-official=true" node
docker search --filter "is-official=true" golang

官方镜像特征:

• 命名规范:[技术栈]:[版本]-[变体]

# 标准格式示例:
docker pull node:18-bullseye-slim    # Node.js 官方镜像
docker pull golang:1.20-alpine       # Go 官方镜像
docker pull nginx:1.25-alpine        # Nginx 官方镜像

2. 主流语言推荐基础镜像

| 语言       | 开发环境镜像          | 生产环境镜像              |
|------------|---------------------|-------------------------|
| Python     | `python:3.10`       | `python:3.10-slim`      |
| Node.js    | `node:18`           | `node:18-alpine`        |
| Java       | `eclipse-temurin:17`| `eclipse-temurin:17-jre`|

3. 镜像变体对比

A[镜像变体] --> B[完整版]
A --> C[精简版]
A --> D[最小版]
B -->|含gcc/make等| E[500MB+]
C -->|仅运行时依赖| F[100-300MB]
D -->|musl libc| G[5-50MB]

选择原则

### 选择原则(新手友好版)
1. 生产环境优先选择 `-slim` 或 `-alpine````bash# 正确示例docker pull python:3.10-slim
# 开发调试 使用完整版, 临时使用(勿用于生产)
docker pull python:3.10

常用命令

# 查看镜像架构
docker manifest inspect python:3.9 | grep architecture# 拉取指定平台镜像
docker pull --platform=linux/amd64 nginx:alpine

3.4 容器生命周期管理命令集

1. 镜像管理命令

# 构建镜像(注意最后的点表示当前目录)
docker build -t myapp:v1 .# 查看镜像列表(grep 过滤)
docker images | grep python# 查看镜像构建历史
docker history myapp:v1# 删除镜像(-f 强制删除)
docker rmi -f myapp:v1# 给镜像打标签
docker tag myapp:v1 registry.example.com/myapp:v1# 推送镜像到仓库
docker push registry.example.com/myapp:v1

2. 容器操作命令

创建与启动# 创建并运行容器(-d 后台运行,-p 端口映射)
docker run -d -p 8080:80 --name mynginx nginx:alpine# 只创建不运行容器
docker create --name my_redis redis:6# 启动已创建的容器
docker start my_redis

运行中管理

# 查看运行中的容器(-a 显示所有,-q 只显示 ID)
docker ps -a
docker ps -q# 进入容器交互模式(推荐 /bin/sh,更轻量)
docker exec -it mynginx /bin/sh# 查看实时日志(--tail 显示最后 N 行)
docker logs -f --tail=100 mynginx
停止与删除# 优雅停止容器(发送 SIGTERM)
docker stop mynginx# 强制停止容器(发送 SIGKILL)
docker kill my_redis# 删除容器(-f 强制删除运行中的容器)
docker rm -f mynginx
3. 系统管理命令# 查看容器资源使用(CPU/内存/网络)
docker stats# 查看容器详细信息
docker inspect mynginx# 宿主机和容器之间拷贝文件
docker cp ./local_file mynginx:/container_path
docker cp mynginx:/container_path ./local_dir

4. 一键清理命令

# 清理所有停止的容器(-f 强制)
docker container prune -f# 清理所有悬空镜像
docker image prune -f# 彻底清理(包括未使用的镜像和缓存)
docker system prune -a

5. 生产环境组合命令

# 批量停止并删除所有容器
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)# 删除所有 <none> 镜像(悬空镜像)
docker rmi $(docker images -f "dangling=true" -q)# 重启所有容器(先 stop 再 start)
docker stop $(docker ps -q) && docker start $(docker ps -aq)
6. 注意事项# 重要数据必须挂载 volume(示例)
docker run -v /host/path:/container/path mysql# 设置资源限制(示例)
docker run --memory="1g" --cpus="2" myapp# 使用非 root 用户运行(在 Dockerfile 中添加)
RUN useradd -m appuser && chown -R appuser /app
USER appuser

四、总结

4.1 核心概念关系

A[Dockerfile] --> B[镜像]
B --> C[容器]
C --> D[Pod]
D --> E[Deployment]

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

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

相关文章

better_fbx 下载

目录 v6.0.5下载&#xff1a; better_fbx 下载 v6.0.5下载&#xff1a; Blender FBX模型导入导出插件 Better FBX Importer & Exporter V6.0.5V5.4.10 For Blender 2.8 | 龋齿一号GFXCamp better_fbx 下载 How To Install Launch Blender, navigate to Edit->User P…

Spring AOP 典型应用场景

AOP 典型应用场景 1. 日志记录&#xff08;Logging&#xff09;代码实现 2. 权限校验&#xff08;Authentication&#xff09;代码实现 3. 性能监控&#xff08;Performance Monitoring&#xff09;代码实现 4. 缓存处理&#xff08;Caching&#xff09;代码实现 5. 重试机制&a…

开始一个vue项目-day2

这次新增的功能有&#xff1a; 1、使用cookie存储token 参考网站:https://vueuse.org/ 安装包&#xff1a; npm i vueuse/integrations npm i universal-cookie^7 2、cookie的设置读取和删除&#xff0c;代码&#xff1a;composables/auth.js import { useCookies } from …

「Mac畅玩AIGC与多模态18」开发篇14 - 多字段输出与结构控制工作流示例

一、概述 本篇在输入变量基础上,演示如何通过执行 LLM 节点输出多个结构化字段,并传递至结束节点。开发人员将掌握如何配置结构化输出格式,实现提示词与字段的准确映射,为后续引入条件判断、循环结构等逻辑控制建立结构输出规范基础。 二、环境准备 macOS 系统Dify 平台已…

JWT解析

什么是JWT JSON Web Token &#xff08;JWT&#xff09; 是一种开放标准 &#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且独立的方式&#xff0c;用于在各方之间以 JSON 对象的形式安全地传输信息。此信息可以验证和信任&#xff0c;因为它是经过数字签名的。…

C语言中的自定义类型 —— 结构体.位段.联合体和枚举

自定义类型 1. 前言2. 结构体2.1 结构体的声明2.2 结构体变量的定义和初始化2.3 结构体的特殊声明2.4 结构体的自引用2.5 结构体的内存对齐2.6 修改默认对齐数2.7 结构体传参 3. 位段4. 联合体5. 枚举6. 结言 1. 前言 在C语言中已经为用过户提供了内置类型&#xff0c;如&…

StarRocks 查询优化器深度解析

StarRocks 查询优化器概览 1. Development History of StarRocks 过去五年&#xff0c;StarRocks 发布了三个大版本&#xff1a; StarRocks 1.0&#xff1a;通过向量化引擎和 CBO&#xff0c;打造极速 OLAP 数据库。 StarRocks 2.0&#xff1a;通过主键模型、数据湖分析和查询…

如何提高情商?(优化版)

引言 提高情商&#xff08;EQ&#xff09;是一个需要长期练习和自我反思的过程&#xff0c;核心在于理解自己、管理情绪、共情他人并有效沟通。以下是一些具体且可操作的方法&#xff0c;结合理论和实际场景&#xff0c;帮助你逐步提升&#xff1a; 一、核心方法&#xff1a;…

Python爬虫实战:获取好大夫在线各专业全国医院排行榜数据并分析,为患者就医做参考

一、引言 在当今医疗资源丰富但分布不均的背景下,患者在选择合适的心血管内科医院时面临诸多困难。好大夫在线提供的医院排行榜数据包含了医院排名、线上服务得分、患者评价得分等重要信息,对患者选择医院具有重要的参考价值。本研究通过爬取该排行榜数据,并进行深入分析,…

【AI面试准备】电商购物车AI测试设计与实施

面试题&#xff1a;案例实践&#xff1a; 为电商购物车设计AI测试&#xff1a;通过用户行为日志训练点击路径预测模型&#xff0c;动态生成边界条件测试用例。 为了顺利通过面试&#xff0c;回答应结构清晰、技术深入&#xff0c;并突出实际应用与创新。以下为分步解答&#…

Java 中使用 Callable 创建线程的方法

一、Callable 接口概述​ Callable接口位于java.util.concurrent包中&#xff0c;与Runnable接口类似&#xff0c;同样用于定义线程执行的任务&#xff0c;但它具有以下独特特性&#xff1a;​ 支持返回值&#xff1a;Callable接口声明了一个call()方法&#xff0c;该方法会在…

2025-SMS短信验证服务或存风险,小心账号隐私“失守”

近期&#xff0c;火绒安全情报中心监测到一款伪装成具备SMS短信验证码接收服务的程序。该程序通过部署持久化后门&#xff08;即僵尸网络节点&#xff09;窃取敏感信息。火绒安全提醒广大用户务必从官方或可信渠道下载软件&#xff0c;避免因使用来路不明的程序而导致账号被盗或…

docker部署Open WebUI下载速度慢解决方法

docker pull ghcr.nju.edu.cn/open-webui/open-webui:main改成这个就可以了

气泡图、桑基图的绘制

1、气泡图 使用气泡图分析某一年中国同欧洲各国之间的贸易情况。 气泡图分析的三个维度&#xff1a; • 进口额&#xff1a;横轴 • 出口额&#xff1a;纵轴 • 进出口总额&#xff1a;气泡大小 数据来源&#xff1a;链接: 国家统计局数据 数据概览&#xff08;进出口总额&…

前端面经-VUE3篇(三)--vue Router(二)导航守卫、路由元信息、路由懒加载、动态路由

一、导航守卫 vue Router 中的 导航守卫&#xff08;Navigation Guards&#xff09; 是一个非常重要的功能&#xff0c;用于在路由切换过程中&#xff0c;拦截、控制、检查或延迟页面跳转。 你可以理解为&#xff1a; &#x1f510; “进门前的保安”&#xff0c;控制哪些页面…

MATLAB实现二氧化硅和硅光纤的单模光波特性与仿真

一.二氧化硅和硅光纤的单模光波特性 利用麦克斯方程的精确解研究二氧化硅和硅亚波长直径导线的单模光波特性。研究了单模条件、模场。 二氧化硅光纤导线是圆形截面&#xff0c;包层是空气包层&#xff0c;阶梯型变化的折射率&#xff0c;导线线径D非常小长度足够长&#xff0…

【Linux系统】第二节—基础指令(2)

hello ~ 好久不见 自己想要的快乐要自己好好争取&#xff01; 云边有个稻草人-个人主页 Linux—本篇文章所属专栏—欢迎订阅—持续更新中 目录 本节课核心指令知识点总结 本节基本指令详解 07.man 指令 08.cp 指令 09.mv 指令 10.cat 指令 11.more 指令 12.less 指令 …

为了结合后端而学习前端的学习日志——【黑洞光标特效】

前端设计专栏 今天给大家带来一个超酷的前端特效——黑洞光标&#xff01;让你的鼠标变成一个会吞噬光粒子的迷你黑洞&#xff0c;点击时还会喷射出绿色能量粒子&#xff01;&#x1f320; &#x1f680; 效果预览 想象一下&#xff1a;你的鼠标变成一个旋转的黑洞&#xff0…

[硬件电路-11]:模拟电路常见元器件 - 什么是阻抗、什么是输入阻抗、什么是输出阻抗?阻抗、输入阻抗与输出阻抗的全面解析

1. 阻抗&#xff08;Impedance&#xff09; 定义&#xff1a;阻抗是电路或元件对交流信号&#xff08;AC&#xff09;流动的阻碍能力&#xff0c;用符号Z表示&#xff0c;单位为欧姆&#xff08;Ω&#xff09;。它综合了电阻&#xff08;R&#xff09;、电感&#xff08;L&am…

机器学习和深度学习的对比

深度 数据经过深层网络后&#xff0c;语义信息表征能力强&#xff0c;对几何细节信息表征能力弱。 数据依赖性 深度学习算法需要大量的数据来训练&#xff0c;而传统的机器学习使用制定的规则。所以&#xff0c;当数据量少时&#xff0c;深度学习的性能差于机器学习&#xf…