cxl
Published on 2025-06-11 / 43 Visits
0
0

Docker命令记录

最近在使用dify过程中发现dify的docker安装部署网络时好时坏,这个取决于 https://registry-1.docker.io/v2/ 这个地址的网络是否通畅,通畅的话安装是很快的,毕竟我有梯子加成,不通的时候就给你来个 context deadline exceeded 或者 Client.Timeout exceeded while awaiting headers ,明明访问油管就很流畅啊!!!

于是我想了个曲线救国的方法,就是在其它已经安装好了的机器中将docker镜像导出到新机器中,这期间主要用到docker镜像的操作命令,顺便记录一下其它一些docker命令,以便后续需要时可方便查阅。

📦镜像操作(保留完整历史层)

‌导出镜像 (docker save)‌

将完整镜像(含所有历史层)打包为 .tar 文件:


  docker save -o 文件名.tar 镜像名:标签 
  # 或 
  docker save 镜像名:标签 > 文件名.tar

我这里是将 langgenius/dify-api:1.4.1 镜像导出到 /data/dify-img/langgenius.dify-api:1.4.1.tar,其它一样操作,然后将所有dify有关的镜像打包后统一打包在 dify-img.tar.gz 压缩文件中,上传到百度云,这里分享一下,有需要的自取,还有 dify-1.4.1的源码。

导入镜像 (docker load)

.tar 文件恢复镜像(无法重命名):

  docker load -i 文件名.tar 
  # 或 
  docker load < 文件名.tar

陆续导入后重新安装dify后启动成功

适用场景‌:完整镜像迁移、备份或离线环境部署(如交付应用镜像)。

📦 容器操作(仅保存当前状态)

导出容器 (docker export)

‌将运行中或已停止的容器文件系统快照打包:

  docker export -o 文件名.tar 容器ID/名称 
  # 或 
  docker export 容器ID/名称 > 文件名.tar

以Nginx为例:docker export -o nginx-bak.tar d3f71586f0c1

导入为镜像 (docker import)

‌将快照转为新镜像(可指定名称):

  cat 文件名.tar | docker import - 新镜像名:标签 
  # 或 
  docker import 文件名.tar 新镜像名:标签

将刚导出的容器导入为镜像

  # 同个容器导入成不同标签镜像
  cat nginx-bak.tar | docker import - nginx:20250613-1130
  docker import nginx-bak.tar nginx:20250613-1131

适用场景‌:快速备份容器现场、环境迁移(不保留历史层)。

⚠️ 镜像与容器区别与注意事项

操作

对象

保留历史层

重命名支持

适用场景

save / load

镜像 ✅

完整镜像迁移、版本管理

export / import

容器 ✅

容器状态快照、临时环境备份

  • 容器导出镜像的技巧
    若需将容器转为完整镜像:先用 docker commit 容器ID 新镜像名:标签 保存为镜像,再使用 docker save 导出。

  • 导入后镜像无标签问题
    docker import 若未指定名称,需用 docker tag 镜像ID 新名称:标签 手动添加。

  • 数据持久化建议
    重要数据应挂载卷(volumes),避免依赖容器内部文件系统。

🔍 ‌系统信息与帮助‌

查看 Docker 版本及系统信息

  docker --version     # 显示 Docker 客户端和服务端版本
  docker info          # 查看 Docker 系统级信息(容器/镜像数量、存储驱动等)
  docker system df     # 统计磁盘占用(镜像/容器/数据卷空间)

命令帮助文档

  docker --help         # 查看所有命令列表
  docker run --help     # 查看具体命令用法(如 run 的参数说明)

🛠️ ‌容器管理‌

容器内进程与元数据

  docker top 容器ID         # 查看容器内运行的进程(类似 top 命令)
  docker inspect 容器ID     # 查看容器详细配置(网络/IP/挂载卷等元数据)

