Docker 从零开始:一篇文章带你搞懂容器化技术

一、Docker 是什么?—— 用生活中的例子来理解

1.1 一句话解释

Docker 是一种软件打包和运行技术。它能把一个软件和它所需的所有环境(依赖库、配置文件、系统工具等)打包在一起,形成一个独立的"小盒子",无论放在哪台电脑上都能一模一样地运行。

1.2 三个核心概念

Docker 的世界只需要理解三样东西:

概念生活类比解释
镜像 (Image)蛋糕模具 / 压缩包一个"模板",包含了运行软件所需的一切。可以复制、分享给别人
容器 (Container)用模具做出的蛋糕 / 解压出来的文件基于镜像创建的、实际运行的软件实例。一个镜像可以创建多个容器
仓库 (Registry)应用商店存放和分享镜像的地方。Docker Hub 是官方的公共仓库

💡 打个比方:你在网上下载了一个游戏安装包(镜像),安装后运行起来就是一个游戏程序(容器),而下载游戏的那个网站就是仓库。

1.3 容器 vs 虚拟机 —— 为什么 Docker 更好?

你可能听说过"虚拟机",Docker 容器跟虚拟机的目标类似(都是隔离运行环境),但实现方式完全不同:

对比项虚拟机Docker 容器
系统内核每个虚拟机都有完整的操作系统所有容器共享宿主机的系统内核
体积很大(几个 GB)很小(通常几十 MB)
启动速度慢(分钟级)极快(秒级)
资源消耗

🎯 核心区别:虚拟机是"每人一栋房子",Docker 容器是"合租一栋楼里的独立房间"——共用地基和楼体(系统内核),但各自空间完全隔离。


二、Docker 的技术原理 —— 它是怎么做到隔离的?

Docker 依赖 Linux 系统的两大原生功能实现容器化:

Docker 容器

Cgroups
── 资源限制 ──
限制 CPU、内存、
网络带宽等使用上限

Namespaces
── 视图隔离 ──
让容器只看到自己的
进程、网络、文件

  • Cgroups(控制组):给每个容器设定资源"配额"。比如限定某个容器最多只能用 2GB 内存,防止一个容器吃光所有资源。
  • Namespaces(命名空间):让每个容器"以为"自己是独占一台电脑。容器看到的进程列表、网络、文件系统都是隔离的。

📌 本质:Docker 容器其实就是宿主机上一个特殊的进程。但通过以上两项技术,进入容器内部后,看起来就像一个独立的操作系统。


三、Docker 安装指南

Docker 本质上是基于 Linux 的技术。在 Windows 和 Mac 上,Docker 会通过虚拟化一个 Linux 子系统来运行。Linux 系统是最佳的 Docker 运行环境。

3.1 各平台安装方式

🐧 Linux 系统
# 方法一:使用官方脚本(推荐)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 方法二:通过包管理器
# RedHat / CentOS:
yum install docker
# Alpine:
apk add docker

⚠️ 非 root 用户需要在所有 docker 命令前加 sudo

🪟 Windows 系统
  1. 启用 Windows 功能:勾选"Virtual Machine Platform"和"适用于 Linux 的 Windows 子系统"

  2. 重启电脑

  3. 安装 WSL2(管理员打开命令提示符):

    wsl --set-default-version 2
    wsl --update --web-download
    
  4. 下载安装 Docker Desktop(从官网下载 AMD64 版本)

  5. 验证安装

    docker --version
    # 输出示例:Docker version 28.3.3, build 980b856
    

⚠️ 使用过程中必须保持 Docker Desktop 处于运行状态,否则命令会报错。

🍎 Mac 系统

根据芯片类型(Intel 或 Apple Silicon)从官网下载对应的 Docker Desktop 安装包即可。

💡 虽然 Docker Desktop 提供了可视化界面,但命令行在各操作系统上通用,因此掌握命令行是最重要的。


四、Docker 镜像管理

镜像是 Docker 的"原材料",必须先有镜像才能创建容器。

4.1 镜像名称的完整结构

一个镜像的完整地址由 4 部分组成:

docker.io / library / nginx : latest
───┬────   ──┬────   ──┬──   ──┬───
 仓库地址    命名空间   镜像名    版本标签
