摘要: 在国产化替代浪潮中,ARM64架构平台(如搭载麒麟OS)日益普及。如何将常见的x86应用无缝迁移至此环境?本文以高性能Web服务器Nginx为例,详细演示在ARM64版麒麟OS上,如何利用Docker容器技术实现Nginx的快速拉取、部署、基础管理以及关键数据迁移,体验一次架构无关的应用迁移实践。

 目录:

  1. 前言:挑战与利器

  2. 环境准备:确认你的ARM64麒麟战场

  3. 核心步骤:Docker部署Nginx实战

    • 3.1 安装Docker引擎 (简述)

    • 3.2 拉取ARM64版Nginx镜像

    • 3.3 首次运行Nginx容器

    • 3.4 验证访问:Hello Nginx on ARM64!

    • 3.5 容器管理:查看、停止、删除

  4. 进阶实战:数据迁移与持久化

    • 4.1 为何需要数据持久化?

    • 4.2 创建数据卷 (Volume)

    • 4.3 挂载数据卷运行Nginx

    • 4.4 迁移自定义配置与网站文件

  5. 避坑指南与技巧总结

  6. 结语:容器化赋能迁移适配


1. 前言:挑战与利器

传统的软件安装(如编译安装、包管理器安装)在跨不同CPU架构(如x86_64到ARM64)时,常常面临依赖库不兼容、预编译包缺失、性能优化差异等问题,迁移过程繁琐且易出错。容器化技术(Docker)通过将应用及其所有依赖打包成一个标准化的、轻量级的、可移植的“容器”,有效地解决了环境依赖和跨平台问题。本次实践,我们将利用Docker这把“利器”,在飞腾或鲲鹏等ARM64 CPU的麒麟操作系统上,快速部署和管理Nginx服务器。

2. 环境准备:确认你的ARM64麒麟战场

  • 操作系统: 银河麒麟桌面版或服务器版 (V10 SP1 或更新版本,确认是ARM64架构)。 (配图1:终端执行 uname -m 输出 aarch64 的截图)

  • 网络连接: 确保可以访问互联网,用于拉取Docker镜像。

  • 终端工具: 系统自带的终端或你喜欢的SSH客户端。

  • (可选)权限: 以下操作通常需要sudo权限或直接使用root用户。  

关键验证命令:

# 查看系统架构
uname -m
# 预期输出:aarch64 (代表ARM64)
# 查看麒麟OS版本
cat /etc/os-release | grep -i "name"
# 预期输出包含 "Kylin" 字样

3. 核心步骤:Docker部署Nginx实战

3.1 安装Docker引擎 (简述)

通常麒麟OS仓库已提供适配的Docker版本。安装非常简单:

sudo apt update
sudo apt install docker.io

安装完成后,启动Docker服务并设置开机自启:

sudo systemctl start docker
sudo systemctl enable docker

验证Docker安装成功:

sudo docker --version
# 预期输出类似:Docker version 20.10.17, build 100c701

3.2 拉取ARM64版Nginx镜像

Docker Hub上官方Nginx镜像已提供对ARM64架构的支持。直接拉取最新稳定版:

sudo docker pull nginx:stable

关键点: Docker会自动检测你的宿主机架构(ARM64),并拉取与之匹配的镜像变体。这是实现跨架构无缝迁移的核心!(配图2:docker pull nginx:stable 命令执行过程截图,注意输出行中有 arm64 标识)

查看已拉取的镜像:

sudo docker images
# 应能看到 nginx 镜像,TAG为 stable, 架构显示为 arm64 (或在REPOSITORY列显示为 `nginx:stable`)

3.3 首次运行Nginx容器

使用docker run命令启动一个Nginx容器:

sudo docker run -d --name my-nginx -p 8888:80 nginx:stable
  • -d: 后台运行容器 (detached mode)。

  • --name my-nginx: 给容器起个名字,方便管理。

  • -p 8888:80: 端口映射。将宿主机的8888端口映射到容器内部的80端口(Nginx默认监听端口)。

  • nginx:stable: 指定使用的镜像及其标签。

3.4 验证访问:Hello Nginx on ARM64!

容器启动后,打开你麒麟OS上的浏览器,访问:
http://localhost:8888 或 http://<你的麒麟OS机器IP>:8888
(配图3:浏览器成功访问Nginx默认欢迎页面的截图,标题为 “Welcome to nginx!”)
看到经典的Nginx欢迎页面了吗?恭喜你!一个运行在ARM64麒麟OS上的Nginx服务已经通过Docker容器成功部署!

3.5 容器管理:查看、停止、删除

  • 查看运行中的容器:

    sudo docker ps
  • 查看所有容器(包括已停止的):

    sudo docker ps -a
  • 停止容器:

    sudo docker stop my-nginx
  • 启动已停止的容器:

    sudo docker start my-nginx
  • 删除已停止的容器:

    sudo docker rm my-nginx
    # 强制删除运行中的容器 (慎用)
    sudo docker rm -f my-nginx
  • (可选)删除镜像:

    sudo docker rmi nginx:stable

