开发者
资源
鲲鹏平台Docker容器化应用部署与ARM镜像构建
鲲鹏平台Docker容器化应用部署与ARM镜像构建
原创
发表于05/07
1230

一、鲲鹏上用Docker和x86有什么不同

Docker本身是跨架构的——容器的本质就是进程隔离加文件系统叠加,和CPU架构无关。但Docker镜像不是跨架构的。一个基于x86构建的镜像,在鲲鹏上拉起来会报"exec format error",因为镜像里的二进制文件是x86指令集,ARM处理器无法执行。

所以在鲲鹏上使用Docker,核心问题只有一个:获取或构建ARM架构的镜像。本文在华为云开发者空间(鲲鹏aarch64,4VCPUs 8GiB)环境下,实操Docker的安装、ARM镜像的获取与构建、以及容器化应用部署的优化。

二、Docker安装

2.1 安装Docker CE

鲲鹏平台的Docker安装和x86上的流程一致,只是RPM包的架构不同:

# 安装依赖(提供dnf config-manager插件)
sudo dnf install -y dnf-plugins-core

# 添加Docker仓库(鲲鹏aarch64版本,使用华为云镜像源)
sudo dnf config-manager --add-repo \
  https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo

# 修改repo文件,将$releasever替换为7(openEuler不识别此变量)
sudo sed -i 's|\$releasever|7|g' /etc/yum.repos.d/docker-ce.repo

# 查看可用的Docker版本
dnf list docker-ce --showduplicates 2>/dev/null | sort -r | head -10

# 安装Docker CE(使用--nobest跳过rootless-extras硬依赖)
# 说明:openEuler 22.03仓库中没有fuse-overlayfs和slirp4netns,
# docker-ce-rootless-extras无法安装。使用--nobest跳过此依赖。
sudo dnf install -y --nobest docker-ce docker-ce-cli \
  containerd.io docker-compose-plugin

# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
docker version
# 输出:
# Server: Docker Engine - Community
#  Architecture: aarch64
#  OS/Arch: linux/arm64

docker run hello-world
# 输出:Hello from Docker!

确认Architecture显示aarch64,说明Docker运行在ARM架构上。

2.2 配置Docker镜像加速

鲲鹏平台在国内拉取Docker Hub镜像可能较慢,配置镜像加速:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json << 'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.1panel.live",
    "https://hub.rat.dev"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "storage-driver": "overlay2",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
EOF

# 重启Docker使配置生效
sudo systemctl restart docker

三、获取ARM架构镜像

3.1 直接拉取多架构镜像

Docker Hub上的主流镜像大多已经支持多架构(multi-arch),拉取时Docker会自动选择匹配当前架构的版本:

# 拉取Nginx(自动获取aarch64版本)
docker pull nginx:latest

# 验证镜像架构
docker inspect nginx:latest | grep Architecture
# 输出:"Architecture": "arm64"

# 拉取其他常用镜像
docker pull python:3.11-slim
docker pull node:18-alpine
docker pull redis:7-alpine

3.2 查看镜像支持的平台

在Docker Hub页面或使用manifest命令查看镜像支持哪些架构:

# 查看镜像的manifest列表(Docker 20.10+无需额外设置)
docker manifest inspect nginx:latest | grep -A 2 "architecture"
# 输出:
# "architecture": "amd64"
# "architecture": "arm64"
# "architecture": "s390x"

如果镜像只有amd64架构,在鲲鹏上无法运行,需要自行构建ARM版本。

四、构建ARM架构Docker镜像

4.1 编写Dockerfile(以Python应用为例)

mkdir -p ~/docker-demo && cd ~/docker-demo

# 创建Python应用
cat > app.py << 'EOF'
from flask import Flask
import platform

app = Flask(__name__)

@app.route('/')
def hello():
    return f"""
    <h1>Running on ARM64</h1>
    <p>Architecture: {platform.machine()}</p>
    <p>Processor: {platform.processor()}</p>
    """

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)
EOF

# 创建requirements.txt
echo "flask==3.0.0" > requirements.txt

# 编写Dockerfile
cat > Dockerfile << 'EOF'
# 基础镜像:选择arm64v8组织的Python镜像
FROM arm64v8/python:3.11-slim

WORKDIR /app

# 安装依赖(利用Docker层缓存)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i \
    https://mirrors.huaweicloud.com/repository/pypi/simple

# 复制应用代码
COPY app.py .

# 暴露端口
EXPOSE 8080

# 启动命令
CMD ["python", "app.py"]
EOF

4.2 构建和运行

# 构建镜像
docker build -t flask-arm64:1.0 .

# 运行容器
docker run -d -p 8080:8080 --name flask-app flask-arm64:1.0

# 验证运行
curl http://localhost:8080
# 输出:Running on ARM64 / Architecture: aarch64

