文章

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
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 进行授权