3、Docker基础回顾:Docker安装、Dockerfile编写入门、常用Docker命令

说实话,很多刚接触容器化的朋友,一上来就被各种概念搞懵了。什么镜像、容器、仓库,听着就头大。但你别怕,Docker 这东西,说白了就是把你的应用连同它的运行环境一起打包。你想想看,以前部署个 Python 项目,要装 Python、装依赖、配环境变量,折腾半天还可能因为系统版本不一样出问题。有了 Docker,这些烦恼统统消失。

我个人习惯把 Docker 比作一个「轻量级的虚拟机」,但它比虚拟机快得多、小得多。咱们这一章,就带你快速过一遍 Docker 的核心操作。嗯,都是我在实际项目中天天用的东西。

核心要点:Docker 的核心就三件事——拉镜像、建容器、跑应用。搞懂这三步,你就入门了。

3.1 Docker 安装:别在这步卡住

安装 Docker 其实很简单。我建议你直接用官方脚本,一行命令搞定。我在项目中遇到过不少新手自己下载安装包,结果依赖冲突搞了半天。何必呢?

# 一键安装 Docker(适用于 Ubuntu / CentOS)
curl -fsSL https://get.docker.com | bash

装完之后,记得把当前用户加到 docker 组里。不然每次执行 docker 命令都要加 sudo,很烦人。

sudo usermod -aG docker $USER
# 然后退出终端重新登录,或者执行 newgrp docker

验证一下是否装好了:

docker --version
# 输出类似:Docker version 24.0.7, build afdd53b

小技巧:如果你用的是 Windows 或 macOS,直接装 Docker Desktop 就行。它自带图形界面,对新手很友好。但我个人还是推荐 Linux 环境,毕竟咱们后面要搞 K8s,Linux 是标配。

3.2 常用 Docker 命令:每天都要敲的

Docker 的命令其实不多,常用的就那么几个。我列个表给你,一目了然。

命令 作用 示例
docker pull 从仓库拉取镜像 docker pull nginx:latest
docker build 根据 Dockerfile 构建镜像 docker build -t myapp:v1 .
docker run 启动一个容器 docker run -d -p 8080:80 nginx
docker ps 查看运行中的容器 docker ps -a(查看所有容器)
docker exec 进入容器内部执行命令 docker exec -it mycontainer bash

咱们一个一个来看。

3.2.1 docker pull:拉取镜像

镜像是什么?你可以把它理解成一个「模板」。比如你想跑一个 Nginx 服务,就去 Docker Hub 上拉一个 Nginx 镜像下来。

docker pull nginx:latest
# 或者指定版本,比如 1.25
docker pull nginx:1.25

拉完之后,用 docker images 看看本地有哪些镜像。嗯,这一步很简单,没什么坑。

3.2.2 docker build:构建自己的镜像

这是最核心的一步。你要写一个 Dockerfile,告诉 Docker 怎么打包你的应用。后面我会专门讲 Dockerfile 怎么写,这里先看命令。

# -t 是给镜像打标签,最后的 . 表示当前目录
docker build -t my-vllm-app:v1 .

我曾经犯过一个低级错误:忘了加那个点。结果 Docker 报错说找不到 Dockerfile。你想想看,那个点代表构建上下文,不加它 Docker 不知道去哪儿找文件。

3.2.3 docker run:启动容器

镜像有了,就该跑起来了。docker run 是最常用的命令,参数也最多。

# 启动一个 Nginx 容器,把宿主机 8080 端口映射到容器 80 端口
docker run -d -p 8080:80 --name my-nginx nginx

解释一下参数:

  • -d:后台运行(detach)
  • -p:端口映射,格式是 宿主机端口:容器端口
  • --name:给容器起个名字,方便后面操作

注意:端口映射别搞反了。左边是宿主机,右边是容器。我见过有人写成 -p 80:8080,结果访问 8080 端口死活连不上,排查了半天才发现是映射写反了。

3.2.4 docker ps:查看容器状态

容器跑起来没有?用 docker ps 看一眼。