(官方可省略) (官方可省略)         (latest可省略)

所以 docker pull docker.io/library/nginx:latest 可以简写为 docker pull nginx

仓库 vs 镜像库:整个 Docker Hub 网站是一个 Registry(注册表/仓库),而 docker.io/library/nginx 是一个 Repository(镜像库),存放 nginx 镜像的所有版本。

4.2 常用镜像命令

# 📥 下载镜像
docker pull nginx                          # 下载官方最新版 Nginx
docker pull docker.n8n.io/n8nio/n8n        # 从私有仓库下载

# 📋 查看本地所有镜像
docker images

# 🗑️ 删除镜像
docker rmi nginx                           # 按名称删除
docker rmi <镜像ID>                         # 按 ID 删除

# 🏗️ 拉取指定 CPU 架构的镜像
docker pull --platform=arm64 nginx

4.3 国内镜像源配置

国内网络下载 Docker 镜像可能失败,可以配置镜像加速站:

  • Linux:修改 /etc/docker/daemon.json,添加镜像源后重启 Docker 服务
  • Windows/Mac:在 Docker Desktop → Settings → Docker Engine 中配置
{
  "registry-mirrors": ["https://docker.1ms.run"]
}

4.4 CPU 架构注意事项

  • Docker 默认自动选择匹配当前 CPU 架构的镜像
  • Mac M 系列芯片(ARM64)运行 AMD64 镜像时,会通过 QEMU 模拟,可能有兼容性问题和性能损耗
  • 部分低功耗设备(如香橙派)使用 ARM64 架构,需确认镜像是否支持

五、Docker 容器管理 —— 最核心的部分

5.1 docker run —— 最重要的命令

docker run 用来创建并运行一个容器。如果本地没有对应镜像,会自动先拉取。

在这里插入图片描述

5.2 docker run 的常用参数速查表

以下是 docker run 最常用的参数,用一个完整示例来展示:

docker run -d \                     # 后台运行,不阻塞终端
  --name my_nginx \                 # 给容器起个名字
  -p 8080:80 \                      # 端口映射:宿主机 8080 → 容器 80
  -v /my/html:/usr/share/nginx/html \ # 目录映射:持久化数据
  -e MY_VAR=hello \                 # 传递环境变量
  --restart unless-stopped \        # 异常停止时自动重启
  nginx                             # 使用的镜像
参数作用详细说明
-d后台运行不占用当前终端,只返回容器 ID
--name自定义名称给容器起个好记的名字,名称在宿主机上必须唯一
-p 宿主机端口:容器端口端口映射容器网络默认隔离,必须映射端口才能从外部访问
-v 宿主机目录:容器目录目录映射实现数据持久化,容器删除后数据仍保留在宿主机上
-e KEY=VALUE环境变量常用于传数据库密码等配置信息
-it交互式终端进入容器内部的命令行,用于调试
--rm退出后自动删除常与 -it 配合用于临时调试
--restart重启策略always=始终重启;unless-stopped=手动停止的不重启

5.3 端口映射详解

容器的网络和宿主机是隔离的,就像两个不同的房间。端口映射就是在两个房间之间开一扇"门":

在这里插入图片描述

语法:-p 宿主机端口:容器端口先外后内

5.4 数据持久化 —— 挂载卷

容器删除后,容器内的数据会全部丢失!挂载卷就是把容器内的文件夹"连接"到宿主机,数据保存在宿主机上,即使容器被删了,数据还在。

Docker 提供两种挂载方式:

类型语法特点
绑定挂载-v /宿主机路径:/容器路径直接指定宿主机目录。⚠️ 宿主机内容会覆盖容器内原有内容
命名卷-v 卷名:/容器路径Docker 自动管理存储位置。首次使用时会从容器同步初始文件

在这里插入图片描述

卷管理命令
docker volume create my_volume      # 创建命名卷
docker volume ls                    # 查看所有卷
docker volume inspect my_volume     # 查看卷的详细信息(包括真实存储路径)
docker volume rm my_volume          # 删除卷
docker volume prune                 # 删除所有未使用的卷

5.5 容器的启停与生命周期管理