# 查看镜像架构信息(注意:inspect容器不含Architecture,需inspect镜像)
sudo docker image inspect flask-arm64:1.0 | grep -E "Architecture|Os"
# 输出:
# "Architecture": "arm64",
# "Os": "linux",

4.3 使用Alpine基础镜像减小体积

Alpine Linux的ARM版本体积只有5MB左右,非常适合鲲鹏环境:

cat > Dockerfile.alpine << 'EOF'
FROM arm64v8/python:3.11-alpine

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i \
    https://mirrors.huaweicloud.com/repository/pypi/simple
COPY app.py .
EXPOSE 8080
CMD ["python", "app.py"]
EOF

# 构建
docker build -f Dockerfile.alpine -t flask-arm64:alpine .

# 对比镜像体积
docker images | grep flask-arm64
# 输出:
# flask-arm64  1.0      xxx   180MB
# flask-arm64  alpine   xxx   65MB

Alpine版本体积减少了约60%。

五、多架构镜像构建(buildx)

如果需要同时支持x86和ARM架构,可以使用Docker Buildx构建多架构镜像。

5.1 配置buildx

# 创建并使用新的builder实例
docker buildx create --name mybuilder --use

# 启动builder
docker buildx inspect --bootstrap

# 验证支持的平台
docker buildx inspect --bootstrap | grep Platforms
# 输出:Platforms: linux/amd64, linux/amd64/v2, linux/arm64, ...

5.2 构建并推送多架构镜像

# 登录Docker Hub
docker login

# 构建多架构镜像并推送
docker buildx build --platform linux/amd64,linux/arm64 \
  -t yourname/flask-demo:1.0 \
  --push .

这样构建出的镜像,在x86和鲲鹏上都能直接docker pull运行,Docker自动选择对应架构的版本。

六、鲲鹏平台Docker性能优化

6.1 存储驱动选择

鲲鹏平台推荐使用overlay2存储驱动(Docker默认):

docker info | grep "Storage Driver"
# 输出:Storage Driver: overlay2

不要使用devicemapper,它在ARM上的性能明显不如overlay2。

6.2 资源限制配置

在4核8GB环境下运行容器,需要合理设置资源限制:

# 限制CPU和内存
docker run -d \
  --cpus="2.0" \
  --memory="2g" \
  --memory-swap="2g" \
  -p 8080:8080 \
  --name flask-app \
  flask-arm64:alpine

# 查看容器资源使用
docker stats flask-app --no-stream
# 输出:
# NAME        CPU%   MEM USAGE / LIMIT   MEM%
# flask-app   0.5%   25MiB / 2GiB        1.2%

6.3 内核参数优化

在鲲鹏上运行大量容器时,需要调整内核参数:

# 增加文件描述符限制(写入独立配置文件)
echo "fs.file-max = 65535" | sudo tee /etc/sysctl.d/99-docker.conf

# 增加网络连接范围
echo "net.ipv4.ip_local_port_range = 1024 65535" | sudo tee -a /etc/sysctl.d/99-docker.conf

# 开启网络转发
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-docker.conf

# 使配置生效
sudo sysctl -p /etc/sysctl.d/99-docker.conf

6.4 Docker Compose编排

多个容器协同工作时,用Docker Compose管理更方便:

# 安装docker-compose(19.03版本未自带)
sudo dnf install -y docker-compose

# 验证安装
docker-compose version
# 输出:docker-compose version 1.xx.x

创建compose文件:

# 在docker-demo目录下创建docker-compose.yml
cd ~/docker-demo

cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
  web:
    image: flask-arm64:1.0
    ports:
      - "8080:8080"
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    restart: unless-stopped
EOF

启动服务:

# 启动所有服务(后台运行)
sudo docker-compose up -d

# 查看运行状态
sudo docker-compose ps
# 输出:
# NAME              IMAGE               STATUS       PORTS
# demo-web-1        flask-arm64:1.0     Up 2 min     0.0.0.0:8080->8080/tcp
# demo-redis-1      redis:7-alpine      Up 2 min     0.0.0.0:6379->6379/tcp

七、收获与反思

  1. Docker在鲲鹏上没有本质区别。Docker本身是跨架构的,操作命令完全一样。唯一的区别是镜像架构,确保使用arm64版本即可。
  2. 优先选择多架构镜像。主流开源项目的官方镜像基本都支持multi-arch,直接docker pull就能用。遇到不支持ARM的镜像,再考虑自行构建。
  3. Alpine镜像在鲲鹏上表现很好。Alpine的ARM版本成熟稳定,体积小、启动快。但要注意Alpine使用musl libc而非glibc,某些依赖glibc特性的应用可能需要调整。
  4. buildx让多架构发布变得简单。如果项目需要同时支持x86和ARM,使用buildx一次构建多架构镜像并推送到仓库,是最规范的做法。这样用户不管用什么架构的机器,docker pull都能直接运行。
收藏举报
Level 1
0
帖子
0
粉丝
0
获赞