docker ps        # 只看运行中的
docker ps -a     # 看所有容器,包括已停止的

输出会显示容器 ID、镜像、创建时间、状态、端口映射等信息。如果状态是 Up,说明容器在正常运行。如果是 Exited,那就得查日志了。

3.2.5 docker exec:进入容器内部

有时候你想进容器里看看,比如检查日志、调试代码。这时候就用 docker exec

# 进入容器的 bash 终端
docker exec -it my-nginx bash

# 如果容器里没有 bash,可以用 sh
docker exec -it my-nginx sh

-it 参数的意思是交互式终端。少了它,你进不去交互界面。嗯,这个我刚开始也忘过。

3.3 Dockerfile 编写入门:把你的应用打包

Dockerfile 就是一个文本文件,里面写了一系列指令,告诉 Docker 怎么构建镜像。说白了,就是一份「制作说明书」。

咱们以 vLLM 为例,写一个最简单的 Dockerfile:

# 使用官方 Python 镜像作为基础
FROM python:3.10-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口(只是声明,实际映射靠 -p)
EXPOSE 8000

# 容器启动时执行的命令
CMD ["python", "app.py"]

解释一下每条指令:

  • FROM:指定基础镜像。我建议尽量用 slim 版本,镜像更小,构建更快。
  • WORKDIR:设置工作目录。后续的 COPY、RUN、CMD 都会在这个目录下执行。
  • COPY:把文件从宿主机复制到镜像里。注意,COPY . . 第一个点是宿主机当前目录,第二个点是镜像里的工作目录。
  • RUN:在构建过程中执行命令。比如安装依赖。
  • EXPOSE:声明容器运行时监听的端口。这只是文档性质的,真正映射端口还得靠 -p
  • CMD:容器启动时执行的命令。每个 Dockerfile 只能有一个 CMD。

避坑指南:我曾经把 COPYADD 搞混了。ADD 可以自动解压 tar 文件,但 COPY 更纯粹、更安全。我建议你一律用 COPY,除非你真的需要解压功能。

3.4 知识体系总览

说了这么多,咱们用一张图来总结一下 Docker 的核心流程。从拉取镜像到构建、运行、管理,每一步都很清晰。

Docker 核心工作流程 1. docker pull 从仓库拉取镜像 2. docker build 编写 Dockerfile 构建 3. docker run 启动容器实例 4. 管理 ps/exec 常用命令速查: • docker pull nginx:latest —— 拉取 Nginx 镜像 • docker build -t myapp:v1 . —— 构建镜像 • docker run -d -p 8080:80 nginx —— 启动容器 • docker ps -a —— 查看所有容器 • docker exec -it container_name bash —— 进入容器

3.5 实战:一条龙跑通 vLLM 容器

光说不练假把式。咱们来一个完整的例子,从拉取镜像到运行容器,一气呵成。

# 1. 拉取 vLLM 官方镜像(假设已有)
docker pull vllm/vllm-openai:latest

# 2. 查看本地镜像
docker images

# 3. 启动 vLLM 容器,暴露 8000 端口
docker run -d \
  --name my-vllm \
  -p 8000:8000 \
  --gpus all \
  vllm/vllm-openai:latest \
  --model meta-llama/Llama-2-7b-chat-hf

# 4. 查看容器是否运行
docker ps

# 5. 进入容器内部看看
docker exec -it my-vllm bash

# 6. 退出容器
exit

# 7. 查看容器日志
docker logs my-vllm

注意:如果你没有 GPU,可以把 --gpus all 去掉,但 vLLM 在 CPU 上跑会很慢。嗯,这个咱们后面会专门讲怎么优化。

好了,Docker 基础就这些。你想想看,是不是很简单?拉镜像、写 Dockerfile、构建、运行、管理,就这五步。我在项目中天天跟它们打交道,闭着眼睛都能敲出来。你多练几遍,也能做到。

记住一点:Docker 不是魔法,它只是把你的应用和环境打包成一个「集装箱」。搞懂了这个本质,后面学 K8s 就轻松多了。


专注资料整理