Docker 入门第一阶段:建立正确认知与初体验

Docker 入门第一阶段:建立正确认知与初体验

系列:Docker 从零到实战

阶段:第一阶段(基础概念)

预计学习时间:1~2 天

更新时间:2026 年 7 月


写在前面

如果你已经按照上一篇教程在 Windows 11 或 Linux 上装好了 Docker,并配置好了国内镜像加速,那么恭喜你------你已经完成了 Docker 学习路线中最重要的 第 0 步

接下来,不要急着写 Dockerfile,也不要一上来就研究 Kubernetes。第一阶段的目标很简单:

建立正确的概念认知,并完成你的第一次容器运行。

学完本文,你将能够:

  • 说清楚 Docker 是什么、解决什么问题
  • 区分镜像、容器、仓库等核心概念
  • 独立运行、查看、停止、删除一个容器
  • 理解 docker run 中最常见的几个参数

目录

  • [1. Docker 是什么](#1. Docker 是什么)
  • [2. 五个核心概念](#2. 五个核心概念)
  • [3. 环境检查](#3. 环境检查)
  • [4. 第一次运行容器](#4. 第一次运行容器)
  • [5. 常用命令速览](#5. 常用命令速览)
  • [6. 动手练习](#6. 动手练习)
  • [7. 阶段小结与自测](#7. 阶段小结与自测)
  • [8. 下一步学什么](#8. 下一步学什么)

1. Docker 是什么

1.1 一句话解释

Docker 是一种容器技术,让你把应用和它的依赖打包在一起,在任何地方都能一致地运行。

1.2 它解决什么问题

在传统部署中,我们经常遇到这类烦恼:

场景 典型吐槽
新同事入职 「我电脑上跑不起来,你那边是好的啊?」
测试通过、上线报错 「我机器上明明没问题!」
环境搭建 「装 MySQL、Redis、Node、Nginx 花了一上午」
版本冲突 「这个项目要 Python 3.8,那个项目要 3.12」

Docker 的核心价值就是:一次打包,到处运行

你把应用和运行时、依赖、配置一起打成镜像(Image),然后在任何装了 Docker 的机器上启动容器(Container),环境保持一致。

1.3 容器 vs 虚拟机

初学者常把 Docker 和虚拟机混淆,可以用这张表来区分:

对比项 虚拟机(VM) Docker 容器
启动速度 慢(分钟级) 快(秒级)
资源占用 重(每个 VM 要完整操作系统) 轻(共享宿主机内核)
隔离级别 强(硬件级虚拟化) 进程级隔离
典型用途 运行完整操作系统 运行单个应用或服务

可以把这个比喻记在心里:

  • 虚拟机 = 一栋楼里的一套独立公寓(有自己的厨房、卫生间)
  • 容器 = 公寓里的一个房间(共享大楼基础设施,但各自独立)

2. 五个核心概念

第一阶段,只需要牢牢记住下面 5 个词。

2.1 镜像(Image)

镜像是只读模板,里面打包了运行应用所需的一切:代码、运行时、依赖库、环境变量、配置文件。

类比理解:

  • 镜像 ≈ 安装光盘 / 系统镜像文件
  • 例如:nginxredisnode:20ubuntu:22.04 都是镜像名

特点:

  • 只读,不能直接修改
  • 可以基于已有镜像叠加出新镜像(后续 Dockerfile 阶段会学)
  • 存储在本地或远程仓库中

2.2 容器(Container)

容器是镜像运行起来的实例

类比理解:

  • 容器 ≈ 正在运行的程序
  • 同一个镜像可以启动多个容器,彼此独立

特点:

  • 可读可写(容器层)
  • 有独立的生命周期:创建 → 运行 → 停止 → 删除
  • 删除容器后,如果没有做数据持久化,容器内的修改会丢失

一句话区分:镜像是模板,容器是实例。

2.3 仓库(Registry)

仓库是存放和分发镜像的地方。

最常见的公共仓库是 Docker Hub,类似「应用商店」。

常用命令:

bash 复制代码
# 从仓库拉取镜像到本地
docker pull nginx

# 把本地镜像推送到仓库(后续阶段再学)
docker push my-image:1.0

国内由于网络原因,通常需要配置镜像加速源(你应该已经配好了)。

2.4 守护进程(Daemon)

Docker 守护进程是真正干活的后台服务,负责:

  • 管理镜像
  • 创建和运行容器
  • 处理网络、存储等底层工作

你执行 docker run 时,客户端把命令发给守护进程,由它来实际操作。

如果守护进程没启动,你会看到这类报错:

复制代码
Cannot connect to the Docker daemon

Windows 11 :确认 Docker Desktop 已启动(任务栏有鲸鱼图标)

Linux :执行 sudo systemctl status docker 检查服务状态

2.5 客户端(CLI)

客户端就是你敲的 docker 命令

bash 复制代码
docker --version    # 查看客户端版本
docker info         # 查看客户端和守护进程信息
docker ps           # 查看运行中的容器

docker 命令本身不直接运行容器,它只是向守护进程发送请求。


3. 环境检查

动手之前,先确认 Docker 环境正常。

3.1 检查版本

bash 复制代码
docker --version
docker compose version

预期输出类似:

复制代码
Docker version 29.x.x, build xxxxx
Docker Compose version v2.x.x

3.2 检查守护进程

bash 复制代码
docker info

正常应能看到 Server VersionStorage DriverRegistry Mirrors 等信息。

如果只看到 Client 信息、Server 部分报错,说明守护进程未运行,先启动 Docker Desktop 或 Linux 上的 docker 服务。

3.3 检查镜像加速(可选)

bash 复制代码
# Windows(PowerShell / Git Bash)
docker info | findstr /i "Registry Mirrors"

# Linux / macOS
docker info | grep -A 5 "Registry Mirrors"

若显示了你配置的国内镜像地址,说明加速已生效。


4. 第一次运行容器

我们来运行一个 Nginx 容器------这是 Docker 学习中最经典的 Hello World 级别练习。

4.1 一条命令跑起来

bash 复制代码
docker run -d -p 8080:80 --name my-nginx nginx

然后打开浏览器访问:

复制代码
http://localhost:8080

看到 「Welcome to nginx!」 页面,说明成功了。

4.2 命令拆解

这条命令信息量很大,逐个拆解:

bash 复制代码
docker run -d -p 8080:80 --name my-nginx nginx
#      │    │   │          │            └── 镜像名(本地没有会自动从仓库拉取)
#      │    │   │          └── 给容器取个名字,方便后续操作
#      │    │   └── 端口映射:宿主机 8080 → 容器 80
#      │    └── 后台运行(detached),不占用当前终端
#      └── 基于镜像创建并启动一个容器
-d(后台运行)

不加 -d 时,容器会占用当前终端,Ctrl+C 可能导致容器停止。

-d 后容器在后台运行,终端可以继续使用。

-p 8080:80(端口映射)

格式:-p 宿主机端口:容器端口

  • 容器内的 Nginx 监听 80 端口
  • 你通过宿主机的 8080 端口访问
  • 访问 localhost:8080 就等于访问容器内的 80
--name my-nginx(容器名称)

不写 --name 时,Docker 会随机生成一个名字(如 fervent_euler)。

自定义名字后,后续操作更直观:

bash 复制代码
docker stop my-nginx    # 用名字操作
docker logs my-nginx    # 比记容器 ID 方便
nginx(镜像名)
  • 本地有 nginx 镜像 → 直接用来创建容器
  • 本地没有 → 自动执行 docker pull nginx 拉取后再创建

5. 常用命令速览

第一阶段掌握下面这组命令就够了。

5.1 镜像相关

bash 复制代码
# 查看本地已有镜像
docker images

# 从仓库拉取指定镜像
docker pull nginx
docker pull redis:7

# 删除本地镜像
docker rmi nginx

5.2 容器生命周期

bash 复制代码
# 查看正在运行的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 停止容器
docker stop my-nginx

# 启动已停止的容器
docker start my-nginx

# 重启容器
docker restart my-nginx

# 删除容器(须先停止)
docker rm my-nginx

# 强制删除运行中的容器
docker rm -f my-nginx

5.3 查看信息与调试

bash 复制代码
# 查看容器日志
docker logs my-nginx

# 实时跟踪日志(类似 tail -f)
docker logs -f my-nginx

# 查看容器详细信息
docker inspect my-nginx

# 查看容器资源占用
docker stats

5.4 进入容器

bash 复制代码
# 进入正在运行的容器(交互式终端)
docker exec -it my-nginx bash

进入后可以执行:

bash 复制代码
cat /etc/nginx/nginx.conf   # 查看 Nginx 配置
exit                        # 退出容器(不会停止容器)

6. 动手练习

建议按顺序完成以下 3 个练习,每个都亲自敲一遍。

练习 1:Nginx 完整生命周期

目标: 跑起来 → 访问 → 看日志 → 停止 → 删除

bash 复制代码
# 1. 启动
docker run -d -p 8080:80 --name my-nginx nginx

# 2. 确认运行中
docker ps

# 3. 浏览器访问 http://localhost:8080

# 4. 查看日志
docker logs my-nginx

# 5. 停止
docker stop my-nginx

# 6. 确认已停止
docker ps -a

# 7. 删除
docker rm my-nginx

思考: 删除容器后,本地的 nginx 镜像还在吗?用 docker images 验证。


练习 2:交互式运行 Ubuntu

目标: 理解 -it 参数,体验「一次性容器」

bash 复制代码
docker run -it ubuntu:22.04 bash

进入容器后试试:

bash 复制代码
cat /etc/os-release    # 查看系统版本
ls /                   # 查看根目录
exit                   # 退出

再用 docker ps -a 查看------这个容器已经退出了(状态为 Exited)。

思考: -it-d 分别适合什么场景?

参数 适用场景
-it 需要进入容器交互操作(调试、临时命令)
-d 服务长期在后台运行(Web 服务、数据库)

练习 3:运行 Redis 并测试连接

目标: 运行一个有名字的服务容器,并进入其中执行命令

bash 复制代码
# 1. 启动 Redis
docker run -d --name my-redis redis:7

# 2. 确认运行
docker ps

# 3. 进入 Redis 容器执行命令
docker exec -it my-redis redis-cli ping

预期输出:

复制代码
PONG

思考: 为什么不需要 -p 端口映射也能 docker exec 进去?

因为 exec 是直接进入容器内部执行命令,不经过宿主机端口。


7. 阶段小结与自测

7.1 本阶段知识脑图

复制代码
Docker 第一阶段
├── 概念
│   ├── 镜像 Image(只读模板)
│   ├── 容器 Container(运行实例)
│   ├── 仓库 Registry(镜像商店)
│   ├── 守护进程 Daemon(后台服务)
│   └── 客户端 CLI(你敲的命令)
├── 核心命令
│   ├── docker run / stop / start / rm
│   ├── docker ps / ps -a
│   ├── docker images / pull / rmi
│   ├── docker logs / exec / inspect
│   └── docker stats
└── 核心参数
    ├── -d   后台运行
    ├── -it  交互式终端
    ├── -p   端口映射
    └── --name  容器命名

7.2 自测清单

学完本阶段,对照以下问题自测。能答上来就可以进入第二阶段。

  • Docker 和虚拟机有什么区别?
  • 镜像和容器的关系是什么?
  • docker run -d -p 8080:80 --name web nginx 每个参数是什么意思?
  • 如何查看正在运行的容器?如何查看包括已停止的所有容器?
  • 如何查看容器日志?
  • 如何进入正在运行的容器?
  • 停止容器和删除容器有什么区别?
  • 删除容器后,镜像还在吗?
  • 遇到 Cannot connect to the Docker daemon 怎么排查?

7.3 常见错误与解决

报错 原因 解决
Cannot connect to the Docker daemon 守护进程未启动 启动 Docker Desktop 或 systemctl start docker
port is already allocated 宿主机端口被占用 换端口,如 -p 8081:80
Conflict. The container name is already in use 容器名重复 换名字或 docker rm 删除旧容器
Unable to find image locally 本地没有该镜像 正常现象,Docker 会自动 pull
pull access denied 镜像不存在或无权限 检查镜像名拼写,或需要 docker login

8. 下一步学什么

完成第一阶段后,进入 第二阶段:掌握日常命令,你将学习:

  • 更多容器管理技巧
  • 环境变量的使用
  • 运行 MySQL 等带配置的服务
  • 镜像标签(tag)与版本管理
  • 更系统的排错方法

第二阶段预习命令:

bash 复制代码
# 带环境变量启动 MySQL
docker run -d \
  --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -p 3306:3306 \
  mysql:8

# 查看容器环境变量
docker inspect my-mysql | grep -i env

附录:第一阶段命令速查卡

bash 复制代码
# ── 环境检查 ──
docker --version
docker info
docker ps

# ── 运行容器 ──
docker run -d -p <宿主机端口>:<容器端口> --name <名称> <镜像>
docker run -it <镜像> bash

# ── 管理容器 ──
docker ps -a
docker stop <名称>
docker start <名称>
docker restart <名称>
docker rm <名称>
docker rm -f <名称>

# ── 镜像管理 ──
docker images
docker pull <镜像>:<标签>
docker rmi <镜像>

# ── 调试 ──
docker logs <名称>
docker logs -f <名称>
docker exec -it <名称> bash
docker inspect <名称>
docker stats

学习建议: Docker 是一门动手实践的技术。每看一个命令,就在终端里敲一遍。遇到报错不要慌,先读错误信息,再对照本文的「常见错误」表排查。

祝学习顺利,第二阶段见!


本文是「Docker 从零到实战」系列的第一篇。环境安装与镜像加速配置请参考同系列前置文章。

相关推荐
qetfw3 小时前
CentOS 7 基础环境配置
linux·运维·centos
jieyucx4 小时前
Docker 入门第二阶段:掌握日常命令
运维·docker·容器
随性而行3604 小时前
微信API接口与AI自动化:开发者的实现思路
运维·服务器·开发语言·人工智能·微信·自动化
有毒的教程4 小时前
Kubernetes进阶实战教程(生产落地完整版)
云原生·容器·kubernetes
鱼听禅5 小时前
Ubuntu学习笔记-安装docker容器
学习·ubuntu·docker
胖兔纸26 小时前
OpenStack 1.7.2 & Ceph 9.2.1 运维命令
运维·ceph·openstack
不会C语言的男孩6 小时前
Docker 在嵌入式设备中的常用玩法
运维·docker·容器
ylscode6 小时前
CVE-2026-31694 漏洞深度分析:Linux 内核 FUSE 组件存在本地提权风险,普通用户可直取 root 权限
linux·运维·服务器
智脑API平台7 小时前
Codex CLI 怎么用 .env 配置 API Key?本地项目和自动化脚本接入教程
运维·自动化