环境
- OS:
UOS 20 1021 12011.101 - CPU:
SW_64SW1621
步骤
本地编译 runc
1.解压 runc 源码至 ~/go/src/github.com/opencontainers 目录;
2.进入 runc 主目录,替换 vendor/golang.org/x/sys/unix 目录为申威平台 golang1.14.1 源码 go-sw64-1.14.1/src/cmd/vendor/golang.org/x/sys/unix 目录。
3.修改 libcontainer/system/syscall_linux_64.go 文件,在文件头添加 sw64 架构定义 //+build sw64。
4.修改 Makefile,去掉 runc 编译过程的-buildmode=pie,执行 make && make install 进行编译、安装。
本地编译 containerd
1.解压 containerd 源码至 ~/go/src/github.com/containerd 目录,重命名为 containerd;
2.进入 containerd 主目录,替换 vendor/golang.org/x/sys/unix 目录为申威平台 golang1.14.1 源码中的 go-sw64-1.14.1/src/cmd/vendor/golang.org/x/sys/unix 目录。
3.修改 vendor/github.com/containerd/fifo/handle_linux.go 文件,并将 const O_PATH=010000000 改为 040000000 。
4.修改 platforms/database.go 文件,在 isKnownArch 函数中添加 sw64
5.修改 containerd 主目录下的 Makefile.linux 文件,取消 sw64 的 -buildmode=pie 编译选项,执行 make && make install 进行编译、安装。
- 使用
systemd管理containerd服务。首先将containerd主目录下的containerd.service文件复制到/usr/lib/systemd/system/目录,然后执行systemctl daemon-reload、systemctl start containerd、systemctl enable containerd,最后执行systemctl status containerd查看服务状态。
本地编译 docker 相关组件
解压 docker-ce-18.09.zip ,将 components 目录下的 cli 和 engine 复制到 ~/go/src/github.com/docker 目录下,并将 engine 目录改名为 docker ,分别编译得到 docker-cli 及 dockerd 组件。
编译 docker-cli
1.进入 cli 目录,替换 vendor/golang.org/x/sys/unix 目录为申威平台 golang1.14.1 源码中的 go-sw64-1.14.1/src/cmd/vendor/golang.org/x/sys/unix 目录。
2.修改 vendor/github.com/containerd/fifo/handle_linux.go 文件,并将 const O_PATH=010000000 改为 040000000。
3.执行 make VERSION=18.09.9 进行本地编译,编译后得到的二进制文件在 build 目录下。
编译 dockerd
1.进入 docker 目录,替换 vendor/golang.org/x/sys/unix 目录为申威平台 golang1.14.1 源码中的 go-sw64-1.14.1/src/cmd/vendor/golang.org/x/sys/unix 目录。
2.修改 vendor/github.com/containerd/fifo/handle_linux.go 文件,将 const O_PATH=010000000 改为 040000000。
3.修改 vendor/github.com/containerd/containerd/platforms/database.go 文件,在 isKnownArch 函数中添加 sw64 。
4.修改 vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_64.go 文件,在文件头添加 //+build sw64 。
5.修改 hack/make/.binary 文件,取消 linux/sw64 平台的 buildmode=pie 选项。
6.执行 VERSION=18.09.9 GOPATH="/root/go" DOCKER_GITCOMMIT=new ./hack/make.sh
dynbinary-daemon 进行本地编译,编译后得到的二进制文件在 bundles 目录下。
编译 docker-init
1.解压 tini 源码,进入 tini 主目录;
2.执行 cmake . && make tini-static ,编译得到 tini-static 二进制文件;
3.执行 cp tini-static docker-init,得到 docker-init。
编译 docker-proxy
1.解压 libnetwork 源码到 ~/go/src/github.com 目录,重命名为 libnetwork ;
2.进入 libnetwork 主目录,替换 vendor/golang.org/x/sys/unix 目录为申威平台golang1.14.1 源码中的 go-sw64-1.14.1/src/cmd/vendor/golang.org/x/sys/unix 目录。
3.进入 cmd/proxy 目录,执行 CGO_ENABLED=0 go build -o docker-proxy ,得到 docker-proxy 二进制文件。
本地编译安装验证
1.按上述步骤安装 runc 、 containerd ,并启动 containerd 服务;
2.复制编译得到的二进制文件 docker 、 dockerd 、 docker-init 、 docker-proxy 到 /usr/bin 目录下;
- 将
docker/contrib/init/systemd目 录 下 的docker.service和docker.socket文 件 复 制 到/lib/systemd/system目录下,添加docker组:groupadd --system docker。
4.执行 systemctl daemon-reload 、 systemctl start docker 、 systemctl enable docker 启动 docker 服务。
测试镜像
拉取测试镜像
docker运行
F&Q
- 解决
Package libseccomp was not found in the pkg-config search path.
fatal error: btrfs/ioctl.h: No such file or directory
Package devmapper was not found in the pkg-config search path.
Iptables/1.8.2 Failed to initialize nft: Protocol not supported
附件
附件若无法下载请转到本文的 Notion 共享页下载:https://fryteacs.notion.site/SW-1621-UOS-20-Docker-c1d7ff16b6a4492a99c794fab253b24d