日志与终端交互

  docker logs -tf --tail 10 容器ID     # 实时查看日志-t 时间戳-f 跟踪--tail 行数)
  docker exec -it 容器ID /bin/bash     # 进入运行中容器的交互终端(推荐方式)
  docker attach 容器ID                 # 附加到容器主进程(退出可能导致容器停止)

文件拷贝与修改

  docker cp 容器ID:/path /host_path                       # 从容器复制文件到宿主机
  docker cp my_container:/app/log.txt ./log_backup.txt    # 复制容器内 /app/log.txt 到宿主机当前目录
  docker cp -aR /host/configs/ my_container:/conf/        # 递归复制宿主机配置目录到容器 /conf(保留属性) -p保留时间戳
  docker update --restart=always 容器ID                   # 设置容器随 Docker 服务自启动
  docker update --restart unless-stopped 容器ID           # 修改运行中的容器,无须重新启动或停止即生效
  docker rename my_container my_container_new             # 修改容器名称

📦 ‌镜像与仓库操作‌

镜像标签与推送

  docker tag 旧镜像名:tag 新镜像名:tag     # 为镜像打新标签(常用于版本管理)
  docker push 用户名/镜像名:tag            # 推送镜像到 Docker Hub 或私有仓库

镜像清理

  docker rmi $(docker images -q)          # 删除所有镜像-q 只返回镜像ID)
  docker image prune -a                   # 清理未被使用的悬空镜像

🔄 ‌数据持久化与网络‌

数据卷管理

  docker volume create vol_name           # 创建数据卷,自动创建挂载目录
  # 创建数据卷,手动挂载目录,挂载的目录 /tmp/local_web_app 得提前创建好
  docker volume create --driver local --opt type=none --opt device=/tmp/local_web_app --opt o=bind local_web_app
  docker volume inspect vol_name          # 查看数据卷详情(挂载点等)
  docker run -v vol_name:/容器路径        # 挂载数据卷到容器

网络配置

  docker network ls                       # 列出所有网络(bridge/host/none等)
  docker network create my_network        # 创建自定义网络
  docker run --network=my_network         # 指定容器运行网络

⚙️ ‌系统维护命令‌

  docker system prune -a # 清理所有未使用的镜像/容器/网络(加 -a 包含悬空镜像)
  docker stats # 实时监控容器资源占用(CPU/内存/网络)
  docker events # 查看 Docker 守护进程事件流

📌 关键场景示例

调试容器内服务

  # 在容器内测试服务
  docker exec -it nginx-container curl http://localhost 

批量停止所有容器

  docker stop $(docker ps -q)

导出容器配置

  # 保存容器配置为 JSON 文件
  docker inspect nginx > nginx_config.json

同时使用 Volume/Network/Port 启动容器

  # 创建自定义网络和数据卷
  docker network create app_net
  docker volume create app_data
  
  # 启动容器(绑定端口+挂载卷+指定网络)
  docker run -d \
    --name web_app \
    --network app_net \
    -p 8080:80 \
    -v app_data:/usr/share/nginx/html \
    -e "ENV=production" \
    nginx:alpine

通过 docker volume inspect app_data 命令获取到的 Mountpoint 属性目录地址,在此目录下新建 index.html 文件并写入自定义的html代码,访问IP对应的 8080 即可查看效果

多容器协同部署(Web+DB)

  # 创建共享网络
  docker network create my_stack
  docker volume create mysql_data
  
  # 启动MySQL容器(带持久化卷)
  docker run -d \
    --name mysql_db \
    --network my_stack \
    -v mysql_data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=secret \
    mysql:8.0
  
  # 启动Web应用(连接DB)
  docker run -d \
    --name web_app \
    --network my_stack \      # 需要与连接的 DB 网络一致
    -p 8000:8000 \
    -e DB_HOST=mysql_db \     # 应用中使用 DB_HOST 作为环境变量实现动态赋值
    my_web_image              # 自己开发的应用
  

注:部分命令需结合 sudo 或管理员权限执行,具体取决于 Docker 安装配置


Comment