Docker

本文最后更新于 2025年11月3日 上午

学习:

概念

Docker 是一个开源的容器化平台,它允许开发者将应用及其所有依赖(库、配置文件、环境变量等)打包成一个标准化、轻量级、可移植的容器。这个容器可以在任何支持 Docker 的环境中一致地运行。要理解 Docker,必须先理解它的三个核心概念。

镜像

  • 是什么:一个只读的模板或“安装包”,包含了运行应用所需的文件系统结构和内容。
  • 比喻:像是面向对象编程中的“类”或是安装操作系统用的 ISO 文件。定义了容器运行时的样子。
  • 特点:分层存储,每一层都是只读的。

容器

  • 是什么:镜像的一个运行实例。它包含了运行的应用程序及其隔离的运行时环境。
  • 比喻:像是“类”(镜像)实例化出来的“对象”,或是用 ISO 文件安装好并正在运行的操作系统。
  • 特点:容器是可写的,在镜像的只读层之上,有一个专属于该容器的可写层。

仓库

  • 是什么:一个集中存储和分发 Docker 镜像的地方,最著名的是 Docker Hub。
  • 比喻:像是 GitHub(放代码)或 App Store(放应用),只不过这里存放的是 Docker 镜像。
  • 用法:你可以 docker pull 从仓库拉取镜像,也可以 docker push 将自己的镜像推送到仓库。

关系

镜像 –(实例化)–> 容器 | 仓库 <–(上传/下载)–> 镜像

对比

特性

理解 Docker 与传统虚拟机的本质区别,是理解 Docker 为什么“轻量”的关键:

特性 传统虚拟机 Docker 容器
虚拟层次 硬件级虚拟化 操作系统级虚拟化
包含内容 应用 + 依赖库 + 完整操作系统 应用 + 依赖库 + 必要进程
体积 非常庞大(通常 GB 级别) 非常轻量(通常 MB 级别)
启动速度 慢(分钟级) 快(秒级甚至毫秒级)
性能 有损耗,需要通过 Hypervisor 接近原生
隔离性 强(完全隔离) 弱(内核共享,通过 Namespace/Cgroup 隔离)

架构

传统虚拟机架构:

1
2
3
4
5
6
7
8
9
10
11
12
13
+-----------------------------------+
| App A | App B |
+-----------------------------------+
| Guest Operating System A |
+-----------------------------------+
| Guest Operating System B |
+-----------------------------------+
| Hypervisor |
+-----------------------------------+
| Host Operating System |
+-----------------------------------+
| Server Hardware |
+-----------------------------------+

Docker 容器架构:

1
2
3
4
5
6
7
8
9
10
11
+-----------------------------------+
| Container A | Container B |
| (App A + | (App B + |
| Dependencies) | Dependencies)|
+-----------------------------------+
| Docker Engine (守护进程) |
+-----------------------------------+
| Host Operating System |
+-----------------------------------+
| Server Hardware |
+-----------------------------------+

核心区别:Docker 容器共享宿主机的操作系统内核,而不是每个容器自带一个完整的操作系统。这使得它极其高效。

工作流

假设要用 Docker 运行一个 Nginx 网站。

步骤 1:获取镜像

从 Docker Hub 拉取官方的 Nginx 镜像。

1
docker pull nginx:latest

步骤 2:运行容器

基于镜像启动一个容器。

1
2
3
4
# -d: 后台运行
# -p 80:80: 将宿主机的80端口映射到容器的80端口
# --name my-nginx: 给容器起个名字
docker run -d -p 80:80 --name my-nginx nginx

现在访问 http://localhost 就能看到 Nginx 的欢迎页面。

步骤 3:管理容器

查看运行中的容器:

1
docker ps

停止容器:

1
docker stop my-nginx

启动已停止的容器:

1
docker start my-nginx

进入容器内部(就像 SSH 到一台服务器):

1
docker exec -it my-nginx /bin/bash

步骤 4:构建自定义镜像

假设你的网站文件在 ./html 目录下,创建一个 Dockerfile 文件:

1
2
3
4
5
6
# 基于 nginx 镜像
FROM nginx:latest
# 将宿主机的 html 目录复制到容器内的 Nginx 静态文件目录
COPY ./html /usr/share/nginx/html
# 暴露端口(声明性,实际映射在 run 时指定)
EXPOSE 80

构建镜像:

1
docker build -t my-website .

运行自己的网站:

1
docker run -d -p 8080:80 --name my-site my-website

应用场景

  • 环境标准化与一致性

    • 开发者的噩梦:“在我电脑上是好的啊”
    • 解决方案:通过 Dockerfile 定义环境,保证从开发、测试到生产,应用运行的环境完全一致
  • 快速部署与扩展

    • 容器秒级启动,非常适合弹性伸缩和微服务架构
    • 在 Kubernetes 等编排系统中,可以轻松管理成千上万个容器
  • 资源隔离与高效利用

    • 一台物理机可以运行数百个容器,而虚拟机可能只能运行几十个
    • 为每个应用提供独立的文件系统、网络、进程空间
  • DevOps 与 CI/CD

    • 在持续集成/持续部署流程中,Docker 镜像是标准的交付物
    • 构建一次,到处运行

命令

组件/命令 作用
docker run 从镜像创建并启动一个新容器
docker build 根据 Dockerfile 构建镜像
docker pull/push 拉取/推送镜像到仓库
docker ps 列出容器
docker exec 在运行中的容器内执行命令
docker stop/start 停止/启动容器
docker-compose 用于定义和运行多容器应用的工具
Dockerfile 构建镜像的脚本文件
Docker Hub 公共镜像仓库

总结

Docker 本质是一个应用打包、分发和运行的标准化工具。它通过容器技术将应用与其运行环境解耦,从而实现了“一次构建,到处运行”的梦想,极大地提升了软件交付的效率和可靠性。


Docker
https://xuekeven.github.io/2025/11/03/Docker/
作者
Keven
发布于
2025年11月3日
更新于
2025年11月3日
许可协议