使用docker在amd64上运行arm64的Ubuntu

前言

​ 因需要在x86的Ubuntu上运行arm64版本的Ubuntu,方便调试不同架构的代码,所以使用docker容器来实现。配置完所需环境测试后发现这个方案可行,相当于部署了虚拟环境。而且docker容器都是隔离的,使用更方便。在多台设备上配置太麻烦,所以写成简易的配置脚本。

我的配置脚本

#!/bin/bash

# 更改DNS
sudo sed -i 's/#DNS=/DNS=192.168.101.201/' /etc/systemd/resolved.conf
sudo echo "DNS has been changed!"

# 安装docker所需前置软件包
sudo sed -i '/#/d' /etc/apt/sources.list
sudo sed -i 's/ports.ubuntu.com/apt.server/g' /etc/apt/sources.list
sudo apt update
sudo apt install apt-transport-https curl -y

# 导入docker的GPG密钥
sudo mkdir /etc/apt/keyrings/
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 添加aliyun的docker仓库
sudo echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 更换国内镜像源
sudo mkdir /etc/docker/
config='{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://mirror.baidubce.com",
    "http://hub-mirror.c.163.com"
  ]
}'
sudo echo $config | sudo tee /etc/docker/daemon.json

sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info

sudo apt install -y qemu-user-static

# 拉取arm64版的Ubuntu16.04
sudo docker run -d --name my_16container -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static arm64v8/ubuntu:16.04 sleep infinity

# 配置container
sudo docker exec -it my_16container bash -c "echo 'nameserver 192.168.101.201' > /etc/resolv.conf"
sudo docker exec -it my_16container bash -c "systemctl restart systemd-resolved"
sudo echo "Container DNS has been changed!"
sudo docker exec -it my_16container bash -c "sed -i '/#/d' /etc/apt/sources.list"
sudo docker exec -it my_16container bash -c "sed -i 's/ports.ubuntu.com/apt.server/g' /etc/apt/sources.list"
sudo docker exec -it my_16container bash -c "apt update"
sudo docker exec -it my_16container bash -c "apt install iproute2 -y"
sudo echo "Container APT has been modified!"
sudo docker exec -it my_16container /bin/bash

脚本解析

更改DNS
sudo sed -i 's/#DNS=/DNS=192.168.101.201/' /etc/systemd/resolved.conf
sudo echo "DNS has been changed!"

## 更改dns,如果有内网apt服务器,可以替换成内网的;没有的话就任意配置即可
安装docker所需前置软件包
sudo sed -i '/#/d' /etc/apt/sources.list	# 删除文件中的#行
sudo sed -i 's/ports.ubuntu.com/apt.server/g' /etc/apt/sources.list # 将原地址替换成可用的apt地址
sudo apt update
sudo apt install apt-transport-https curl -y	# 下载前置包

## 先配置sources文件,将apt源替换成内网apt地址,或者替换成任意国内地址。
导入docker的GPG密钥
sudo mkdir /etc/apt/keyrings/	# 导入gpg到该目录下需要先创建目录
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

## 可以导入官方的,也可以导入国内的,官方的可能会有问题,我选择导入阿里云的
添加aliyun的docker仓库
sudo echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

## 上一步导入的哪个密钥,这一步就需要添加对应的仓库,我使用的阿里云
安装docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

## 安装docker及所需的包
更换国内镜像源
sudo mkdir /etc/docker/
config='{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://mirror.baidubce.com",
    "http://hub-mirror.c.163.com"
  ]
}'
sudo echo $config | sudo tee /etc/docker/daemon.json

## 这一步可以不用,不过防止在拉去镜像时出错,可以添加上去以防万一
重启docker服务,安装跨平台支持软件
sudo systemctl daemon-reload
sudo systemctl restart docker	# 重启docker
sudo docker info	# 查看docker信息

sudo apt install -y qemu-user-static	# 下载跨平台支持软件qemu
拉取arm64版的Ubuntu16.04
sudo docker run -d --name my_16container -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static arm64v8/ubuntu:16.04 sleep infinity	# 可以拉取所需的系统版本

## -d是后台运行,--name是指定创建名称,-v是指定跨架构,sleep infinity是保持容器运行状态。

## 32位的:docker run -d --name my_arm32 -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static arm32v7/ubuntu:16.04 bash sleep infinity
配置container
sudo docker exec -it my_16container bash -c "echo 'nameserver 192.168.101.201' > /etc/resolv.conf"
sudo docker exec -it my_16container bash -c "systemctl restart systemd-resolved"
sudo echo "Container DNS has been changed!"
sudo docker exec -it my_16container bash -c "sed -i '/#/d' /etc/apt/sources.list"
sudo docker exec -it my_16container bash -c "sed -i 's/ports.ubuntu.com/apt.server/g' /etc/apt/sources.list"	# 更改arm版的apt源地址
sudo docker exec -it my_16container bash -c "apt update"
sudo docker exec -it my_16container bash -c "apt install iproute2 -y"
sudo echo "Container APT has been modified!"
sudo docker exec -it my_16container /bin/bash

## exec允许在容器内部执行命令,-it是分配终端,bash -c是执行字符串内的命令。
## 由于容器的Ubuntu内没有任何的工具软件,所以需要自己下载,例子中下载了IP addr的命令,nano,vim等命令需要自己下载。

​ 只需要创建一个 .sh 后缀的shell文件,将文件传到需要安装docker的主机上,然后使用 ‘sudo chmod +x ./xxx.sh’ 配置可执行权限,然后 ‘./xxx.sh’ 运行脚本即可。
​ 有问题可以留言或评论一起讨论,我会不定期分享一些简单的配置脚本。

你可能感兴趣的:(docker,ubuntu,容器,arm开发,linux,运维)