20241209vanblog内容迁移

写于 2024-12-09

vanblog的个人博客内容 ,在docker hub无法访问,vpn无法连接时,且云服务器每次上传内容不超过500M的情况下,可以通过以下方式来迁移

手动迁移本地 Docker 容器和镜像到阿里云服务器

在无法通过 Docker Hub 的情况下,可以手动迁移本地 Docker 容器和镜像到阿里云服务器。以下是具体步骤:


步骤 1:导出 Docker 镜像

  1. 导出 mereith/van-blog:latest 镜像 在本地服务器运行以下命令:

bash docker save mereith/van-blog:latest > van-blog.tar

  1. 导出 mongo:4.4.16 镜像

bash docker save mongo:4.4.16 > mongo.tar

这将创建两个 .tar 文件:van-blog.tar 和 mongo.tar。

如果文件超过500MB,云服务器将无法上传下载,这时可以通过拆分文件来实现。

  1. 将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。
  2. 将拆分后的文件重新接合在一起 - 使用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 镜像到阿里云服务器

  1. SSH 登录到阿里云服务器

bash ssh root@ALIYUN_SERVER_IP

  1. 导入镜像 在目标服务器上运行以下命令导入镜像:

bash docker load < /path/to/target/directory/van-blog.tar docker load < /path/to/target/directory/mongo.tar

  1. 验证镜像是否导入成功

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:重新运行容器

  1. 运行 MongoDB 容器 根据之前的端口映射启动 MongoDB 容器:

bash docker run -d \ --name vanblog_mongo_1 \ -p 27017:27017 \ mongo:4.4.16

  1. 运行 VanBlog 容器 使用相同的端口映射和命令启动:

bash docker run -d \ --name vanblog_vanblog_1 \ -p 81:80 \ -p 444:443 \ mereith/van-blog:latest

  1. 验证容器是否运行

bash docker ps

应显示两个正在运行的容器。


步骤 5:迁移数据(如有)

如果 vanblog_mongo_1 容器使用了数据卷,需要将数据卷从本地服务器迁移到阿里云服务器。

  1. 查找本地 MongoDB 数据路径 检查数据卷路径:

bash docker inspect vanblog_mongo_1 | grep Mounts -A 5

找到挂载的本地目录,例如 /var/lib/docker/volumes/mongo_data/_data。

  1. 打包数据目录

bash tar -czvf mongo_data.tar.gz /var/lib/docker/volumes/mongo_data/_data

  1. 传输数据到阿里云

bash scp mongo_data.tar.gz root@ALIYUN_SERVER_IP:/path/to/target/directory

  1. 解压数据到目标路径 登录阿里云服务器后,解压数据:

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,这意味着:

  1. 挂载的数据已经在宿主机文件系统中: - MongoDB 容器的所有数据库文件存储在宿主机的 ${PWD}/data/mongo 目录中。 - 在迁移时,只需要将此目录打包并传输到目标服务器即可。
  2. 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

验证数据迁移成功

  1. 进入 MongoDB 容器,检查数据是否存在:

bash docker exec -it vanblog_mongo_1 mongo

在 MongoDB Shell 中运行:

javascript show dbs

  1. 检查日志目录和其他挂载的文件是否正常加载。

通过这种方式,你可以确保在迁移到阿里云时,所有数据和服务都能完整恢复。如果有其他问题,可以随时联系我!

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. 清理本地项目

确保以下内容在本地项目目录下:

  1. 源码和配置文件:
  • 项目目录包含 Django 的核心文件(如 manage.py、settings.py 等)。
  • 静态文件(static/)、模板文件(templates/)等也应该齐全。
  1. requirements.txt:
  • 确保项目所有依赖项都已写入

    requirements.txt

    ,例如:

    txt django==4.2 gunicorn==20.1.0 ...

  1. .dockerignore 文件:
  • 避免将无关文件(如

    venv

    和其他临时文件)打包进镜像,创建

    .dockerignore

    文件,内容如下:

    txt venv/ __pycache__/ .git/ *.pyc *.pyo *.log


2. 构建 Docker 镜像

  1. 在项目根目录构建 Docker 镜像: 运行以下命令:

bash docker build -t mysite .

  1. 验证镜像是否构建成功: 查看镜像列表:

bash docker images

输出应类似:

REPOSITORY TAG IMAGE ID CREATED SIZE mysite latest <IMAGE_ID> <BUILD_TIME> <SIZE>


3. 本地测试 Docker 容器

  1. 启动容器: 使用以下命令启动容器:

bash docker run -d -p 82:82 mysite

  1. 验证服务是否运行: 在浏览器访问 http://localhost:82,确保 Django 开发服务器运行正常。

  2. 检查日志和输出: 查看容器日志,确认无错误信息:

bash docker logs <container_id>


4. 打包项目和镜像

  1. 保存镜像为文件: 将构建的 Docker 镜像保存为 .tar 文件:

bash docker save mysite > mysite.tar

  1. 将项目和镜像打包: 将项目代码和镜像一起打包:

bash tar -czvf mysite_project.tar.gz mysite.tar docker-compose.yaml


5. 传输到云服务器

可以下载、上传至服务器,可以通过split拆分为不大于500M的内容上传

6. 在云服务器上运行

  1. 加载 Docker 镜像: 在解压的目录中加载 Docker 镜像:

bash docker load < mysite.tar

  1. 启动容器: 使用以下命令运行容器:

bash docker run -d -p 82:82 mysite

  1. 验证部署: 在浏览器访问 http://YOUR_SERVER_IP:82,验证项目是否成功运行。

7. 使用 Docker Compose(可选)

如果使用 docker-compose.yaml 文件,步骤如下:

  1. 编辑 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 ```

  1. 启动服务: 使用 docker-compose 启动项目:

bash docker-compose up -d

  1. 验证部署: 在浏览器访问 http://YOUR_SERVER_IP:82。

通过以上流程,您可以成功将 Django 项目打包成 Docker 镜像并部署到云服务器。如果有进一步问题,欢迎随时提问!