Skip to content

AlmaLinux9 安装 Docker

注意:在 AlmaLinux 9 中推荐的包管理工具是 dnf,其实和 yum 类似,但是更为强大。

第一章:AlmaLinux9 安装 Docker

1.1 查看操作系统版本和内核版本

  • 查看操作系统版本:
uname -a

1671336910422-30dbcce9-b45b-4859-b134-0db80ea25f92.png

  • 查看内核版本:
cat /proc/version

1671336915952-df6f73de-d064-4f06-93ab-3384a650ca9f.png

1.2 确保系统是最新的(可选)

  • 命令:
dnf -y clean all
dnf -y update
dnf -y groupinstall "Development Tools"

1671336921206-b4ed7f5d-541e-4ecb-a7ab-781857ee7fed.gif

1.3 关闭防火墙(可选)

  • 查看防火墙状态:
systemctl status firewalld

1671336925404-bdef0a83-0457-45ff-9460-4520c681e7f4.gif

  • 关闭防火墙:
# 关闭防火墙
systemctl stop firewalld
# 禁用防火墙开机自动启动
systemctl disable firewalld

1671336929895-fc77952b-d84f-4848-af74-d54e11a88b35.gif

1.4 查看并卸载 Podman 和 Buildah(可选)

  • 查看 Podman 和 Buildah:
dnf list installed | grep -E 'podman|buildah'

1671336942211-ef3c66c6-eb6d-43f1-9a0e-e027a12defff.gif

  • 卸载 Podman 和 Buildah:
dnf -y remove *podman*
dnf -y remove buildah

1671336950196-f7581de9-2ca4-4539-aafd-e42dc52a0dea.gif

1.5 卸载旧版本的 Docker

  • 命令:
dnf -y remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

1671336957978-a0288131-00a0-45dc-b0cf-173da381745c.gif

1.6 设置 Docker 镜像仓库

  • 默认情况下,Docker 在 AlmaLinux 9 中的基础存储库中不可用,所以需要将 Docker CE 存储库添加到 Alima Linux 9 系统中:
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

1671336962797-809ea023-c897-4572-91f5-8dd61e712a92.gif

1.7 查看 Docker 版本

  • 命令:
dnf list docker-ce --showduplicates | sort -r

1671336968350-11bffb00-6721-45e2-8cf4-67c98641f0e7.gif

1.8 安装 Docker

  • 安装指定版本的 Docker :
dnf -y install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-compose-plugin --allowerasing
  • 本次将安装最新版本的 Docker :
dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin --allowerasing

1671336977747-dd00eae5-eb18-4b6d-9f1b-72ad6a3da13b.gif

1.9 启动 Docker

  • 命令:
# 启动 Docker
systemctl start docker
# 开启自动启动
systemctl enable docker
  • 组合命令:
# 启动,并设置开机自动启动
systemctl enable --now docker

1671336984188-569c2e7c-0e00-4b49-afde-07b63bc5623a.gif

1.10 查看 Docker 的版本

  • 命令:
docker version

1671336989320-64b324a0-e160-45a1-a2f1-82c9998c8d0e.gif

1.11 阿里云加速

  • 命令:
sudo mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"], 
  "registry-mirrors": [
    "https://du3ia00u.mirror.aliyuncs.com",
    "https://docker.lixd.xyz"
  ],
  "live-restore": true,
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"},
  "max-concurrent-downloads": 10,
  "max-concurrent-uploads": 5,
  "storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

1671336997180-b5c0bb97-4d41-435a-8409-38b1d9bbb2b3.gif

1.12 Docker 卸载

  • 命令:
systemctl stop docker
systemctl disable docker
sudo dnf -y remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

第二章:构建多平台的镜像

2.1 什么是多平台的镜像?

  • 首先,我们去 DockerHub 中查看 nginx 的镜像:

1671337009474-347a67b2-26fe-4416-8ad5-d16a6cd1e0c3.png

  • 我们可以在 OS/ARCH 看到各个平台(CPU 不同,对应系统的指令集可能有所不同),那么我们能够一次编译镜像实现多个平台自动选择部署,答案是可以的,并且最新版本的 Docker 已经集成进去了。

1671337014832-9dd65dc2-cc09-4443-bc11-1febb2cd6774.png

  • 如上图所示,使用 docker buildx 命令就可以将镜像编译为多平台镜像了。

其实,为什么要这么做?我们知道苹果的 Mac Book Pro 已经采用 M1 (ARM)系列的 CPU,而不再是 Intel 系列的 CPU 了;换言之,如果拉取的镜像不支持 arm 架构,那么在苹果系统上是无法运行的,最好的方式就是构建多平台(CPU)的镜像,当拉取镜像的时候自动选择对应架构的镜像运行。

  • 到目前为止,有如下几种方式来构建多平台镜像:
    • ① 在目前硬件上直接编译,例如:我们可以在 x86 和 arm 架构的硬件上都安装 Docker ,这样直接通过 docker build 命令即可编译不同版本的镜像,但是这种方式太费硬件了,实际情况是我们可能没有那么多架构的硬件。
    • ② 在内核中使用 QEMU 仿真程序,其实 QEMU 就相当于模拟器,可以帮助我们模拟多种 CPU 架构的操作系统,但是模拟操作系统太消耗资源了,QEMU 还支持通过 binfmt_misc 在 Linux 内核中注册一个二进制转换处理程序,并在程序运行中动态翻译二进制文件,根据需要将系统调用从目标 CPU 架构转换为当前系统的 CPU 架构,最终的效果看起来就像在本地运行目标 CPU 架构的二进制文件。
    • ③ 使用 Dockerfile 中的阶段交叉编译到不同的体系结构。
    • ……

