最近在使用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
适用场景:快速备份容器现场、环境迁移(不保留历史层)。
⚠️ 镜像与容器区别与注意事项
容器导出镜像的技巧
若需将容器转为完整镜像:先用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 安装配置