# 📋 查看容器
docker ps                  # 查看正在运行的容器
docker ps -a               # 查看所有容器(包括已停止的)

# ⏹️ 停止 / ▶️ 启动
docker stop <容器ID或名称>   # 停止容器
docker start <容器ID或名称>  # 重新启动(保留之前所有配置参数)

# 🗑️ 删除容器
docker rm <容器ID或名称>     # 删除已停止的容器
docker rm -f <容器ID或名称>  # 强制删除运行中的容器

# 🔍 查看详细信息
docker inspect <容器ID或名称> # 输出 JSON 格式的完整配置信息

# 🆕 仅创建不启动
docker create nginx         # 创建容器但不运行

💡 用 stop / start 启停容器时,之前设置的端口映射、挂载卷、环境变量等全部自动保留,不需要重新设置。

5.6 进入容器内部与调试

# 进入正在运行的容器内部(获得交互式命令行)
docker exec -it <容器ID或名称> /bin/bash    # 或 /bin/sh

# 在容器外部执行容器内部的命令
docker exec my_nginx ps -ef               # 查看容器内进程

# 查看容器日志
docker logs <容器ID或名称>                  # 查看全部日志
docker logs -f <容器ID或名称>               # 实时滚动查看日志

⚠️ 容器内部是一个极简操作系统,很多工具(如 vim)默认不存在,需要手动安装(如 apt update && apt install vim)。


六、Dockerfile —— 制作你自己的镜像

Dockerfile 是一个文本文件,记录了如何一步步构建一个镜像,就像一份"镜像制作说明书"。

6.1 Dockerfile 常用指令

指令作用注意事项
FROM选择基础镜像必须是 Dockerfile 的第一行
WORKDIR设置工作目录后续所有操作都在此目录下执行
COPY复制文件到镜像内第一个参数是宿主机路径,第二个是镜像内路径
RUN构建时执行命令常用于安装依赖,如 pip installnpm install
EXPOSE声明服务端口仅为声明,实际映射仍需 -p 参数
CMD容器启动命令一个 Dockerfile 只能有一个 CMD
ENTRYPOINT入口命令优先级高于 CMD,不容易被覆盖

6.2 完整实战示例

假设我们有一个 Python Web 项目:

项目结构:

my_project/
├── Dockerfile
├── main.py
└── requirements.txt

Dockerfile:

FROM python:3.13-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python3", "main.py"]

构建并运行:

# 构建镜像(-t 指定名称,. 表示当前目录)
docker build -t my_app .

# 运行容器
docker run -d -p 8000:8000 my_app

# 测试访问
curl http://127.0.0.1:8000
# 返回:{"hello":"dbkuaizi"}  ✅

6.3 推送镜像到 Docker Hub

把你做好的镜像分享给全世界:

# 1. 登录 Docker Hub
docker login

# 2. 给镜像打标签(必须包含你的用户名作为命名空间)
docker tag my_app your_username/my_app:v1.0

# 3. 推送
docker push your_username/my_app:v1.0

# 🎉 全世界都可以通过 docker pull your_username/my_app:v1.0 下载使用了!

七、Docker 网络 —— 容器之间怎么通信?

Docker 提供了三种网络模式:

7.1 三种网络模式对比

模式特点使用场景
Bridge(默认)容器有独立内部 IP(172.17.x.x),通过端口映射对外通信大多数场景
Host容器直接共享宿主机网络,无需端口映射需要高网络性能或解决复杂网络问题
None完全断网安全隔离场景

7.2 自定义子网 —— 容器间用名字访问

默认的 Bridge 网络下,容器之间只能用 IP 互访。创建自定义子网后,同一子网内的容器可以直接用容器名称互相访问(Docker 内置 DNS 能力):

# 创建子网
docker network create my_network

# 启动容器并加入子网
docker run -d --network my_network --name web nginx
docker run -d --network my_network --name db mongo

# 此时 web 容器内可以直接用 "db" 作为主机名访问 mongo
# 不同子网之间默认互相隔离

7.3 网络管理命令

docker network ls                   # 查看所有网络
docker network create my_network    # 创建自定义网络
docker network rm my_network        # 删除网络(默认的 bridge/host/none 不可删除)

