Docker相关
Docker相关
[TOC]
Docker 是容器化部署的核心工具,掌握常用命令能高效管理容器、镜像和服务。以下按 基础命令 和 常见业务场景操作 分类整理,方便实际使用:
一、Docker 基础命令
1. 镜像管理
-
拉取镜像(从仓库下载,如 Docker Hub):
1 2 3
docker pull [镜像名]:[标签] # 例如: docker pull ghcr.io/usememos/memos:0.25.2
- 查看本地镜像:
1 2
docker images # 列出所有镜像 docker images | grep [关键词] # 筛选特定镜像,如 docker images | grep memos
- 删除镜像(需先删除依赖该镜像的容器):
1 2 3
docker rmi [镜像ID/镜像名] # 例如: docker rmi neosmemo/memos:latest
- 镜像重命名/打标签(方便区分版本):
1 2 3
docker tag [原镜像名:标签] [新镜像名:新标签] # 例如: docker tag memos:latest mymemos:v1
2. 容器管理
-
创建并启动容器(最常用,-d 后台运行,–name 命名,-p 端口映射,-v 目录挂载):
1 2 3
docker run -d --name [容器名] -p [宿主机端口]:[容器内端口] -v [宿主机目录]:[容器内目录] [镜像名] # 示例:启动memos,宿主机5230端口映射容器5230,数据存本地/root/.memos/ docker run -d --name memos -p 5230:5230 -v /root/.memos:/var/opt/memos ghcr.io/usememos/memos:0.25.2
- 查看容器状态:
1 2
docker ps # 运行中的容器 docker ps -a # 所有容器(包括停止的)
- 启动/停止/重启容器:
1 2 3
docker start [容器名/ID] docker stop [容器名/ID] docker restart [容器名/ID]
- 进入容器内部(临时操作,如查看日志、修改配置):
1 2
docker exec -it [容器名/ID] /bin/bash # 进入bash终端(若容器无bash,可用sh) exit # 退出容器
- 删除容器(需先停止,-f 强制删除运行中的容器):
1 2
docker rm [容器名/ID] docker rm -f [容器名/ID] # 强制删除
- 查看容器日志(调试必备):
1 2 3
docker logs [容器名/ID] # 查看全部日志 docker logs -f [容器名/ID] # 实时跟踪日志(按Ctrl+C退出) docker logs --tail 100 [容器名/ID] # 查看最后100行日志
3. 系统信息
- 查看 Docker 版本:
1
docker version
- 查看 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.25.2
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 stop memos && docker rm memos
- 从 Memos 的官方仓库)中查看最新的版本,然后指定标签拉取:
1
docker pull ghcr.io/usememos/memos:0.25.2
- 用新镜像启动容器(参数与之前一致):
1
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.25.2
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='' [容器名])清空特定容器日志。
掌握这些命令后,日常的容器部署、更新、维护基本够用,遇到问题可通过 docker --help 或具体命令后加 --help(如 docker run --help)查看详细参数。
本文由作者按照
CC BY 4.0
进行授权