一句话开篇
在你已经装好的 Ubuntu Server 24.04 LTS 上装 Docker Engine——这是跑 AI 智能体(OpenClaw)的 “docker跨机部署方案” 的关键一步;还不理解docker,没关系!照着命令复制粘贴,20-30 分钟搞定。有关docker慢慢的就懂了。
§1 先聊点基础知识
如果你已经装好 Ubuntu Server 24.04(详见配套教程 👉 《Ubuntu Server 24.04 LTS 装机实战——为 AI 智能体打造 7×24 不间断运行的专属服务器(AI 新手从零起步)),下一步就是装 Docker——这是你 AI 之路的第二步。
装Ubuntu你都搞定了,装 Docker 更简单,看着步骤好像也不少,但你现在已经可以从windows或Mac的电脑SSH到Ubuntu主机上远程操作了,剩下的就基本都是复制粘贴命令,省事!20-30 分钟搞定。我们继续……
啥是 Docker?为啥 AI 工具都用它?
Docker 是一个开源的容器化平台——你可以把它想象成一个超级轻量的虚拟机(就好像在你的物理机电脑上,虚拟出来的小的、系统独立的电脑,而且可以有多个,各自独立运行,你的物理机变成了宿主机,而且基本不会影响你原来物理机的其他使用)。但和虚拟机不同的是,Docker 启动只要 1 秒、占内存只要几十 MB、跑完就能删。最大的优势就是:部署快、安全(与宿主机系统隔离)。
💡 类比 1:虚拟机 = 盖一栋楼(独立的房子 + 独立的水电系统);Docker = 租一间公寓(共享楼的基础设施,房间是独立的)。
类比 2:Docker = 集装箱。货物(应用)放集装箱里,集装箱在船上(服务器)能到处跑,到哪都一模一样。
Docker 能干啥?为啥 AI 都用它?
| 你想做 | 没 Docker | 有 Docker |
|---|---|---|
| 跑 OpenClaw 智能体 | 手动装 Python + Node + 各种依赖,1 小时起步 | docker run 一行搞定,30 秒 |
| 装 Python 包污染系统 | pip install 可能弄坏系统 Python |
Docker 里随便装,删容器就清干净 |
| 装数据库 | 手动配 PostgreSQL、Redis、各种配置 | docker run postgres 一行起服务 |
| 测试新 AI 模型 | 装一堆依赖,删起来麻烦 | 拉镜像 → 跑容器 → 删容器,5 分钟 |
| 部署到服务器 | 不同服务器要重新装环境 | 镜像拷过去就能跑 |
最牛的一点:装一次,到处跑。你在家电脑装的 Docker 应用,到任何有docker的环境(比如:云服务器)一模一样能跑。
Docker vs 虚拟机的 5 个关键区别
| 维度 | 虚拟机 | Docker |
|---|---|---|
| 启动时间 | 30 秒 - 2 分钟 | 1 秒 |
| 内存占用 | 1-2 GB | 几十 MB |
| 磁盘占用 | 10-50 GB | 几百 MB |
| 隔离性 | 强(完全独立 OS) | 中(共享内核) |
| 性能 | 80% 原生 | 100% 原生 |
对新手来说:Docker 比虚拟机轻的多,快多,也简单的多。
为啥 AI 工具都用 Docker?
- OpenClaw 智能体:官方推荐 Docker 部署(详见 👉 《在你自己的服务器上跑你的第一个智能体 OpenClaw——Docker 跨机部署方案》)
- Dify / FastGPT 等 AI 应用:官方只提供 Docker 部署
- 本地大模型(Ollama / LocalAI):Docker 一行起服务
- 向量数据库(Chroma / Milvus):Docker 是事实标准
说白了:没 Docker = 玩 AI 效率低很多。
§2 常见问题速览(5 个最重要)
如果你只有 30 秒,看这 5 个就够了。其他 FAQ 在 §9 汇总。
Q1:Docker 装起来难不难?
答:不难。本文专为新手设计,按照本文顺序,一步一步,照着命令复制粘贴 20-30 分钟搞定,肯定行。万一遇到坑,看 §8 防坑附录。
Q2:装 Docker 会影响我 Ubuntu 里其他东西吗?
答:不会。Docker 是独立的服务,和你的 Ubuntu 系统隔离。用 sudo 命令要小心(千万别瞎跑 sudo rm -rf /,会删除所有)。
Q3:Docker Engine 和 Docker Desktop 啥区别?
答:
- Docker Engine(本文装的):纯命令行版,跑在 Linux 服务器上,本文和 Ubuntu Server 一起用
- Docker Desktop:图形化版,主要给 Mac / Win 用,本文不装它
装 Ubuntu Server = 装 Docker Engine(命令行),不要装 Docker Desktop。
Q4:装完 Docker 一定要用 root 吗?
答:不一定。强烈建议配置非 root 用户(详见 §5.5),不然每次运行docker命令都要加 sudo,如: sudo docker ...,有点烦。
Q5:装 Docker 需要联网吗?
答:需要。Docker 安装包约 100MB,要从 Docker 官方源(或国内镜像)下载。如果断网,预先下载 deb 包(本文不展开这个)。
§3 准备工作
你需要准备什么
| 项 | 要求 | 怎么确认 |
|---|---|---|
| Ubuntu Server 24.04 LTS | 已经装好 | 看 《Ubuntu Server 24.04 LTS 装机实战——为 AI 智能体打造 7×24 不间断运行的专属服务器(AI 新手从零起步) |
| 有 sudo 权限的账号 | 不是 root(root 反而装不上部分包) | whoami 应该返回你的用户名(如我的是 dajun) |
| 另一台同网内的windows或Mac电脑 | 能SSH到Ubuntu主机 | 在windows电脑后Mac电脑的终端上运行 ssh@Ubuntu主机IP进行测试,如:ssh [email protected] |
| 所有设备网络通畅 | 能访问外网或国内镜像源 | ping baidu.com 应该通 |
给你的Ubuntu装 Docker 之前,测试三项网络情况:
🩺 网络预检(装 Docker 前必做!后面非常顺利)
为什么要预检? Docker 安装过程中要从外网拉几百 MB 数据。如果你的网络本身就卡住,跑到一半报错会浪费你 10+ 分钟。所以先花 30 秒在你的Ubuntu server主机上测一下网络。
检查 1:能不能连通互联网(这是基础)
ping -c 3 -W 2 baidu.com
预期输出(看到 3 行 64 bytes from ... = 通):
64 bytes from 110.242.68.66 (baidu.com): icmp_seq=1 ttl=52 time=42.1 ms
64 bytes from 110.242.68.66 (baidu.com): icmp_seq=2 ttl=52 time=41.8 ms
64 bytes from 110.242.68.66 (baidu.com): icmp_seq=3 ttl=52 time=42.3 ms
❌ 如果失败:网络根本不通,先排查网线 / WiFi / 路由器,别继续往下走。
检查 2:能不能访问清华 TUNA Docker 镜像源(关键!)
curl --max-time 10 -I https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/
预期输出(看到 HTTP/2 200 = 通):
HTTP/2 200
server: Tengine
content-type: text/html
...
❌ 如果失败或超时:你网络到清华 TUNA 不通。这种情况(很少):
- 优先:排查你的DNS配置,或换其他镜像源,如 USTC 中科大镜像(路径 B,§5.3 里详细说了)
- 兜底:有条件的用户可使用国际专线或自建代理(本文不讲)
检查 3:能不能访问国内 Docker Hub 镜像(关键!)
curl --max-time 10 -I https://docker.m.daocloud.io
预期输出:看到 HTTP/2 200 或类似成功响应。
❌ 如果失败:你的网络到国内的Docker hub不通。这种情况(也很少) §5.5.3 的镜像加速配了也没用,先排查网络。
兜底:国内除了https://docker.m.daocloud.io(daocloud镜像加速器),基本再没有可用的镜像了。有条件的用户可使用国际专线或自建代理(本文不讲)
三项检查如图:
✅ 三项全通过再继续
| 检查 | 必须通过 | 不通过怎么办 |
|---|---|---|
| ping baidu.com | ✅ | 排查网线 / WiFi / 路由器 |
| 清华 TUNA 通 | ✅ | 换 USTC 或阿里云镜像 |
| daocloud镜像加速器 | ✅ | 排查 DNS / 防火墙 |
💡 这三个检查总共不到 30 秒,但能帮你省掉后续装到一半失败的 10+ 分钟。
docker安装时间预估
| 步骤 | 用时 |
|---|---|
| 卸载旧版本 | 1 分钟 |
| 装依赖包 | 1 分钟 |
| 加 GPG key + 源 | 1 分钟 |
| 安装 Docker | 5-10 分钟(看网速) |
| 验证 + 配置 | 3-5 分钟 |
| 总计 | 20-30 分钟 |
⚠️ 下面所有命令都在 Ubuntu Server 主机的终端执行(不是你的 Windows/Mac 电脑,请从你的Windows/Mac 电脑SSH到你的Ubuntu主机上,如果你不知道怎么远程连,看 Ubuntu 装机教程 §6.4.5 提到的 SSH 教程)。关于SSH,也可以参考《SSH 远程连接 Ubuntu Server 实战——AI 智能体 7×24 在线管理的远程钥匙(AI 新手从零起步)》
§4 关键认知(必看!看不懂也没关系,照着步骤做肯定能行)
这一节先了解 4 个"认知"。
认知 1:Docker 是"客户端-服务端"架构
┌────────────────────────────────┐
│ Docker 客户端(docker 命令) │ ← 你输入 `docker run ...`
└──────────────┬─────────────────┘
│ 通过 socket / REST API 通信
↓
┌────────────────────────────────┐
│ Docker 服务端(dockerd 守护进程)│ ← 真正干活:拉镜像、跑容器
└────────────────────────────────┘
大白话:
- 你输入
docker run nginx→ 客户端把这个命令发给服务端 - 服务端去拉 nginx 镜像 → 启动容器 → 告诉你"好了"
所以:Docker 服务要在后台跑(开机自启),不然命令没法用,一般不用你管,docker安装成功后会自动配置。
认知 2:镜像(Image)vs 容器(Container)
| 镜像(Image) | 容器(Container) | |
|---|---|---|
| 是啥 | 应用的"模板"(只读) | 镜像"运行起来的实例" |
| 类比 | 光盘(ISO) | 电脑里用光盘安装好的软件 |
| 数量 | 可以有很多不同用途的镜像 | 一个镜像可以跑多个容器 |
| 修改 | 改了要重新构建 | 改了不影响镜像 |
大白话:
- 镜像 = 安装包(
.exe/.dmg) - 容器 = 正在运行的程序
认知 3:Docker 用镜像源加速
默认 Docker 源在 docker.io(国外),拉镜像慢得要死或完全拉不了。必须换源(daocloud镜像加速器)。
❌ docker pull nginx # 慢(10 分钟 - 1 小时)或根本拉不到
✅ docker pull nginx # 用 DaoCloud 镜像 = 几秒 - 几十秒
详见 §5.5。
认知 4:Docker 数据默认在容器里(会丢)
容器删了,里面的数据就没了。重要数据必须挂载到主机(持久化):
# -v 左边是主机路径,右边是容器路径
docker run -v /home/dajun/data:/data nginx
详见配套教程(OpenClaw 部署有完整例子)。
§5 开始实操:5 个大步骤
打个比方:装 Docker = 给家里请了个万能管家
- 第一步:先把"老管家"辞掉(卸载旧版)
- 第二步:把"管家的工具箱"买回来(装依赖)
- 第三步:签"管家合同"(加 GPG key + 源)
- 第四步:管家正式上岗(装 Docker Engine)
- 第五步:管家认你当主人(配置非 root 权限 + 换源)
| 管家比喻 | Docker 对应操作 | 本文对应章节 |
|---|---|---|
| 辞老管家 | 卸载旧版本 | §5.1 |
| 买工具箱 | 装依赖包 | §5.2 |
| 签合同 | 加 GPG key + 源 | §5.3 |
| 管家上岗 | 安装 Docker Engine + 查看docker版本 | §5.4 |
| 管家认主 | 配置非 root + 换源 + 验证docker可用 | §5.5 |
完事!Docker 装好了!
§5.1 第一步:卸载旧版本(如有)
如果你之前装过 Docker,先卸掉,避免冲突,如果是从新部署的Ubuntu到这里的,那么没必要搞这个:
# 卸载旧版本(不管有没有,装一下保险)
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt-get remove -y $pkg 2>/dev/null
done
怎么看卸成功:
# 验证没有残留
which docker
# 预期:什么都不输出(说明命令找不到 = 卸干净了)
这一步用时:1 分钟
如图:
§5.2 第二步:装 Docker 依赖包
装一些"工具",让后面能加源、装 GPG key。
sudo apt-get update
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
每个包干啥的:
| 包 | 干啥的 |
|---|---|
ca-certificates |
HTTPS 证书(apt 走 HTTPS) |
curl |
下载工具(拉 GPG key) |
gnupg |
加密签名(验证 Docker 官方签名) |
lsb-release |
看 Ubuntu 版本(识别 codename) |
这一步用时:1 分钟
如图:
§5.3 第三步:添加 Docker 国内镜像源(国内用户必看!)
⚠️ 新手最容易卡的地方
Docker 官方源
download.docker.com在国内经常连不上(被墙或者被网关 RST),直接用官方源走到apt-get update就会卡。所以国内用户要先把源换成国内镜像。下面用清华 TUNA 镜像(国内最稳,速度快),同步附 USTC(中科大)镜像作为备选。
GPG key = Docker 官方给你签的"身份证"。系统用它验证"这个包真的是 Docker 出的,不是别人假冒的"。
路径 A:清华 TUNA 镜像(推荐首选)
# 1. 创建 keyrings 目录
sudo install -m 0755 -d /etc/apt/keyrings
# 2. 下载清华 TUNA 的 Docker GPG key
sudo curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
# 3. 给 key 赋权限(所有用户都能读,但只有 root 能改)
sudo chmod a+r /etc/apt/keyrings/docker.asc
# 4. 添加清华 TUNA 的 Docker 源到 apt 源列表
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 更新 apt 源(让 apt 知道有 Docker 源了)
sudo apt-get update
预期输出(注意 URL 是清华 TUNA 的):
Get:1 https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu noble InRelease [48.8 kB]
Fetched 48.8 kB in 3s (16.3 kB/s)
Reading package lists... Done
✅ 看到
InRelease= 源加成功⚠️ 如果
apt-get update卡住超过 1 分钟:Ctrl+C 中断,跳到下面的"卡死急救"
如图:
如图:
如图:
路径 B:USTC(中科大)镜像(备选,如果清华 TUNA 慢或卡)
把上面第 2 步和第 4 步里的 mirrors.tuna.tsinghua.edu.cn 全部换成 mirrors.ustc.edu.cn/docker-ce,其他步骤完全一样。
❌ 不要做的事
- ❌ 不要混用多个源的 GPG key 和源地址(会签名校验失败)
- ❌ 不要用
download.docker.com官方源(国内直连大概率卡死) - ❌ 不要省略第 3 步 chmod(不设权限 apt 会拒绝使用 key)
这一步用时**:1-3 分钟(取决于网络)
§5.4 第四步:安装 Docker Engine
5.4.1 真正开始装 Docker 了。
sudo apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
每个包干啥:
| 包 | 干啥 |
|---|---|
docker-ce |
Docker 引擎主程序(服务端) |
docker-ce-cli |
Docker 命令行工具(客户端) |
containerd.io |
容器运行时(底层) |
docker-buildx-plugin |
增强构建工具(可选) |
docker-compose-plugin |
Docker Compose(多容器编排) |
预期输出:
...
Setting up docker-ce (5:27.x.x-x) ...
Setting up docker-ce-cli (5:27.x.x-x) ...
...
✅ 看到一堆
Setting up= 装成功
如图:
5.4.2 查看安装的 docker 版本(Docker 安装成功!)
docker --version
# 预期:Docker version 27.x.x, build xxx
如图:
这一步用时:5-10 分钟(看网速)
§5.5 第五步: 配置(非 root 用户 + Docker hub国内镜像源)+ 验证docker可用
5.5.1 配置国内 Docker hub 镜像加速器(强烈推荐!)
⚠️ 重要:本节配的是 Docker Hub 镜像加速器(拉镜像时用),跟 §5.3 配的 apt 源(装 Docker 软件包时用)是两码事。两边都要配才能完全搞定。
⚠️ 目前唯一稳定可用的国内Docker hub源是 DaoCloud。
编辑国内 Docker hub 镜像源的配置文件,将 https://docker.m.daocloud.io(daocloud镜像加速器)写入/etc/docker/daemon.json。
方式一:可以用 nano 编辑器,按顺序执行下面的命令
sudo mkdir -p /etc/docker # 创建配置文件存放的目录
sudo nano /etc/docker/daemon.json # 编辑配置文件,写入下面的内容:
{"registry-mirrors": ["https://docker.m.daocloud.io"]}
按 ctrl+O,再按回车保存,再按 ctrl+X 退出nano编辑器
方式二:直接用命令创建配置文件并写入内容。直接复制下面的命令到SSH后的Ubuntu server的终端里粘贴执行即可,更简单方便。
sudo tee /etc/docker/daemon.json > /dev/null << EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io"
]
}
EOF
# 重启 Docker 服务让配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证镜像源配置
docker info | grep -A 3 "Registry Mirrors"
预期输出:
Registry Mirrors:
https://docker.m.daocloud.io/
✅ 看到镜像源 = 加速配置成功
这一步用时**:1 分钟
5.5.2 验证 docker 可用(拉取第一个docker镜像测试)
hello-world 是一个测试镜像,Docker 自动拉下来跑一遍,验证"从拉镜像到跑容器"全链路通。
hello-world 这个测试镜像实际存在 Docker Hub(境外),国内被网关 RST 了。需要让 Docker 走国内镜像源加速器,刚才已做!
sudo 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.
✅ 看到
Hello from Docker!= Docker 完全跑成功
如图:
5.5.3 配置非 root 用户(可选做,但强烈推荐!)
默认 运行Docker 命令要 sudo,有点烦!加你的用户到 docker 组就不用每次加 sudo 了。
# 1. 创建 docker 用户组(如果不存在)
sudo groupadd docker
# 2. 把当前用户加入 docker 组(把 dajun 换成你的用户名)
sudo usermod -aG docker $USER
# 3. 激活新组(或者重新登录)
newgrp docker
# 4. 验证不用 sudo 也能跑 docker
docker run hello-world
预期:和刚才一样看到 Hello from Docker!,但不用 sudo 了。
⚠️ 如果失败:重启终端或重新登录一次再试。
如图:
这一步用时:3-5 分钟
🎉🎉🎉 到这里,你的docker环境就全部搭好了,可以拉取你想用的任何镜像、并启动相应的容器了
§6 docker常用命令(新手慢慢了解,不必着急,docker的内容非常多)
💡 本节定位:给新手的速查清单,不是完整文档。 想查完整命令请看 官方文档。 下面命令默认在你自己的 Ubuntu 服务器上以普通用户跑(已加 docker 组,免 sudo)。
6.1 镜像相关(images)
docker images — 查看本地所有镜像
docker images
# 等价于 docker image ls
- 功能:列出本地已下载的镜像
- 场景:看看你机器上有啥镜像,验证 pull 是否成功
- 输出列含义:
IMAGE镜像名(如 nginx)ID镜像 ID(短 12 位就能用)DISK USAGE镜像实际占的磁盘空间(含所有层)CONTENT SIZE镜像独有的内容大小(不算和其他镜像共享的层)EXTRA镜像是否正被某个容器使用i Info"i" 是个小提示符号,告诉用户 EXTRA 列里字母含义
💡 新版本 Docker(25+)默认输出 DISK USAGE / CONTENT SIZE / EXTRA 三列,比传统的 REPOSITORY/TAG/SIZE 更适合清理磁盘场景。看不到 REPOSITORY 和 TAG 的列了,想看完整信息用
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}\t{{.Size}}"。
docker pull — 拉镜像
$ docker pull nginx:1.27 #举例拉 nginx 镜像
# 新版默认没进度条,看起来"卡住"但实际在跑
# 想看进度条加 --progress=plain
$ docker pull --progress=plain nginx:1.27
1.27: Pulling from library/nginx
a2abf6c4d29d: Pull complete
b7e6f10bb7b8: Pull complete
...
Digest: sha256:abc123...
Status: Downloaded newer image for nginx:1.27
docker.io/library/nginx:1.27
- 功能:从镜像仓库下载镜像
- 场景:装东西前先 pull
- 坑:不指定 tag 默认是
latest,但latest不保证最新稳定(谁 push 算谁的)
docker rmi — 删镜像
docker rmi nginx:1.27 # 按名字+tag 删
docker rmi 5e2309035332 # 按镜像 ID 删
docker rmi -f nginx:1.27 # 强制删(即使被用着)
- 功能:删除本地镜像
- 场景:磁盘满 / 镜像版本太多
- 坑:
docker rm删容器,docker rmi删镜像(多一个 i = image)
docker search — 搜索镜像
docker search nginx
docker search --limit 5 redis
- 功能:在 Docker Hub 搜镜像
- 建议:直接去 hub.docker.com 搜更直观
docker tag — 给镜像贴标签
docker tag nginx:1.27 my-nginx:v1
# 不复制实际数据,只是新指针(比如起个自己熟悉的版本名字)
- 功能:给已有镜像复制新名字
- 场景:准备 push 到自己的 registry / 重命名
6.2 容器相关(containers)
docker run — 启动容器(最常用)
# 基础:后台跑 nginx,命名 + 端口映射
docker run -d --name my-nginx -p 8080:80 nginx:1.27
# 跑一次性命令(容器用完即删)
docker run --rm -it ubuntu:24.04 bash
# 跑带数据卷的
docker run -d --name db -v /my/data:/var/lib/mysql mysql:8.0
-
功能:从镜像创建并启动容器
-
场景:装啥都要用
-
常用参数:
| 参数 | 含义 | 场景 |
|---|---|---|
-d |
detached 后台跑 | 服务器长期运行 |
-it |
interactive + tty | 进容器 shell |
--name xxx |
容器命名 | 不命名系统随机 |
-p 8080:80 |
端口映射 | 暴露服务 |
-v /host:/container |
数据卷挂载 | 持久化 |
| `-e KEY=*** | 环境变量 | 配密码 |
--rm |
停止后自动删 | 一次性任务 |
--restart always |
开机自启 | 服务器必备 |
docker ps — 查看容器
$ docker ps
# 输出如下(举例):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f55086f7dd0 nginx:1.27 "nginx…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp my-nginx
$ docker ps -a # 看所有(含已停止的)
$ docker ps -q # 只显示容器 ID
- 功能:列出容器
- 场景:诊断"这容器跑没跑"
docker start / stop / restart — 启停容器
docker start my-nginx # 启动已停止的
docker stop my-nginx # 优雅停止(10 秒宽限)
docker restart my-nginx # 重启
docker kill my-nginx # 强制杀(SIGKILL 立刻)
- 场景:改完配置重启 / 卡死强杀
docker rm — 删容器
docker rm my-nginx # 删已停止的
docker rm -f my-nginx # 强制删(含运行中,不如先stop后再rm删的干净,建议少用)
docker rm -f $(docker ps -aq) # 全删(慎用!)
- 坑:必须先 stop 才能 rm(除非 -f)
docker exec — 进运行中的容器
docker exec -it my-nginx bash # 进 bash
docker exec -it my-nginx sh # 进 sh(alpine 用)
docker exec my-nginx ls /etc # 跑单条命令
- 功能:在运行中的容器里跑命令
- 场景:调试 / 看配置 / 改文件
- 坑:必须是运行中的(exec 进不去 stopped)
docker logs — 看容器日志
docker logs my-nginx # 全部日志
docker logs -f my-nginx # 实时跟踪(tail -f)
docker logs --tail 100 my-nginx # 最后 100 行
docker logs --since 10m my-nginx # 最近 10 分钟
- 场景:服务挂了 / 想知道程序在干啥
6.3 查看信息(info / inspect)
docker info — 系统总览
$ docker info
# 几十行输出,关键看这几段:
# Server Version: 25.0.0
# Storage Driver: overlay2
# Registry Mirrors:
# https://docker.m.daocloud.io/
# ...
- 场景:诊断镜像加速器是否生效 / 看 daemon 版本
docker version — 版本信息
$ docker version
# Client: Docker Engine - Community
# Version: 25.0.0
# Server: Docker Engine - Community
# Version: 25.0.0
docker inspect — 详细配置
docker inspect my-nginx
docker inspect --format '{{.NetworkSettings.IPAddress}}' my-nginx
- 功能:容器/镜像的完整 JSON 配置
- 场景:查 IP、卷、环境变量
docker top — 看容器内进程
$ docker top my-nginx
PID USER TIME COMMAND
12345 root 0:00 nginx: master process
- 场景:看容器内啥程序在跑
docker stats — 实时资源占用
$ docker stats
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
my-nginx 0.05% 12MiB / 7.7GiB 0.15% 1.2kB/0B 0B/0B
- 场景:找"哪个容器在吃资源"
6.4 网络相关(networks)
docker network ls — 查网络
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
abc123... bridge bridge local
def456... host host local
ghi789... none null local
docker network create — 建网络
docker network create my-net
# 多个容器用同一个网络就能互通
6.5 数据卷相关(volumes)
docker volume ls — 查数据卷
$ docker volume ls
DRIVER VOLUME NAME
local my-volume
local db-data
docker volume rm — 删数据卷
docker volume rm my-volume
docker volume prune # 删所有未用的
⚠️ 删了就找不回来
6.6 系统清理(system)
docker system df — 看磁盘占用
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 15 3 5.2GB 3.1GB (60%)
Containers 5 1 234MB 0B (0%)
Local Volumes 8 2 1.5GB 800MB (50%)
Build Cache 20 0 4.8GB 4.8GB
docker system prune — 终极清理
docker system prune # 清停止容器+悬空镜像+未用网络
docker system prune -a --volumes # 更狠:连数据卷也清(**会丢数据**)
⚠️ 生产环境慎用
⚠️ 重要补充:docker compose 命令(V2 新版 vs V1 旧版)
新版本(Docker 20.10+ 推荐):
# V2:docker 子命令,没有连字符
docker compose up -d
docker compose down
docker compose ps
docker compose logs -f
老版本(已废弃):
# V1:独立命令,有连字符(Python 写的)
docker-compose up -d
区别:
| 维度 | V1(docker-compose) | V2(docker compose) |
|---|---|---|
| 写法 | docker-compose(有连字符) |
docker compose(空格) |
| 实现 | Python 独立程序 | Go 写的 Docker CLI 插件 |
| 性能 | 慢 | 快 5-10 倍 |
| 状态 | 已废弃(2023 起) | 官方推荐 |
| docker 是否内置 | 需要单独装 | docker CLI 自带 |
新手 5 条铁律
docker rm删容器,docker rmi删镜像——多一个 idocker run用--name命名——不命名系统会随机docker run配--restart always——服务器必备- 数据一定要
-v挂卷——否则容器删了数据全丢 - 进容器用
exec -it,不用attach——attach 退出会把容器也停掉
💡以上常用命令,供新手参考,不必追求一次全搞懂,随着自己实践的深入,会越来越多的碰到,别着急,慢慢来!
§7 下一步:跑 OpenClaw 智能体
Docker 装好 + 跑通 hello-world 后,下一步强烈建议:
立刻跑你的第一个 AI 应用
👉 《在你自己的服务器上跑你的第一个智能体 OpenClaw ——Docker 跨机部署方案(面向 AI 新手)》
只需要几条命令,30 分钟搞定,跑完你就有了一个 7×24 在线的中文 AI 助手。
推荐学习实践的路线
| 阶段 | 学啥 | 时间 |
|---|---|---|
| 入门 | docker pull / run / ps / stop / rm / images | 1 天 |
| 进阶 | docker exec / logs / 网络 / 卷 | 2-3 天 |
| 实战 | docker compose(多容器编排) | 1 周 |
| 应用 | 跑 OpenClaw 智能体 / 数据库 / AI 应用 | 持续 |
§8 防坑附录:5 个常见问题
装 Docker 时可能遇到的 5 个常见坑:
| # | 问题 | 症状 | 原因 | 解决 |
|---|---|---|---|---|
| 1 | docker 命令找不到 |
输入 docker 报 command not found |
没装或 PATH 没配 | 重新装 §5.4,然后 logout + login |
| 2 | permission denied 错误 |
docker ps 报权限错 |
当前用户不在 docker 组 | 跑 §5.5.2 非 root 用户配置 |
| 3 | 拉镜像慢 / 超时 | docker pull nginx 卡住 |
用了默认国外源 | 跑 §5.5.3 国内镜像源配置 |
| 4 | hello-world 跑失败 |
报 Unable to find image |
网络问题 / 源没配 | 重试 + 检查 /etc/docker/daemon.json |
| 5 | Docker 服务起不来 | systemctl status docker 显示 failed |
配置文件错了 | 看 FAQ 9 |
§9 常见 FAQ 汇总(10 个)
下面这 10 个 FAQ 是新手最常问的,单独放这里方便速查。
FAQ 1:Docker Engine 和 Docker Desktop 啥区别?
答:
- Docker Engine(本文装的):纯命令行版,跑在 Linux 服务器上,生产环境用这个
- Docker Desktop:图形化版(GUI),给 Windows/Mac 桌面用户,包含 Docker Engine + GUI + Kubernetes
装 Ubuntu Server = 装 Docker Engine(不需要 Desktop),因为没有桌面环境。
FAQ 2:为啥本篇不用 Docker Desktop?
答:
- Docker Desktop 主要是给 Mac/Win 用户的(弥补它们没原生 Docker)
- Ubuntu 有原生 Docker(Docker Engine),不需要 Desktop
- Docker Desktop 占用资源大(4G+),没必要
FAQ 3:Docker 数据存在哪?删容器会丢吗?
答:
- 容器内部数据:存容器里(删容器 = 丢)
- 挂载的数据(
-v指定的路径):存主机(删容器 = 不丢) - Docker volume(
-v xxx:/path):Docker 管理的特殊目录(删容器 = 不丢)
重要数据一定要挂载或用 volume!
FAQ 4:Docker 和虚拟机(VM)能一起用吗?
答:能,但不常见。Docker 本身已经是轻量级"虚拟机",再套 VM 是浪费。一般是:
- 主机是 Linux → 直接装 Docker Engine
- 主机是 Mac/Win → 用 Docker Desktop(内部跑 Linux VM)
当然,你完全可以在你的windows/Mac电脑上玩虚拟机(VM),体验一下和docker的区别。
FAQ 5:Docker Compose 是啥?和 Docker 啥关系?
答:Docker Compose 是多容器编排工具——用 1 个 docker-compose.yml 文件描述多个容器,1 条命令启动所有(说白了:就是事先编辑好所有相关配置,一条命令启动所有,适合统一管理多个容器用;Docker就是一点一点手动搞)。
# docker-compose.yml 示例:nginx + postgres
services:
nginx:
image: nginx
ports:
- "8080:80"
postgres:
image: postgres
environment:
POSTGRES_PASSWORD: dajun_password
# 一条命令启动
docker compose up -d
Docker Engine = 单容器;Docker Compose = 多容器。
FAQ 6:怎么升级 Docker?
答:
sudo apt-get update
sudo apt-get upgrade docker-ce docker-ce-cli containerd.io
或者直接重装(§5.4),会自动升级到最新版。
FAQ 7:怎么完全卸载 Docker?
答:
# 卸载 Docker 包
sudo apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 删镜像、容器、卷(数据!备份先!)
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
# 删用户组
sudo groupdel docker
FAQ 8:Docker 镜像和容器啥区别?
答:
- 镜像(Image)= 应用"模板"(只读)
- 容器(Container)= 镜像"运行实例"(可写)
- 容器是用镜像创建的
# 看镜像
docker images
# 看运行中的容器
docker ps
# 看所有容器(包括停掉的)
docker ps -a
FAQ 9:Docker 服务起不来(failed)怎么办?
答:
# 看错误日志
sudo journalctl -u docker.service --no-pager -n 50
# 常见原因:
# 1. /etc/docker/daemon.json 配置错(JSON 语法错)→ 修正
# 2. 端口被占用 → docker ps 看谁占用
# 3. 磁盘满 → df -h 看磁盘
FAQ 10:装 Docker 会让电脑变慢吗?
答:装 Docker 本身不慢(不跑容器 = 不占资源)。
- 不跑容器时:Docker 服务只占 ~100MB 内存(可以忽略)
- 跑容器时:每个容器占 50-500MB 内存
- 主机没运行容器:和没装一样
不跑容器时 Docker 不耗资源,放心装。
写在最后
Docker 是你 AI 之路的"万能工具箱"。装完它,你就能:
- 一键跑 OpenClaw 智能体(见配套教程)
- 一键起数据库(PostgreSQL / Redis / Chroma)
- 一键部署你的个人网站
- 一键测试任何 AI 应用
你刚刚做的事:
- ✅ 卸载了旧版本 Docker(如有)
- ✅ 装了 Docker 依赖
- ✅ 加了 Docker 官方源
- ✅ 装了 Docker Engine + Compose
- ✅ 配置了非 root 用户 + 国内镜像源
- ✅ 跑了 hello-world 测试
- ✅ 了解一些Docker的常用命令
接下来你可以(按顺序):
- 必做:跑 OpenClaw 智能体(👉 详见配套教程)
- 推荐:学 Docker Compose(多容器编排)
- 可选:跑其他 AI 应用(Ollama / Dify / FastGPT)
如果你有想要探讨的问题:
- 📧 给我发邮件:[email protected]
- 🌐 访问我的网站:dajun-ai.com
最后验证:2026-10-06 / Docker 29.x.x / Ubuntu Server 24.04.4 LTS / 镜像源:DaoCloud + 清华源
关于作者
关于作者:大军,50 岁,前银行从业者,现在自由人。 正在持续构建、升级个人技术博客 dajun-ai.com, 记录一个爱好计算机和 AI 技术的普通人如何用 AI 丰富人生下半场。