20241209vanblog内容迁移
vanblog的个人博客内容 ,在docker hub无法访问,vpn无法连接时,且云服务器每次上传内容不超过500M的情况下,可以通过以下方式来迁移
手动迁移本地 Docker 容器和镜像到阿里云服务器
在无法通过 Docker Hub 的情况下,可以手动迁移本地 Docker 容器和镜像到阿里云服务器。以下是具体步骤:
步骤 1:导出 Docker 镜像
- 导出
mereith/van-blog:latest镜像 在本地服务器运行以下命令:
bash
docker save mereith/van-blog:latest > van-blog.tar
- 导出
mongo:4.4.16镜像
bash
docker save mongo:4.4.16 > mongo.tar
这将创建两个 .tar 文件:van-blog.tar 和 mongo.tar。
如果文件超过500MB,云服务器将无法上传下载,这时可以通过拆分文件来实现。
-
将tar文件拆分为两个文件 - 使用
split命令拆分split命令可以将一个文件分割成多个指定大小的小文件。例如,要将一个名为your_image.tar的文件拆分成两个文件,且尽量平均拆分,可以先查看文件大小。使用ls -lh命令查看文件大小(以人类可读的格式),假设文件大小为1000M(1GB)。 - 要将其拆分为两个文件,可以使用以下命令:
split -b 500M your_image.tar split_image_- 其中
-b 500M表示每个拆分后的文件大小约为500MB(M代表兆字节)。split_image_是拆分后的文件名前缀,执行命令后会生成两个文件,如split_image_aa和split_image_ab。
-
将拆分后的文件重新接合在一起 - 使用
cat命令接合- 要将上述拆分后的两个文件重新组合成原来的
your_image.tar文件,可以使用cat命令。在包含拆分文件的目录下,执行以下命令:bash cat split_image_* > combined_image.tar- 这里split_image_*表示以split_image_开头的所有文件,> combined_image.tar表示将这些文件的内容合并输出到一个新的文件combined_image.tar中。 需要注意的是,在拆分和接合过程中,要确保文件没有损坏。如果原始文件是经过特殊格式(如tar文件包含了特定的文件目录结构和权限信息等)保存的镜像文件,在拆分和重新组合后,可能需要在适当的环境(如Docker用于加载镜像的环境)下验证其完整性和可用性。
- 要将上述拆分后的两个文件重新组合成原来的
步骤 2:传输文件到阿里云服务器
将生成的 .tar 文件传输到阿里云服务器。可以使用 scp 命令:
scp van-blog.tar mongo.tar root@ALIYUN_SERVER_IP:/path/to/target/directory
例如:
scp van-blog.tar mongo.tar root@192.168.1.100:/var/local/
步骤 3:导入 Docker 镜像到阿里云服务器
- SSH 登录到阿里云服务器
bash
ssh root@ALIYUN_SERVER_IP
- 导入镜像 在目标服务器上运行以下命令导入镜像:
bash
docker load < /path/to/target/directory/van-blog.tar
docker load < /path/to/target/directory/mongo.tar
- 验证镜像是否导入成功
bash
docker images
应显示类似以下内容:
REPOSITORY TAG IMAGE ID CREATED SIZE
mereith/van-blog latest <IMAGE_ID> <CREATED_DATE> <SIZE>
mongo 4.4.16 <IMAGE_ID> <CREATED_DATE> <SIZE>
步骤 4:重新运行容器
- 运行 MongoDB 容器 根据之前的端口映射启动 MongoDB 容器:
bash
docker run -d \
--name vanblog_mongo_1 \
-p 27017:27017 \
mongo:4.4.16
- 运行 VanBlog 容器 使用相同的端口映射和命令启动:
bash
docker run -d \
--name vanblog_vanblog_1 \
-p 81:80 \
-p 444:443 \
mereith/van-blog:latest
- 验证容器是否运行
bash
docker ps
应显示两个正在运行的容器。
步骤 5:迁移数据(如有)
如果 vanblog_mongo_1 容器使用了数据卷,需要将数据卷从本地服务器迁移到阿里云服务器。
- 查找本地 MongoDB 数据路径 检查数据卷路径:
bash
docker inspect vanblog_mongo_1 | grep Mounts -A 5
找到挂载的本地目录,例如 /var/lib/docker/volumes/mongo_data/_data。
- 打包数据目录
bash
tar -czvf mongo_data.tar.gz /var/lib/docker/volumes/mongo_data/_data
- 传输数据到阿里云
bash
scp mongo_data.tar.gz root@ALIYUN_SERVER_IP:/path/to/target/directory
- 解压数据到目标路径 登录阿里云服务器后,解压数据:
bash
tar -xzvf /path/to/target/directory/mongo_data.tar.gz -C /var/lib/docker/volumes/mongo_data/_data
步骤 6:测试服务
在阿里云服务器上,测试 Web 服务是否正常运行:
- 浏览器访问
http://ALIYUN_SERVER_IP:81。 - 检查 MongoDB 服务是否能正常连接。
通过上述步骤,你可以成功迁移 Docker 服务到阿里云服务器。如果有其他问题,欢迎随时联系!
Docker容器的数据迁移
当你使用 docker save 命令时,仅保存的是镜像文件本身,并不会包括容器运行时生成的绑定到宿主机目录的数据。如果容器绑定了数据卷或者挂载了本地目录,这些数据需要手动导出。
在你的 docker-compose 文件中,mongo 服务的数据被挂载到了宿主机的 ${PWD}/data/mongo:/data/db,这意味着:
- 挂载的数据已经在宿主机文件系统中:
- MongoDB 容器的所有数据库文件存储在宿主机的
${PWD}/data/mongo目录中。 - 在迁移时,只需要将此目录打包并传输到目标服务器即可。 docker save并不会包含这些数据: - 使用docker save导出的只是镜像,不会包含宿主机绑定的目录数据。
迁移数据的操作步骤
1. 检查本地绑定的数据
确认宿主机是否有绑定的 MongoDB 数据:
ls ${PWD}/data/mongo
如果该目录中存在文件,则说明数据已经存储在宿主机上。
2. 打包绑定的数据
将本地的 data/mongo 目录打包为 .tar.gz 文件:
tar -czvf mongo_data.tar.gz -C ${PWD}/data mongo
3. 将数据传输到目标服务器
通过 scp 将数据文件传输到阿里云服务器:
scp mongo_data.tar.gz root@ALIYUN_SERVER_IP:/path/to/target/directory
4. 在目标服务器解压数据
登录到阿里云服务器后,将数据解压到目标目录:
tar -xzvf /path/to/target/directory/mongo_data.tar.gz -C /path/to/target/directory
假设在目标服务器上,数据需要存储到 /var/local/vanblog/data/mongo,可以解压到该目录:
mkdir -p /var/local/vanblog/data/mongo
tar -xzvf mongo_data.tar.gz -C /var/local/vanblog/data/mongo
5. 更新 docker-compose 文件中的绑定路径
在阿里云服务器上,更新 docker-compose.yml 文件,确保绑定路径指向正确的目标路径:
volumes:
- /var/local/vanblog/data/mongo:/data/db
6. 启动容器
启动所有服务:
docker-compose up -d
验证数据迁移成功
- 进入 MongoDB 容器,检查数据是否存在:
bash
docker exec -it vanblog_mongo_1 mongo
在 MongoDB Shell 中运行:
javascript
show dbs
- 检查日志目录和其他挂载的文件是否正常加载。
通过这种方式,你可以确保在迁移到阿里云时,所有数据和服务都能完整恢复。如果有其他问题,可以随时联系我!
20241209转移mysite内容至云服务器
在不打包虚拟环境的情况下,将现有代码打包Docker容器,然后通过Docker转移至云服务器
以下是调整后的具体流程,确保项目不打包虚拟环境 (venv),依赖安装由 Docker 在容器中完成,最终实现高效部署。
调整后的 Dockerfile
# 使用官方 Python 3.10 基础镜像
FROM python:3.10-slim
# 设置环境变量
ENV PYTHONUNBUFFERED=1
ENV PIP_NO_CACHE_DIR=1
# 设置工作目录
WORKDIR /usr/local/mysite
# 拷贝 requirements.txt 文件
COPY requirements.txt .
# 升级 pip 并安装 Python 依赖
RUN python3 -m pip install --upgrade pip && \
python3 -m pip install -r requirements.txt
# 拷贝项目文件
COPY . .
# 暴露运行端口
EXPOSE 82
# 启动 Django 服务
CMD ["python3", "manage.py", "runserver", "0.0.0.0:82"]
具体流程
1. 清理本地项目
确保以下内容在本地项目目录下:
- 源码和配置文件:
- 项目目录包含 Django 的核心文件(如
manage.py、settings.py等)。 - 静态文件(
static/)、模板文件(templates/)等也应该齐全。
requirements.txt:
-
确保项目所有依赖项都已写入
requirements.txt,例如:
txt django==4.2 gunicorn==20.1.0 ...
.dockerignore文件:
-
避免将无关文件(如
venv和其他临时文件)打包进镜像,创建
.dockerignore文件,内容如下:
txt venv/ __pycache__/ .git/ *.pyc *.pyo *.log
2. 构建 Docker 镜像
- 在项目根目录构建 Docker 镜像: 运行以下命令:
bash
docker build -t mysite .
- 验证镜像是否构建成功: 查看镜像列表:
bash
docker images
输出应类似:
REPOSITORY TAG IMAGE ID CREATED SIZE
mysite latest <IMAGE_ID> <BUILD_TIME> <SIZE>
3. 本地测试 Docker 容器
- 启动容器: 使用以下命令启动容器:
bash
docker run -d -p 82:82 mysite
-
验证服务是否运行: 在浏览器访问
http://localhost:82,确保 Django 开发服务器运行正常。 -
检查日志和输出: 查看容器日志,确认无错误信息:
bash
docker logs <container_id>
4. 打包项目和镜像
- 保存镜像为文件: 将构建的 Docker 镜像保存为
.tar文件:
bash
docker save mysite > mysite.tar
- 将项目和镜像打包: 将项目代码和镜像一起打包:
bash
tar -czvf mysite_project.tar.gz mysite.tar docker-compose.yaml
5. 传输到云服务器
可以下载、上传至服务器,可以通过split拆分为不大于500M的内容上传
6. 在云服务器上运行
- 加载 Docker 镜像: 在解压的目录中加载 Docker 镜像:
bash
docker load < mysite.tar
- 启动容器: 使用以下命令运行容器:
bash
docker run -d -p 82:82 mysite
- 验证部署: 在浏览器访问
http://YOUR_SERVER_IP:82,验证项目是否成功运行。
7. 使用 Docker Compose(可选)
如果使用 docker-compose.yaml 文件,步骤如下:
- 编辑
docker-compose.yaml文件: 确保内容如下:
```yaml version: '3.9'
services: web: build: . image: mysite ports: - "82:82" volumes: - ./logs:/usr/local/mysite/logs - ./static:/usr/local/mysite/static environment: - PYTHONUNBUFFERED=1 ```
- 启动服务: 使用
docker-compose启动项目:
bash
docker-compose up -d
- 验证部署: 在浏览器访问
http://YOUR_SERVER_IP:82。
通过以上流程,您可以成功将 Django 项目打包成 Docker 镜像并部署到云服务器。如果有进一步问题,欢迎随时提问!