Docker入门:从零开始认识容器

说实话,我第一次接触Docker的时候,心里想的是:这不就是个轻量级虚拟机吗?后来踩了坑才明白——完全不是一回事。Docker的核心价值,用一句话就能讲清楚:把你的应用连同它运行所需的一切环境,打包成一个标准化的单元。

你想想看,我们在开发中碰到最头疼的问题是什么?「在我机器上明明能跑啊!」。Docker就是来解决这个问题的。它让你的应用环境像集装箱一样,从开发、测试到生产,全程一致,不跑偏。

为什么要用Docker?

我自己的项目经验是这样的:以前维护一个微服务集群,每个服务依赖的Python版本、OpenCV版本、系统库都不一样。每次部署,运维小哥都要手动配环境,配完还经常崩。用了Docker之后,所有依赖都锁死在镜像里,问题一下子少了很多。

Docker带来的核心好处,我列了四个:

  • 环境一致:开发环境 = 测试环境 = 生产环境。没有「水土不服」
  • 快速交付:镜像打包好,一条命令就能跑起来,部署速度从小时级降到秒级
  • 资源隔离:每个容器独立运行,互不干扰。一个应用挂了不会拖垮整个系统
  • 轻量高效:共享宿主机内核,启动时间毫秒级,资源占用远低于虚拟机

一句话总结:Docker = 标准化 + 便携 + 环境即代码。它本质上是一个进程级的隔离方案。

Docker架构速览

搞懂Docker,先搞清楚它的三驾马车:镜像、容器、仓库。我画了张图帮你捋捋关系。

Docker 核心架构与工作流程 开发者 Dockerfile (构建说明书) 镜像 (Image) 容器 (Container) 仓库 (Registry) 宿主机操作系统 / 内核 图例说明 角色 配置文件 镜像 运行实例 存储中心 底层系统 流程方向

流程其实是这样的:开发者写Dockerfile -> 构建出镜像 -> 镜像运行时变成容器 -> 容器共享宿主机内核。镜像从仓库拉取或推送,实现分享与复用。

核心概念三连问

1. 镜像(Image)到底是什么?

镜像就是一个只读的模板。它包含了运行应用所需的全部文件:操作系统基础层、代码、运行环境、系统库。你可以把镜像理解成「打包好的操作系统快照」。

我的习惯:基于官方镜像做定制,不要自己从头写。比如用 python:3.9-slim 做基础,再加自己的依赖。这样镜像体积小,还安全。

2. 容器(Container)又是什么?

容器是镜像的运行实例。从这个镜像是「静态的」,容器是「动态的」。同一个镜像你可以启动多个容器,互相不干扰。容器可以被启动、停止、删除,但镜像始终不变。

我打个比方:镜像就像光盘里的ISO文件,容器就是你把光盘放进光驱、开始读盘运行的那个过程。

3. 仓库(Registry)是干啥的?

仓库就是存镜像的地方。Docker Hub 是官方公共仓库,你也可以搭建私有仓库。用 docker pull 拉镜像,用 docker push 推镜像。

概念类比特性
镜像类(Class)只读、可复用、版本化
容器对象实例可写层、运行态、隔离
仓库GitHub(代码仓库)存储、分享、版本控制

安装Docker,三步搞定

我以Ubuntu 22.04为例,我记得以前被官方文档折腾过,后来总结出这套稳的步骤。

避坑指南:我曾经直接用系统自带的 apt install docker.io,结果版本太旧,试了好多功能不支持。最后改成用官方仓库,再也没出过问题。

第一步:卸载旧版本

sudo apt remove docker docker-engine docker.io containerd runc

第二步:设置官方仓库

sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

第三步:安装并验证

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl status docker

如果是macOS或Windows,直接去 Docker Desktop 官网下载安装包。装完后同样验证一下。

Hello World,跟Docker打招呼

装好了?我们跑一个最简单的例子。

docker run hello-world

你会看到这样的输出:

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

嗯,这里要注意:你刚才经历了一次完整的 拉取镜像 -> 创建容器 -> 运行程序 -> 输出结果 的流程。整个过程只花了几秒钟,这就是容器化的威力。

小测试:跑完 docker run hello-world 后,试试 docker images 看看本地多了什么,再试试 docker ps -a 看看那个已经退出的容器。

我常用的几个管理命令

刚开始用Docker,记住这几个就够了:

命令作用我的使用频率
docker images查看本地镜像列表⭐⭐⭐⭐⭐
docker ps查看正在运行的容器⭐⭐⭐⭐⭐
docker ps -a查看所有容器(含已停止的)⭐⭐⭐⭐
docker stop [容器ID]停止容器⭐⭐⭐⭐
docker rm [容器ID]删除容器⭐⭐⭐
docker rmi [镜像ID]删除镜像⭐⭐⭐

我的个人习惯是:每次用 docker run --rm 启动临时运行任务,容器退出后自动清理,不用自己手动删。

快速上手建议:咱们这门课后面会用Docker构建可重复的科学计算环境。你可以先拿一个Python脚本试试——docker run -v $(pwd):/workspace python:3.9-slim python /workspace/your_script.py。这么玩几遍,你就熟悉了。

好,第一章就到这里。你掌握了Docker的核心概念、安装方法,还跑了Hello World。这些是基础,但也是后面所有高级操作的地基。