我的docker随笔45:在龙芯平台安装docker

news/2024/11/16 18:55:05 标签: docker, 容器, 运维

本文介绍在龙芯平台安装docker

前言

2017年下半年开始接触docker时,那会李大锤刚刚会爬,而今年(2024年)下半年,李大锤已经是一个经常考得C并且经常和妹妹吵架的二年级学生了。这么多年就过去,docker一直陪伴着我的工作,正如我一直陪伴着大锤大妞的成长一样。

最近手上正好有台龙芯机器,恰好要做适配,刚好想研究不同平台的容器部署,于是就趁机尝试安装docker

环境

本文使用的软硬件说明如下。

处理芯片为Loongson-3A5000-LL,操作系统为麒麟桌面版,龙芯环境为旧世界。

CPU详情:

# cat /proc/cpuinfo 
system type             : generic-loongson-machine
processor               : 0
package                 : 0
core                    : 0
cpu family              : Loongson-64bit
model name              : Loongson-3A5000-LL
CPU Revision            : 0x14
FPU Revision            : 0x00
CPU MHz                 : 1800.00
BogoMIPS                : 3600.00
TLB entries             : 2112
Address sizes           : 48 bits physical, 48 bits virtual
isa                     : loongarch32 loongarch64
features                : cpucfg lam ual fpu lsx lasx crc32 complex crypto lvz lbt_x86 lbt_arm lbt_mips
hardware watchpoint     : yes, iwatch count: 8, dwatch count: 8
...

操作系统详情:

# cat /etc/os-release 
NAME="Kylin"
VERSION="银河麒麟桌面操作系统V10 (SP1)"
VERSION_US="Kylin Linux Desktop V10 (SP1)"
ID=kylin
ID_LIKE=debian
PRETTY_NAME="Kylin V10 SP1"
VERSION_ID="v10"
HOME_URL="http://www.kylinos.cn/"
SUPPORT_URL="http://www.kylinos.cn/support/technology.html"
BUG_REPORT_URL="http://www.kylinos.cn/"
PRIVACY_POLICY_URL="http://www.kylinos.cn"
VERSION_CODENAME=kylin
UBUNTU_CODENAME=kylin
PROJECT_CODENAME=V10SP1
KYLIN_RELEASE_ID="2403"

下载

docker的官方下载地址只提供了x86和arm架构的安装包。在龙芯系统里用apt-get install docker-ce命令安装,提示无候选包。经过搜索,在网上找到相关帖子,顺道找到github上已经编译好的安装包。

龙芯版docker安装包下载为:https://github.com/wojiushixiaobai/docker-ce-binaries-loongarch64/releases,本文选用今年(2024年)1月下旬发布的版本,文件名为docker-25.0.0.tgz。同时找该版本相近时间发布的docker-compose,地址为:https://github.com/wojiushixiaobai/compose-loongarch64/releases,版本是v2.24.0

安装

下载安装包后将其上传到机子。

解压文件

解压到相应目录:

tar xf docker-25.0.0.tgz -C /tmp
sudo mv /tmp/docker/* /usr/local/bin/

mkdir -p /usr/libexec/docker/cli-plugins/
cp docker-compose-linux-loongarch64 /usr/libexec/docker/cli-plugins/docker-compose

chmod +x /usr/libexec/docker/cli-plugins/docker-compose

注意,上面是拷贝docker目录里的二进制可执行文件到/usr/local/bin/。该目录文件如下:

$ ls /usr/local/bin/
containerd  containerd-shim-runc-v2  ctr  docker  dockerd  docker-init  docker-proxy  runc
添加配置

新建Docker 配置文件为/etc/docker/daemon.json 。默认不存在。

# mkdir /etc/docker
# cat > /etc/docker/daemon.json <<-EOF
{
  "registry-mirrors": [
    "https://a8qh6yqv.mirror.aliyuncs.com",
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries": [
    "172.18.18.168:5000",
    "10.10.1.8:5000"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "data-root": "/data/docker",
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"}
}
EOF

上述配置文件指定了docker镜像存储在/data/docker中,并指定了加速器和内部镜像仓库。根据实际情况修改。

新建systemctl启动所需的/etc/systemd/system/docker.service文件,内容如下:

# vim /etc/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/local/bin/dockerd --default-ulimit nofile=65535:65535
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
启动服务

启动:

systemctl start docker

查看状态:

systemctl status docker

输出结果:

# systemctl status docker
Warning: The unit file, source configuration file or drop-ins of docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.
● docker.service - Docker Application Container Engine
     Loaded: loaded (/etc/systemd/system/docker.service; disabled; vendor preset: enabled)
     Active: active (running) since Tue 2024-11-12 14:39:46 CST; 9s ago
       Docs: https://docs.docker.com
   Main PID: 91011 (dockerd)
      Tasks: 21 (limit: 19233)
     Memory: 36.2M
     CGroup: /system.slice/docker.service
             ├─91011 /usr/local/bin/dockerd --default-ulimit nofile=65535:65535
             └─91022 containerd --config /var/run/docker/containerd/containerd.toml

设置开机启动:

systemctl daemon-reload
systemctl enable docker
查看进程

docker启动后,会运行2个进程服务,除了dockerd进程外,还在containerd进程。如下:

$ ps aux | grep docker
root       91011  0.0  0.3 2023520 58832 ?       Ssl  14:39   0:00 /usr/local/bin/dockerd --default-ulimit nofile=65535:65535
root       91022  0.0  0.1 1929712 30576 ?       Ssl  14:39   0:00 containerd --config /var/run/docker/containerd/containerd.toml
修改权限

如果使用普通用户执行docker命令,会出现错误,如下:

$ docker ps
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

这是因为普通用户权限不足造成的。先看一下出错信息/var/run/docker.sock文件的权限。

$ ll /var/run/docker.sock
srw-rw---- 1 root root 0 11月 12 14:39 /var/run/docker.sock=

该文件权限为root,所属root组。离线安装的docker没有docker组,因此将该文件权限修改如下:

sudo chmod 777  /var/run/docker.sock

这样普通用户能执行docker命令了。

查看版本号:

$ docker version
Client:
 Version:           25.0.0
 API version:       1.44
 Go version:        go1.21.5
 Git commit:        e758fe5
 Built:             Sun Jan 21 04:36:23 2024
 OS/Arch:           linux/loong64
 Context:           default

Server:
 Engine:
  Version:          25.0.0
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.21.5
  Git commit:       615dfdf67264ed5b08dd5e86657bf0e580731cea
  Built:            Sun Jan 21 04:36:55 2024
  OS/Arch:          linux/loong64
  Experimental:     false
 containerd:
  Version:          v1.7.12
  GitCommit:        71909c1814c544ac47ab91d2e8b84718e517bb99
 runc:
  Version:          1.1.11
  GitCommit:        v1.1.11-0-g4bccb38
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

测试

曾几何时,hub.docker.com可以畅通访问并能下载镜像,现在已经无法访问了。真是岁月不居,时节如流,日月如梭,沧海桑田。

幸好,龙芯有官方的镜像仓库,地址为https://lcr.loongnix.cn/search。搜索未发现有gcc镜像,但有debian镜像。

尝试拉取镜像:

$ time docker pull lcr.loongnix.cn/library/debian
Using default tag: latest
latest: Pulling from library/debian
5755e6e26c6c: Pull complete 
Digest: sha256:0356df4e494bbb86bb469377a00789a5b42bbf67d5ff649a3f9721b745cbef77
Status: Downloaded newer image for lcr.loongnix.cn/library/debian:latest
lcr.loongnix.cn/library/debian:latest

real    33m7.466s
user    0m0.139s
sys     0m0.022s

运行之:

$ docker run -it --rm lcr.loongnix.cn/library/debian bash
root@136affeb24e5:/# 
exit

$ docker run -it --rm lcr.loongnix.cn/library/debian bash
root@9086b74f2d84:/# 
exit

使用bash直接退出了。换sh试试:

$ docker run -it --rm lcr.loongnix.cn/library/debian sh
# uname 

d^C^C^C^C^C^C^Z^C

能进入容器,但执行命令卡住。尝试在启动容器时执行命令:

$ docker run -it --rm lcr.loongnix.cn/library/debian uname -a
Linux 264b55e053b0 5.4.18-110-generic #99-KYLINOS SMP Fri Mar 29 09:24:59 UTC 2024 loongarch64 GNU/Linux

查看镜像发行版本信息,如下:

$ docker run -it --rm lcr.loongnix.cn/library/debian cat /etc/issue
Debian GNU/Linux trixie/sid \n \l

后面在其它帖子找到GitHub 镜像仓库(ghcr.io),上面有debian镜像,尝试拉取:

$ docker pull ghcr.io/loong64/debian:trixie
trixie: Pulling from loong64/debian
7a50cba388e3: Pull complete 
Digest: sha256:0aebb2809e98b7eeec4d8cc51b79bac709b84ea563c800d752b96b6a57d8937f
Status: Downloaded newer image for ghcr.io/loong64/debian:trixie
ghcr.io/loong64/debian:trixie

查看镜像发行版本信息,如下:

$ docker run -it --rm ghcr.io/loong64/debian:trixie cat /etc/issue
Debian GNU/Linux trixie/sid \n \l

两者应该是同源构建的,查看当前镜像列表,2者体积相差不大。

$ docker images
REPOSITORY                       TAG       IMAGE ID       CREATED        SIZE
ghcr.io/loong64/debian           trixie    47801f83a510   36 hours ago   126MB
lcr.loongnix.cn/library/debian   latest    53a1255560be   5 months ago   122MB

在相同网络,相近时间进行相同操作,一个耗时30秒,一个耗时30分钟,但不懂为何官方的仓库下载如此耗时。

小结

通过本文的实践,可以成功在龙芯机器上安装docker,不过目前还没有找到合用的镜像。原因待查,后面还要继续研究。

问题及解决

直接执行dockerd命令,提示如下:

# /usr/local/docker/dockerd 
invalid userland-proxy-path: userland-proxy is enabled, but userland-proxy-path is not set

userland-proxy设置为false即可:

/usr/local/bin/dockerd --userland-proxy=false

不过,使用systemctl启动时,无法添加userland-proxy标志也能启动。

参考资料
  • 参考资料:https://bbs.loongarch.org/d/248-loongnix-docker/3
  • 龙芯docker 安装包下载:https://github.com/wojiushixiaobai/docker-ce-binaries-loongarch64/releases
  • 龙芯docker-compose 安装包下载:https://github.com/wojiushixiaobai/compose-loongarch64/releases
  • docker.service文件:https://github.com/wojiushixiaobai/docker-ce-binaries-loongarch64/blob/master/docker.service
  • 龙芯的镜像仓库:https://cr.loongnix.cn/search
  • docker官方下载地址:https://download.docker.com/linux/static/stable/

http://www.niftyadmin.cn/n/5754532.html

相关文章

设计模式之工厂模式,但是宝可梦

前言 工作一年了&#xff0c;业务代码写太多&#xff0c;还是得自驱提升点技术。希望工作一年后写出来的能有更多自己的思考。 正文 工厂模式是一种创建型设计模式&#xff0c;主要的目的还是在创建一个对象时提供更灵活、更易扩展的机制。 简单工厂模式 情景模拟 小智到商…

【青牛科技】D54123 漏电保护电路介绍及应用

1、具体应用&#xff1a; 相关产品介绍&#xff1a; D54123 应用框图&#xff1a; D54123 方案介绍&#xff1a; 当正常电源电流流过时&#xff0c;电容滤波至少保证 VS端电压为12V R1、R2可根据所用电网交流电压值来选择 C4 应大于 1μF&#xff0c;C2小于 1μF 必须接入 RP&…

掌握C#中的异步编程:async和await关键字详解

C#中的异步编程模式。异步编程是现代应用程序开发中不可或缺的一部分&#xff0c;尤其在处理I/O密集型任务或网络请求时尤为重要。下面是一篇专注于C#异步编程的文章。 前言 随着互联网应用的不断发展&#xff0c;用户对应用程序响应速度的要求越来越高。传统的同步编程模型往…

Casio推出情感AI宠物机器人Moflin

‍‍ Casio最近推出了一款名为Moflin的AI宠物机器人&#xff0c;这款机器人以其独特的情感互动功能吸引了广泛关注。Moflin通过先进的AI技术&#xff0c;能够学习和理解主人的言行&#xff0c;并根据环境和互动的变化调整自己的情感反应。通过与主人的互动&#xff0c;Moflin可…

K8S 查看pod节点的磁盘和内存使用情况

查看某个节点的磁盘使用率&#xff1a; kubectl exec -it pod名称 -n 命名空间 – df -h 查询所有节点的已使用内存&#xff1a; kubectl top pods --all-namespaces | grep itsm 查询某个节点的总内存&#xff0c; kubectl describe pod itsr-domain-59f4ff5854-hzb68 --nam…

Tensorflow基本概念

简介&#xff1a;本文从Graph讲到Session&#xff0c;同时讲解了tf.constant创建tensor的用法和variable需要初始化的知识点&#xff0c;可以给你打好一个学习Tensorflow的基础。本文都是基于TensorFlow1.14.0的版本下运行。 本专栏将会系统的讲解TensorFlow在1.14.0版本下的各…

10款高效音频剪辑工具,让声音编辑更上一层楼。

音频剪辑在音频&#xff0c;视频&#xff0c;广告制作&#xff0c;游戏开发&#xff0c;广播等领域中都有广泛的应用。通过音频剪辑&#xff0c;创作者可以通将不同的音频片段进行剪切、拼接、混音等操作&#xff0c;创作出风格各异的音乐作品。如果你也正在为音频创作而努力的…

Go语言的零值可用性:优势与限制

Go语言以其简洁和高效的设计理念而著称&#xff0c;其中之一便是“零值可用”的特性。这一特性使得许多类型在未显式初始化时即可直接安全地使用&#xff0c;大大简化了代码的初始化过程。然而&#xff0c;并非所有类型都支持零值可用&#xff0c;且在使用时也存在一定的限制。…