登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
Docker 基础入门:核心概念与架构原理
Docker 基础入门:核心概念与架构原理
[ 复制链接 ]
褥师此
昨天 17:50
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
在云计算与容器化技术飞速发展的今天,Docker 已经成为开发者必备的工具之一。无论是本地开发环境的一致性保障、持续集成/持续部署(CI/CD)的自动化落地,还是服务器资源的高效利用,Docker 都发挥着不可替代的作用。对于刚接触容器技术的新手而言,想要快速上手 Docker,首先需要理清其核心概念与底层架构,这也是后续深入学习 Docker 进阶用法、解决实际问题的基础。本文将从 Docker 的起源与价值出发,详细拆解核心概念,剖析底层架构,并搭配实用代码示例,帮助大家从零入门 Docker,真正理解其工作原理与使用逻辑。
一、Docker 简介:什么是 Docker,为什么要用它?
1.1 Docker 的定义
Docker 是一个开源的应用容器引擎,基于 Go 语言开发,遵循 Apache 2.0 开源协议。它能够将应用程序及其依赖项打包到一个可移植的容器中,然后发布到任何支持 Docker 的操作系统上,实现“一次打包,到处运行”的效果。与传统的虚拟机技术不同,Docker 容器不依赖于底层操作系统的虚拟化,而是共享宿主机的内核,因此具有启动速度快、资源占用少、可移植性强等优势。
1.2 Docker 的核心价值
在 Docker 出现之前,开发者常常面临“开发环境能跑,生产环境跑不起来”的困境,核心原因在于开发环境、测试环境、生产环境的配置不一致,以及依赖项版本冲突等问题。Docker 的出现,正是为了解决这些痛点,其核心价值主要体现在以下几个方面:
环境一致性
:将应用及其依赖(如编程语言、库、配置文件等)打包成容器,容器在任何支持 Docker 的环境中运行时,都能保持一致的运行效果,彻底解决“环境不一致”问题。
资源高效利用
:Docker 容器共享宿主机内核,不需要像虚拟机那样占用独立的内存、CPU 和操作系统资源,启动时间通常在秒级,资源利用率远高于虚拟机。
可移植性强
:容器可以在本地、服务器、云平台之间自由迁移,只要目标环境支持 Docker,就能直接运行,无需修改任何配置。
简化部署与运维
:通过 Docker 可以快速部署应用,实现自动化运维,减少人工操作,降低部署失误的概率,同时便于应用的扩容与缩容。
隔离性良好
:每个容器都是独立的运行环境,容器之间相互隔离,不会相互影响,避免了应用之间的冲突,提高了系统的稳定性和安全性。
1.3 Docker 与虚拟机的区别
很多新手会将 Docker 与虚拟机混淆,但两者在底层实现、资源占用、启动速度等方面有本质区别,具体对比如下表所示:对比维度Docker 容器虚拟机(VM)底层实现共享宿主机内核,基于容器化技术虚拟化底层硬件,运行独立操作系统资源占用占用资源少,轻量级占用资源多,重量级启动速度秒级启动分钟级启动隔离性进程级隔离,隔离性较弱系统级隔离,隔离性强可移植性强,可跨平台迁移弱,依赖虚拟化软件和底层系统简单来说,虚拟机是“模拟一个完整的操作系统”,而 Docker 容器是“模拟一个应用的运行环境”,两者的定位不同,适用场景也不同。在实际开发中,通常会结合两者的优势,比如用虚拟机提供底层环境,用 Docker 容器部署应用。
二、Docker 核心概念:吃透这5个概念,入门就成功了一半
Docker 有5个核心概念,分别是:镜像(Image)、容器(Container)、仓库(Repository)、Dockerfile、Docker Compose。这5个概念是理解 Docker 工作流程的关键,下面逐一详细讲解,并搭配代码示例,帮助大家快速掌握。
2.1 镜像(Image):容器的“模板”
2.1.1 镜像的定义
镜像(Image)是 Docker 中最基础的概念,它是一个只读的模板,包含了运行应用程序所需的所有文件、依赖项、配置信息和操作系统内核。可以把镜像理解为“容器的模板”,一个镜像可以创建多个容器,就像一个类可以实例化多个对象一样。例如,一个 Nginx 镜像,就包含了 Nginx 服务器的安装文件、配置文件、依赖的库文件等,通过这个镜像,我们可以快速创建多个 Nginx 容器,每个容器都是独立运行的 Nginx 服务。
2.1.2 镜像的核心特性
只读性
:镜像一旦创建,就无法修改,只能通过创建新的镜像来实现更新。
分层存储
:Docker 镜像采用分层存储技术,每一层都是一个独立的文件系统,层与层之间相互依赖。这种分层结构可以实现镜像的复用,减少存储空间的占用。例如,多个镜像可能共享同一个基础层(如 Ubuntu 系统层),只需要存储一次基础层,就能被多个镜像复用。
可继承性
:可以基于一个已有的镜像,通过添加新的层,创建一个新的镜像。例如,基于 Ubuntu 镜像,安装 Python 环境,就能创建一个 Python 镜像。
2.1.3 镜像相关常用命令(代码示例)
下面是镜像操作的常用命令,所有命令均在 Linux 终端(或 Windows Docker Desktop 终端)中执行,大家可以直接复制执行,感受镜像的操作流程。
# 1. 拉取镜像(从 Docker Hub 拉取官方镜像)
# 拉取最新版 Nginx 镜像
docker pull nginx:latest
# 拉取指定版本的 Nginx 镜像(如 1.24.0)
docker pull nginx:1.24.0
# 2. 查看本地所有镜像
docker images
# 输出示例:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# nginx latest 605c77e624dd 2 weeks ago 142MB
# nginx 1.24.0 08393e824c32 2 months ago 141MB
# 3. 查看镜像详细信息
docker inspect nginx:latest
# 4. 给镜像打标签(便于区分镜像版本)
docker tag nginx:latest my-nginx:v1.0
# 5. 删除本地镜像
# 删除指定标签的镜像
docker rmi nginx:1.24.0
# 强制删除镜像(如果镜像已被容器使用)
docker rmi -f nginx:latest
# 6. 保存镜像为本地文件(便于迁移)
docker save -o nginx.tar nginx:latest
# 7. 加载本地镜像文件
docker load -i nginx.tar
复制代码
说明:Docker Hub 是 Docker 官方的镜像仓库,包含了大量官方和第三方的镜像,我们可以通过 docker pull 命令直接拉取镜像,无需自己手动构建。
2.2 容器(Container):镜像的“实例”
2.2.1 容器的定义
容器(Container)是基于镜像创建的可运行实例,是 Docker 中用于运行应用程序的载体。如果说镜像是“模板”,那么容器就是“模板实例化后的对象”,它可以被启动、停止、重启、删除,并且容器之间相互隔离,拥有独立的运行环境。容器与镜像的关系,就像进程与程序的关系:程序是静态的代码和资源,进程是程序的运行实例;镜像也是静态的模板,容器是镜像的运行实例。
2.2.2 容器的核心特性
可运行性
:容器是基于镜像创建的,包含了应用程序的运行环境,能够直接启动并运行应用。
可写性
:容器在运行过程中,会在镜像的只读层之上添加一个可写层,所有对容器的修改(如创建文件、修改配置)都会保存在这个可写层中,不会影响原始镜像。
隔离性
:每个容器都有自己独立的网络、进程、文件系统,与其他容器和宿主机隔离,避免相互干扰。
轻量级
:容器共享宿主机内核,不需要占用独立的操作系统资源,启动速度快,资源占用少。
2.2.3 容器相关常用命令(代码示例)
容器的操作是 Docker 日常使用中最频繁的,下面的命令涵盖了容器的创建、启动、停止、删除、进入等常用操作,建议大家实际操作一遍,加深理解。
# 1. 基于镜像创建并启动容器
# 格式:docker run [选项] 镜像名:标签 [容器内执行的命令]
# 示例1:启动 Nginx 容器,后台运行,映射宿主机80端口到容器80端口
docker run -d -p 80:80 --name my-nginx nginx:latest
# 选项说明:
# -d:后台运行容器(守护进程模式)
# -p 80:80:将宿主机的80端口映射到容器的80端口(宿主机端口:容器端口)
# --name my-nginx:给容器命名为 my-nginx,便于后续操作
# 示例2:启动 Ubuntu 容器,进入交互模式(可以在容器内执行命令)
docker run -it --name my-ubuntu ubuntu:latest /bin/bash
# 选项说明:
# -it:交互模式(-i 保持标准输入打开,-t 分配伪终端)
# /bin/bash:容器启动后执行的命令,进入 bash 终端
# 2. 查看正在运行的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 3. 启动、停止、重启容器
# 启动已停止的容器
docker start my-nginx
# 停止正在运行的容器
docker stop my-nginx
# 重启容器
docker restart my-nginx
# 4. 进入正在运行的容器(交互模式)
# 方法1:exec 命令(推荐,不会影响容器的运行状态)
docker exec -it my-nginx /bin/bash
# 方法2:attach 命令(进入容器后,退出会导致容器停止)
docker attach my-nginx
# 5. 查看容器日志(用于排查问题)
docker logs my-nginx
# 实时查看日志(类似 tail -f)
docker logs -f my-nginx
# 6. 查看容器详细信息
docker inspect my-nginx
# 7. 删除容器(需先停止容器,或强制删除)
# 删除已停止的容器
docker rm my-nginx
# 强制删除正在运行的容器
docker rm -f my-nginx
# 8. 容器与宿主机之间复制文件
# 宿主机文件复制到容器内:docker cp 宿主机路径 容器名:容器内路径
docker cp /home/test.txt my-nginx:/usr/share/nginx/html
# 容器内文件复制到宿主机:docker cp 容器名:容器内路径 宿主机路径
docker cp my-nginx:/usr/share/nginx/html/index.html /home
实操验证:执行 docker run -d -p 80:80 --name my-nginx nginx:latest 命令后,打开浏览器,访问 http://localhost,如果能看到 Nginx 的默认欢迎页面,说明容器启动成功,端口映射生效。
复制代码
2.3 仓库(Repository):镜像的“仓库”
2.3.1 仓库的定义
仓库(Repository)是用于存储和管理 Docker 镜像的地方,类似于代码仓库(如 GitHub),我们可以将自己构建的镜像推送到仓库,也可以从仓库拉取别人上传的镜像。仓库分为公有仓库和私有仓库:
公有仓库
:对外开放,所有人都可以拉取镜像,最常用的是 Docker Hub(https://hub.docker.com/),包含了大量官方镜像和第三方镜像。
私有仓库
:仅对特定用户或团队开放,用于存储企业内部的镜像,避免敏感镜像泄露,常用的私有仓库有 Docker Registry、Harbor 等。
2.3.2 仓库相关常用命令(代码示例)
# 1. 登录 Docker Hub(需先注册 Docker Hub 账号)
docker login
# 输入用户名和密码,登录成功后,即可推送镜像到 Docker Hub
# 2. 推送镜像到 Docker Hub(需先给镜像打标签,标签格式:用户名/镜像名:标签)
# 示例:给本地 Nginx 镜像打标签,推送至自己的 Docker Hub 仓库
docker tag nginx:latest your-username/my-nginx:v1.0
docker push your-username/my-nginx:v1.0
# 3. 从 Docker Hub 拉取自己推送的镜像
docker pull your-username/my-nginx:v1.0
# 4. 退出 Docker Hub 登录
docker logout
# 5. 私有仓库相关操作(以 Docker Registry 为例)
# 拉取私有仓库镜像(需先登录私有仓库)
docker login private-registry-url:port
docker pull private-registry-url:port/my-nginx:v1.0
# 推送镜像到私有仓库
docker tag nginx:latest private-registry-url:port/my-nginx:v1.0
docker push private-registry-url:port/my-nginx:v1.0
复制代码
2.4 Dockerfile:构建镜像的“脚本”
2.4.1 Dockerfile 的定义
Dockerfile 是一个文本文件,包含了一系列的指令(Instruction),用于描述如何构建一个 Docker 镜像。通过 Dockerfile,我们可以自定义镜像的内容,比如安装特定的软件、配置环境变量、复制文件等,实现镜像的自动化构建。Dockerfile 的核心作用是“标准化镜像构建流程”,只要有 Dockerfile,任何人都可以按照相同的步骤构建出相同的镜像,避免了手动构建镜像的繁琐和误差。
2.4.2 Dockerfile 常用指令
Dockerfile 中的指令有固定的格式,通常以大写字母开头,后面跟随具体的参数,常用指令如下:
FROM
:指定基础镜像,是 Dockerfile 的第一个指令,用于指定构建镜像的基础模板。例如 FROM ubuntu:latest,表示基于最新版的 Ubuntu 镜像构建新镜像。
WORKDIR
:指定容器运行时的工作目录,后续的指令(如 RUN、COPY)都会在这个目录下执行。例如 WORKDIR /app,表示工作目录为 /app。
COPY
:将宿主机的文件或目录复制到镜像中。例如 COPY ./app.py /app,表示将宿主机当前目录下的 app.py 文件复制到镜像的 /app 目录下。
ADD
:与 COPY 类似,也用于复制文件,但支持解压压缩文件和从 URL 下载文件。例如 ADD ./app.tar.gz /app,表示将宿主机的 app.tar.gz 压缩文件复制到镜像的 /app 目录,并自动解压。
RUN
:在构建镜像时执行命令,用于安装软件、配置环境等。例如 RUN apt update && apt install -y python3,表示更新软件源并安装 Python3。
ENV
:设置环境变量,在镜像构建和容器运行时都生效。例如 ENV PYTHONPATH=/app,表示设置 Python 的环境变量。
EXPOSE
:声明容器运行时监听的端口,只是一个声明,不会自动映射端口,需要在 docker run 时使用 -p 选项进行端口映射。例如 EXPOSE 8080,表示容器监听 8080 端口。
CMD
:指定容器启动时执行的命令,一个 Dockerfile 中只能有一个 CMD 指令,若有多个,只有最后一个生效。例如 CMD ["python3", "app.py"],表示容器启动时执行 python3 app.py 命令。
ENTRYPOINT
:与 CMD 类似,也用于指定容器启动时执行的命令,但 ENTRYPOINT 的命令不会被 docker run 后面的命令覆盖,而 CMD 会被覆盖。例如 ENTRYPOINT ["python3"],如果执行docker run -it my-image app.py,则容器启动时执行 python3 app.py。
2.4.3 Dockerfile 构建镜像示例(代码示例)
下面我们通过一个实际案例,使用 Dockerfile 构建一个 Python 应用镜像,步骤如下:
创建一个工作目录,新建 Dockerfile 文件和 Python 应用文件(app.py)。
编写 Dockerfile 指令,定义镜像的构建流程。
使用 docker build 命令构建镜像。
基于构建好的镜像启动容器,验证应用是否能正常运行。
[code]# 1. 创建工作目录并进入mkdir python-app && cd python-app# 2. 新建 app.py 文件(简单的 Python Web 应用,使用 Flask 框架)cat > app.py Dockerfile docker-compose.yml
Docker
基础
入门
核心
概念
相关帖子
Claude Code 创始人亲授的 10 条核心玩法(建议收藏)
鸿蒙应用开发UI基础第十三节:RelativeContainer相对布局优势与实战演示
[vue3入门]HTML Learn Data Day 7
鸿蒙应用开发UI基础第十四节:文本显示组件Text核心讲解与实战演示
鸿蒙应用开发UI基础第十五节:文本输入组件核心讲解与实战
ML.NET 快速入门与实践教程:开源机器学习框架
MyBatis-mybatis入门与增删改查
MAF快速入门(18)Agent Skill 快速开始
7 道 RAG 基础概念知识点/面试题总结
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
Claude Code 创始人亲授的 10 条核心玩法(建议收藏)
0
197
孔季雅
2026-02-28
业界
鸿蒙应用开发UI基础第十三节:RelativeContainer相对布局优势与实战演示
1
671
幌斛者
2026-02-28
业界
[vue3入门]HTML Learn Data Day 7
0
214
裸历
2026-03-01
业界
鸿蒙应用开发UI基础第十四节:文本显示组件Text核心讲解与实战演示
0
429
灼巾
2026-03-02
业界
鸿蒙应用开发UI基础第十五节:文本输入组件核心讲解与实战
0
986
赖珊
2026-03-02
业界
ML.NET 快速入门与实践教程:开源机器学习框架
0
707
班闵雨
2026-03-02
业界
MyBatis-mybatis入门与增删改查
0
712
窝酴
2026-03-02
业界
MAF快速入门(18)Agent Skill 快速开始
0
359
戈森莉
2026-03-02
业界
7 道 RAG 基础概念知识点/面试题总结
0
782
碛物
2026-03-02
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
科技
签约作者
程序园优秀签约作者
发帖
褥师此
昨天 17:50
关注
0
粉丝关注
19
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991125
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
宋子
9888
6
韶又彤
9910
7
闰咄阅
9993
8
刎唇
9995
9
蓬森莉
9873
10
遗憩
10006
查看更多
今日好文热榜
556
虚拟线程深度解析:轻量并发编程的未来趋势
772
程序员必读的AI Prompt最佳实践
981
为什么我拖了一个多月才开始使用OpenClaw?
407
【节点】[FresnelEquation节点]原理解析与
929
ManimCE v0.20.1 发布:LaTeX 渲染修复与动
274
安心存取,轻松分享!一款基于 CloudFlare
490
收藏! 2026最强开源AI编程工具清单:从代码
975
非统一内存访问架构NUMA的是是非非
324
C#/.NET/.NET Core技术前沿周刊 | 第 67 期
378
Oracle数据库被勒索加密一键open工具–OraF
233
嵌入式通用通信帧协议设计
575
打破同源枷锁:深入理解 postMessage 跨域
5
NVIDIA GPU 集合通信库 NCCL 基本概念简述
463
凸优化数学基础笔记(九):最优化问题的要
650
深入浅出:RS-232 和 RS-485 串口通信的区
940
高光谱成像(一)高光谱图像
542
3分钟搞懂深度学习AI:毁掉AI的广播机制陷
245
AI Agent框架探秘:拆解 OpenHands(10)--
427
数据库服务存储引擎
562
当测试自动化率达到80%,测试工程师还剩下