八、Docker Compose —— 一键管理多个容器

8.1 为什么需要 Docker Compose?

一个真实的应用通常由多个部分组成(前端 + 后端 + 数据库)。每个部分应该单独容器化,但这带来了新问题:

❌ 问题:手动管理多个容器

要执行多次 docker run

要手动配置网络

容易遗漏步骤

其他人部署困难

✅ 解决方案:Docker Compose

一个 YAML 文件定义所有容器

自动创建共享网络

一条命令启动全部

任何人都能一键部署

8.2 Compose 文件结构 —— 对照 docker run 理解

Docker Compose 本质上就是把多个 docker run 命令写进一个 YAML 文件

docker run 命令                    →    docker-compose.yml 对应写法
─────────────────────────────────      ─────────────────────────────
--name my_mongodb                 →    services 下的服务名
-e MONGO_INITDB_ROOT_USERNAME=xx  →    environment:
-v /data:/data/db                 →    volumes:
-p 8080:80                        →    ports:
(手动创建子网 + --network)        →    自动创建,无需配置
(无对应功能)                     →    depends_on: (控制启动顺序)

8.3 完整示例:MongoDB + 管理界面

services:
  my_mongodb:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: name
      MONGO_INITDB_ROOT_PASSWORD: pass
    volumes:
      - /my/datadir:/data/db

  my_mongodb_express:
    image: mongo-express
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_SERVER: my_mongodb
      ME_CONFIG_MONGODB_ADMINUSERNAME: name
      ME_CONFIG_MONGODB_ADMINPASSWORD: pass
    depends_on:
      - my_mongodb

💡 亮点:同一个 Compose 文件中的所有容器自动加入同一个子网,可以直接用服务名访问(如 my_mongodb),无需手动配置网络。

8.4 Compose 常用命令

# 🚀 启动所有服务(后台运行)
docker compose up -d

# ⏹️ 停止并删除所有容器和网络
docker compose down

# ⏸️ 仅停止(不删除容器)
docker compose stop

# ▶️ 重新启动已停止的服务
docker compose start

# 📄 指定非默认文件名
docker compose -f custom.yml up -d

📌 执行 docker compose up 时,默认查找当前目录下的 docker-compose.yamlcompose.yaml 文件。

8.5 Docker Compose vs Kubernetes

Docker ComposeKubernetes (K8s)
定位个人/小团队、单机部署企业级、大规模集群
复杂度简单易学功能强大但复杂
适用场景开发测试、轻量级生产大规模生产环境

九、Docker 命令速查表

镜像相关

命令作用
docker pull <镜像>下载镜像
docker images查看本地镜像
docker rmi <镜像>删除镜像
docker build -t <名称> .构建镜像
docker tag <源> <目标>重命名/打标签
docker push <镜像>推送到仓库

容器相关

命令作用
docker run [选项] <镜像>创建并运行容器
docker ps / docker ps -a查看运行中/所有容器
docker stop <容器>停止容器
docker start <容器>启动容器
docker rm <容器>删除容器
docker logs [-f] <容器>查看容器日志
docker exec -it <容器> bash进入容器内部
docker inspect <容器>查看详细信息

卷与网络

命令作用
docker volume create/ls/rm/prune卷的创建/查看/删除/清理
docker network create/ls/rm网络的创建/查看/删除

Docker Compose

命令作用
docker compose up -d后台启动所有服务
docker compose down停止并删除所有服务
docker compose stop/start停止/启动服务

十、总结

🎯 核心要点回顾

  1. Docker = 轻量级容器化技术:比虚拟机更快、更小、更高效
  2. 镜像是模板,容器是实例:一个镜像可以创建无数个容器
  3. docker run 是最重要的命令:掌握 -d-p-v-e 四个核心参数
  4. 数据持久化靠挂载卷:绑定挂载或命名卷,确保容器删除后数据不丢失
  5. Dockerfile 定义镜像构建流程:FROM → WORKDIR → COPY → RUN → EXPOSE → CMD
  6. Docker 网络有三种模式:Bridge(默认)、Host、None;自定义子网支持容器名互访
  7. Docker Compose 管理多容器:一个 YAML 文件,一条命令,搞定整个应用栈
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值