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。
避坑指南:我曾经把 COPY 和 ADD 搞混了。ADD 可以自动解压 tar 文件,但 COPY 更纯粹、更安全。我建议你一律用 COPY,除非你真的需要解压功能。
3.4 知识体系总览
说了这么多,咱们用一张图来总结一下 Docker 的核心流程。从拉取镜像到构建、运行、管理,每一步都很清晰。
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 就轻松多了。