1> 系统架构不兼容
执行pull命令时,Docker会自动匹配当前系统架构的镜像包;Arm架构的系统只能运行Arm的镜像包,x86系统也只能运行x86架构的镜像包。
2> 区分操作系统
在Windows、Linux、Mac等各系统下拉取的镜像包,只能在对应的操作系统下运行,不能跨系统。但在 Windows Desktop 上拉取镜像时,如果使用的是 Linux 容器模式(默认就是 Linux),那么导出的 tar 包就是 Linux 镜像,可以迁移到 Linux 上使用。执行如下命令可查看某个镜像当前的容器模式:
## 查看指定镜像的系统和架构,此处以名称为 nginx:latest 的镜像为例
docker image inspect nginx:latest --format='{{.Os}}/{{.Architecture}}'
## 输出:'linux/amd64'
Docker Desktop for Mac 本身不能直接运行 Linux 内核,它会通过 轻量虚拟机来跑一个小型 Linux 内核,再在里面运行 Docker 容器。所以在 MacOS 上下载的镜像,本质上还是 Linux 镜像(而不是 MacOS 原生镜像);注意MacOS有Arm和X86两种架构的区分。
离线安装Docker的方式有以下几种:
方式一:使用源码编译安装,此方式很复杂;
方式二:使用离线的.deb
或.rpm
包安装,此方式简单一些,但容易出现版本兼容性问题;
方式三(推荐):使用Docker官方提供的静态二进制包(即,绿色版),解压后直接可用,兼容性好;
实测直接使用Docker官方源,在国内基本无法拉取任何Docker镜像,原因如下:
1>. Docker官方在2023年取消了中国区的加速服务;同时,因为某些Docker镜像可能包含敏感或未经审查的代码,因此被国内的“墙”限流,从而导致拉取Docker镜像时经常超时。
2>. 因为某些Docker镜像可能包含敏感或未经审查的代码,所以在国内公开提供Docker源有政策风险,因此国内云厂商都将Docker作为一个云产品来向用户提供,以控制使用范围。
3>. 相比其它镜像源,例如:npm、composer等,Docker镜像的体积较大,对云厂商来说有一定的带宽和存储成本,因此云厂商没有动力提供完全免费公开的Docker镜像源。
推荐:在Windows上安装桌面版Docker,再通过代理pull包,然后将包导出到其它平台上使用(以V2ray为例,一般的代理客户端在PAC模式下默认就直接代理了Docker的服务)。
下载地址:https://download.docker.com/linux/static/stable/x86_64/
## 0.1> 解压
tar xzvf docker-20.10.3.tgz
## 0.2> 进入docker目录,将目录下的所有文件拷贝至“/usr/bin/”
cd docker/
cp * /usr/bin/
## 0.3> 验证安装是否成功
## 检查客户端(CLI)是否能运行
docker --version
## 检查守护进程(Daemon)是否能运行
dockerd --version
导入到镜像包到其它Linux下进行测试:
详见:https://sidoc.cn/article/1097.html 中的迁移\备份;
# 0.1> 编辑文件
vim /etc/systemd/system/docker.service
# 0.2> 添加以下内容
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
# 0.3> 增加可执行权限
chmod +x /etc/systemd/system/docker.service
systemctl daemon-reload
# 0.4> 开机启动
systemctl enable docker.service
# 0.5> 启动Docker
systemctl start docker
# 7.0> 测试
docker -v