4. 进阶实战:数据迁移与持久化

4.1 为何需要数据持久化?

默认情况下,容器内的文件系统是临时的。如果容器被删除,你在容器内修改的配置文件(如/etc/nginx/nginx.conf)或存放的网站文件(如/usr/share/nginx/html/index.html)都会丢失。数据卷(Volume)是Docker推荐的持久化数据方式,它将宿主机上的目录或文件挂载到容器内,实现数据独立于容器生命周期之外。

4.2 创建数据卷 (Volume)

创建一个名为nginx-html的数据卷,用于存放我们的网站文件:

sudo docker volume create nginx-html

查看创建的数据卷:

sudo docker volume ls

4.3 挂载数据卷运行Nginx

这次运行容器时,将数据卷nginx-html挂载到容器内Nginx存放默认网页的目录:

sudo docker run -d --name my-nginx-persistent \
  -p 8888:80 \
  -v nginx-html:/usr/share/nginx/html \
  nginx:stable
  • -v nginx-html:/usr/share/nginx/html: 将数据卷nginx-html挂载到容器内的/usr/share/nginx/html路径。

4.4 迁移自定义配置与网站文件

现在,我们想将之前在其他环境(比如x86服务器)上开发好的一个静态网站迁移到这个运行在ARM64麒麟OS上的Nginx容器中。

  1. 找到数据卷在宿主机上的实际路径:

    sudo docker volume inspect nginx-html

    在输出中找到 "Mountpoint" 字段的值(例如 /var/lib/docker/volumes/nginx-html/_data)。这就是宿主机上对应的目录。(配图4:docker volume inspect 命令输出截图,高亮 Mountpoint 路径)

  2. 迁移文件: 将你的网站文件(如 index.htmlstyles.cssimages/ 等)复制移动到步骤1获取到的宿主机Mountpoint目录下(可能需要sudo权限)。

    sudo cp -R /path/to/your/website/* /var/lib/docker/volumes/nginx-html/_data/
  3. 刷新页面: 再次访问 http://localhost:8888。你应该看到的不再是默认的Nginx欢迎页,而是你迁移过来的自定义网站内容了!(配图5:浏览器显示自定义网站内容的截图)

  4. (可选)迁移配置: 如果需要修改Nginx配置,可以采用类似方式。创建一个新卷(如nginx-conf),挂载到容器内的/etc/nginx/conf.d(推荐挂载单个配置文件)或/etc/nginx(整个配置目录,需谨慎)。然后将你准备好的 default.conf 或其他配置文件放入宿主机的对应卷目录即可。

迁移关键点: 迁移的核心是将应用数据(网站文件、配置文件) 从旧环境复制到新环境(宿主机)上Docker数据卷对应的目录。Docker容器启动时自动挂载这些数据,应用(Nginx)即可使用,完全无需关心底层是x86还是ARM64架构。这极大地简化了迁移过程。

5. 避坑指南与技巧总结

  • 权限问题:

    • 操作Docker命令通常需要sudo或用户加入docker用户组 (sudo usermod -aG docker $USER,需注销重新登录生效)。

    • 直接操作数据卷目录(/var/lib/docker/volumes/...)时,注意文件权限,确保Nginx容器内的进程(通常是www-data用户)有读取权限。

  • 镜像架构: 务必确认拉取的镜像支持arm64/aarch64。使用 docker pull 时观察输出,或使用 docker image inspect --format='{{.Architecture}}' nginx:stable 检查。

  • 端口冲突: 如果宿主机8888端口已被占用,docker run会失败。换一个可用端口(如8080)即可。

  • 容器命名: 使用有意义的容器名(如my-nginx),便于管理,避免重复创建冲突。

  • 数据卷 vs 绑定挂载: 除了docker volume create创建的管理卷,还可以直接用 -v /host/path:/container/path 进行绑定挂载(bind mount),将宿主机指定目录挂载进容器。数据卷更易备份和管理,绑定挂载更灵活。

  • 查看日志: 容器启动失败或行为异常时,查看日志是首要手段:

    sudo docker logs my-nginx

6. 结语:容器化赋能迁移适配

通过这次在ARM64麒麟OS上部署Nginx容器的实践,我们深刻体会到Docker容器技术在应用迁移与适配中的强大威力:

  1. 屏蔽架构差异: 只需拉取对应架构的镜像,应用即可运行,无需处理底层库的兼容性问题。

  2. 环境一致性: 开发、测试、生产环境使用相同的镜像,杜绝“在我机器上是好的”问题。

  3. 部署极速: docker pull + docker run 即可完成部署,远快于传统编译安装。

  4. 数据迁移简化: 通过数据卷机制,应用数据的迁移变得直观且独立于应用运行环境。

  5. 资源隔离与管理便捷: 容器提供资源隔离,docker ps/stop/rm/logs 等命令使得应用生命周期管理异常轻松。

掌握Docker容器化技术,无疑是应对当前复杂多样的计算环境(尤其是国产化ARM平台)进行应用迁移和部署的必备技能。希望这篇博文对你有所帮助,助你在国产化浪潮中乘风破浪!

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