[TOC]
Docker 是容器化部署的核心工具,掌握常用命令能高效管理容器、镜像和服务。以下按 基础命令 和 常见业务场景操作 分类整理,方便实际使用:
一、Docker 基础命令
1. 镜像管理
2. 容器管理
3. 系统信息
- 查看 Docker 版本:
- 查看 Docker 系统状态(磁盘占用、容器/镜像数量等):
1
2
| docker system df # 类似df命令,显示资源占用
docker system prune # 清理无用镜像、容器、网络(谨慎使用,会删除未使用的资源)
|
二、常见业务场景操作
1. 部署一个新应用(如 memos)
常规部署:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 从ghcr.io拉取memos指定标签的镜像
docker pull ghcr.io/usememos/memos:0.25.2
# 启动容器:(以下所有参数按需使用)
docker run \
-d \ # 后台运行容器( detached 模式)
--name memos \ # 给容器命名为 "memos"(方便后续管理)
--restart always \ # 确保服务器重启后容器自动运行
-p 5230:5230 \ # 端口映射:将宿主机的 5230 端口映射到容器内的 5230 端口(Memos 默认端口)
-v /root/.memos:/var/opt/memos \ # 目录挂载:将宿主机的目录挂载到容器内的默认数据目录
-v /root/.memos/app.env:/etc/memos/app.env \ # 配置文件挂载到优先读取的路径
--add-host="nominatim.openstreetmap.org:127.0.0.1" \ # 强制添加域名映射到本地
ghcr.io/usememos/memos:0.25.2 # 基于该镜像创建容器(这里用的是 0.25.2 标签的镜像)
#(将上面的命令合并为一行:)
docker run -d --name memos --restart always -p 5230:5230 -v /root/.memos:/var/opt/memos -v /root/.memos/app.env:/etc/memos/app.env --add-host="nominatim.openstreetmap.org:127.0.0.1" ghcr.io/usememos/memos:0.26.2
|
部署 memos 并设置数据库为 MySQL:(2026年2月2日00:58 亲测如下命令管用)
(密码 处替换为真实密码,见 “人工智能备份消息” 或小米便签)
1
2
3
4
5
6
7
8
9
10
11
12
| docker run -d \
--name memos \
--restart=always \
--network host \
-v ~/docker-memos/data:/var/opt/memos \
-e MEMOS_DRIVER="mysql" \
-e MEMOS_DSN='memos_user:密码@tcp(127.0.0.1:3306)/memos?charset=utf8mb4&parseTime=True&loc=Local' \
ghcr.io/usememos/memos:0.26.0
#(将上面的命令合并为一行,以便直接在bash中执行:)
docker run -d --name memos --restart=always --network host -v ~/docker-memos/data:/var/opt/memos -e MEMOS_DRIVER="mysql" -e MEMOS_DSN='memos_user:密码@tcp(127.0.0.1:3306)/memos?charset=utf8mb4&parseTime=True&loc=Local' ghcr.io/usememos/memos:0.28.0
|
2. 容器数据备份(如 Memos、数据库)
以 Memos 为例,确保数据完整备份:
1
2
3
4
5
6
7
8
| # 1. 停止容器,让SQLite合并日志到主数据库
docker stop memos
# 2. 备份数据目录(包含.db、.db-wal、.db-shm)
cp -r /root/.memos /root/.memos_backup_$(date +%Y%m%d)
# 3. 重启容器
docker start memos
|
3. 容器更新(如升级 Memos 版本)
1
| docker pull ghcr.io/usememos/memos:canary
|
1
2
3
4
| # 查看当前运行的容器:
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
|
1
| docker rename memos memos-canary-0428
|
- 用新镜像启动容器(参数与之前部署时一致,注意替换为真实【密码】):
1
| docker run -d --name memos --restart=always --network host -v ~/docker-memos/data:/var/opt/memos -e MEMOS_DRIVER="mysql" -e MEMOS_DSN='memos_user:密码@tcp(127.0.0.1:3306)/memos?charset=utf8mb4&parseTime=True&loc=Local' ghcr.io/usememos/memos:canary
|
1
2
3
4
| # 删容器:
docker rm memos-canary-0305
# 删镜像:(通过 IMAGE ID 指定删除)
docker rmi cc570fc0a6ee
|
4. 查看容器资源占用(如CPU、内存)
1
2
| docker stats # 实时显示所有容器的资源占用
docker stats [容器名/ID] # 只看特定容器,如 docker stats memos
|
5. 容器端口映射冲突解决
当启动容器提示“端口已被占用”(port is already allocated):
1
2
3
4
5
6
7
| # 1. 查找占用端口的进程(以80端口为例)
netstat -tulpn | grep 80 # 找到占用进程的PID
# 2. 杀死进程(若为其他程序)或停止占用端口的容器
kill [PID] # 杀死外部进程
# 或停止占用端口的容器:
docker stop $(docker ps | grep 80 | awk '{print $1}')
|
6. 导出/导入镜像(迁移到其他服务器)
1
2
3
4
5
| # 导出镜像为tar文件
docker save -o [本地文件路径] [镜像名:标签] # 如 docker save -o memos.tar neosmemo/memos:latest
# 复制tar文件到目标服务器后,导入镜像
docker load -i [tar文件路径] # 如 docker load -i memos.tar
|
7. 进入容器内部
1
2
3
4
5
| # 先查看目标容器有没有在运行
docker ps
# 进入目标容器:
docker exec -it memos sh
|
三、实用技巧
- 容器自启动:创建容器时加
--restart always 参数,确保服务器重启后容器自动运行(如 docker run -d --restart always ...)。
- 批量操作:用管道命令批量处理,例如
docker rm $(docker ps -a -q) 批量删除所有停止的容器(谨慎使用)。
- 日志清理:容器日志可能占用大量磁盘,可通过
echo "" > $(docker inspect --format='{.LogPath}' [容器名]) 清空特定容器日志。
掌握这些命令后,日常的容器部署、更新、维护基本够用,遇到问题可通过 docker --help 或具体命令后加 --help(如 docker run --help)查看详细参数。