2.2 在内核中使用 QEMU 仿真程序构建多平台镜像

2.2.1 启用 binfmt_misc

  • 前提条件:Linux 内核必须 >= 4.8 ,并且  binfmt-support 必须 >= 2.1.7 。
  • 如果使用的是 Linux ,需要手动启动 binfmt_misc,对于大多数 Linux 发行版都很容易启动;但是,我们可以直接运行一个特权容器,容器中已经写好了设置脚本:
docker run --privileged --rm tonistiigi/binfmt --install all

1671337020998-4ccdb509-20c5-4055-afae-e4a18ee70593.gif

  • 验证是 binfmt_misc 否开启:
ls -al /proc/sys/fs/binfmt_misc/

1671337025832-85c465f6-4983-4e60-a758-b4ab91f8995b.png

  • 验证是否开启了相应的处理器:
cat /proc/sys/fs/binfmt_misc/qemu-aarch64

1671337030671-a4316deb-5757-496a-84ec-4895de79fbb8.png

2.2.2 从默认的构建器切换到多平台构建器

  • Docker 默认会使用不支持多 CPU 架构的构建器,可以通过如下的命令查看默认的构建器:
docker buildx ls

1671337036183-02dae3de-4bf2-493a-ad5a-a44835b759f0.png

  • 上面显示的是默认的内置驱动程序,该程序直接使用内置到 Docker 引擎中的 BuildKit 服务器组件,也称为 Docker 驱动程序
  • 我们需要基于 Docker 驱动程序创建一个新的构建器,以便支持更复杂的功能,如:多平台构建等。
docker buildx create --name mybuilder --driver docker-container --bootstrap

1671337041053-d8a3c176-a09d-46ba-be3d-cabbdc8e8c3d.gif

  • 切换到新的构建器:
docker buildx use mybuilder

1671337046298-dec6c1de-7ee0-4bf7-ab14-0d8d67b0cf20.gif

当然,我们也可以通过命令完成以上的工作:docker buildx create --name mybuilder --driver docker-container --bootstrap --use,创建一个新的构建器并使用单个命令切换到这个新创建的构建器。

  • 检查新的构建器:
docker buildx inspect

1671337051214-f370327f-ee72-4f18-8cb5-556a0e8070c0.png

  • 查看是否注册成功:
docker buildx ls

1671337060286-501b0962-493f-4064-ad70-d3f01e78c21f.png

2.2.3 新建 Dockerfile 文件

  • 要想构建多种系统架构的镜像,还需要一个支持的 Dockerfile 文件,这里面多架构镜像最主要的就是基础镜像和安装的软件都需要支持多架构。
vim dockerfile
FROM alpine:3.16
RUN apk add curl

1671337068032-ee5463f9-760a-4a25-9695-38281651bcf6.gif

  • 需要说明的是 alpine 支持以下 7 种架构,因为我们制作的镜像也支持以下 7 种架构:
linux/amd64, linux/arm/v6, linux/arm/v7, linux/arm64/v8, linux/386, linux/ppc64le, linux/s390x
  • 更友好的架构名称如下:
amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, s390x
  • ARM 的系统架构还有如下的简称:
arm64, armv8l, arm64v8, aarch64 
arm, arm32, arm32v7, armv7, armv7l, armhf 
arm32v6, armv6, armv6l, arm32v5, armv5,  armv5l, armel, aarch32
  • Intel 的系统架构有如下的简称:
x86, 386, i386, i686 
x86_64, x64, amd64

2.3.4 本地构建镜像并推送到远程 Docker Hub 上

  • 登录 Docker Hub :略。
echo "$DOCKER_PASSWORD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin
  • 其中,$REGISTRY 是 Docker 仓库的地址,$DOCKER_PASSWORD_VAR 是 Docker 仓库的密码,而 $DOCKER_USER_VAR是 Docker 仓库的用户名。
  • 如果登录的是 Docker Hub ,$REGISTRY  是可以省略的。
  • 本地构建镜像并推送到远程 Docker Hub 上:
docker buildx build --platform \
    linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/386,linux/ppc64le,linux/s390x \
    -t aurorxa/alpine-multi-platform . --push

注意:aurorxa/alpine-multi-platform因为我推送镜像是到 Docker Hub 中,如果你也推送到自己的仓库,这边需要修改。

1671337079339-6ddf907b-1e33-4002-b708-13b947a58c01.gif

  • 去 Docker Hub 查看:

1671337084876-2935101e-a535-4af4-a8dc-74850bba5982.png

1671337090967-7f064054-63ef-4b3b-b955-177643708206.png

  • 如果想将构建好的镜像保存在本地,可以使用 type 参数指定为 docker ,但是必须分别为不同的 CPU 架构构建不同的镜像,不能合成一个镜像,例如:
docker buildx build --platform \
    linux/amd64 \
    -t aurorxa/alpine-multi-platform-amd64 -o type=docker .
docker buildx build --platform \
    linux/arm/v6 \
    -t aurorxa/alpine-multi-platform-arm-v6 -o type=docker .
docker buildx build --platform \
    linux/arm64/v8 \
    -t aurorxa/alpine-multi-platform-arm64-v8 -o type=docker .

注意:镜像名称需要不一样,不然会产生覆盖现象。

  • 查看多平台镜像:
docker buildx imagetools inspect aurorxa/alpine-multi-platform

1671337098357-2d3e4d80-8524-4171-a94a-af8d21296a9f.png

  • 其实,底层也是通过一个容器来帮助我们来生成对应平台的镜像的。
docker ps

1671337105374-78f2da19-0e3b-41e0-b95e-883557175042.png

更新: 2024-07-01 02:07:54
原文: https://www.yuque.com/fairy-era/yg511q/nyn6tnbv0uuun0gn

Comments