Ubuntu :apt 包管理与 containerd + nerdctl 容器化入门
整理自 2026-08-04 一次完整的终端实操日志(11:05 — 16:59)。已忽略误输、重复内容,超长的帮助信息以
......省略。环境:Ubuntu(主机名ubuntu2204,软件源为 noble/24.04,apt 2.7.14,root 用户)。
📑 目录
💡 点击章节标题可跳转,每个章节末尾都有「回到目录」链接。
| 章节 | 核心内容 |
|---|---|
| ① apt 包管理(对标 yum) | 软件源缓存、查询、安装、卸载、升级、源与密钥 |
| ② containerd 安装与配置 | 指定版本安装、certs.d 镜像加速、K8s 内核参数 |
| ③ nerdctl 安装与 bash 补全 | 二进制安装、CNI 插件、bash 补全踩坑 |
| ④ 镜像管理 nerdctl image | pull、tag、login、push、save/load、prune |
| ⑤ 容器管理 nerdctl container | 运行、生命周期、exec、日志、端口映射 |
| ⑥ 容器网络 | bridge 子网、容器 IP、容器互通验证 |
| ⑦ 数据卷与 namespace | bind mount、命名卷、k8s.io 命名空间 |
| ⑧ 命令速查表 | apt vs yum 对照、nerdctl 常用命令 |
一、apt 包管理(对标 yum)
apt 是 Debian/Ubuntu 系的包管理器,功能上对标 CentOS 的 yum。本次从帮助信息开始逐一实践。
1.1 更新软件源缓存
aptupdate作用相当于yum makecache,把阿里云等源的软件包索引拉到本地:
Get:1 http://mirrors.aliyun.com/ubuntu noble InRelease [256 kB] ... Fetched 38.1 MB in 56s (685 kB/s) 286 packages can be upgraded. Run 'apt list --upgradable' to see them.1.2 查询软件包
aptlist# 列出所有可安装包(输出很长,略)aptlist openssh-server# 查看指定包状态aptlist openssh*# 通配符匹配aptlist openssh-server-a# 查看该包所有可用版本-a显示多版本,例如:
openssh-server/noble-updates,noble-security 1:9.6p1-3ubuntu13.18 amd64 [upgradable from: 1:9.6p1-3ubuntu13] openssh-server/noble,now 1:9.6p1-3ubuntu13 amd64 [installed,upgradable to: 1:9.6p1-3ubuntu13.18]1.3 查看包详细信息
aptshow openssh-server输出包含版本、维护者、依赖、大小、描述等,如:
Package: openssh-server Version: 1:9.6p1-3ubuntu13.18 Priority: optional Section: net Source: openssh ... Depends: adduser, libpam-modules, ... Download-Size: 511 kB Description: secure shell (SSH) server, for secure access from remote machines1.4 搜索软件包
aptsearch --names-only apache2只按包名匹配(不加--names-only会做全文搜索),结果如:
apache2/noble-updates,noble-security 2.4.58-1ubuntu8.15 amd64 Apache HTTP Server apache2-bin/... Apache HTTP Server (modules and other binary files) apache2-data/... Apache HTTP Server (common files)1.5 安装 / 重装 / 卸载
aptinstallapache2-y# 安装(-y 免确认)aptreinstall apache2-y# 重装aptremove apache2-y# 卸载(保留配置文件)aptautoremove-y# 清理不再需要的依赖包安装指定版本(后面 containerd 就用到了):
aptinstall-ycontainerd=1.7.12-0ubuntu4踩坑:
1.7.12-Oubuntu4(大写 O)是误输,正确写法是0ubuntu4(数字 0),否则报E: Version '1.7.12-Oubuntu4' for 'containerd' was not found。
1.6 升级软件包
aptupgrade# 常规升级(安装/升级现有包)aptfull-upgrade openssh-server-y# 完整升级,可处理依赖变更1.7 只下载不安装
aptdownload openssh-server仅把.deb下载到当前目录,不做安装。
1.8 编辑软件源
exportEDITOR=vimaptedit-sources默认用 vim 打开源配置文件,等价于手改/etc/apt/sources.list。
1.9 apt-file:查包内文件清单
apt-file相当于 yum 的yum provides,可以反查“某个文件属于哪个包 / 某个包包含哪些文件”:
aptinstall-yapt-file apt-file update# 更新文件索引(比较慢,本次中途放弃)apt-file list openssh-serverapt-file --help的完整用法以......省略。
1.10 apt-key:管理仓库密钥
apt-key用于添加/删除软件源的 GPG 公钥,帮助信息较长,此处省略(新版本建议使用sources.list内的signed-by方式)。
↑ 回到目录
二、containerd 安装与配置
目标:安装 containerd 并配置镜像加速,为 nerdctl/K8s 做准备。
2.1 安装指定版本
aptlist containerd-aaptinstall-ycontainerd=1.7.12-0ubuntu4安装时自动带上依赖runc:
The following NEW packages will be installed: containerd runc Need to get 48.2 MB of archives.2.2 生成默认配置
mkdir/etc/containerd containerd config default>/etc/containerd/config.toml默认配置里config_path是空的,需要改成 certs.d 目录以启用镜像加速:
[plugins."io.containerd.grpc.v1.cri".registry] config_path = "/etc/containerd/certs.d"2.3 配置镜像加速(certs.d)
containerd 从 1.7 起支持按域名配置镜像仓库镜像(类似 Docker 的 daemon.json mirrors),配置目录为/etc/containerd/certs.d/<域名>/hosts.toml。
docker.io(Docker Hub)加速:
mkdir-p/etc/containerd/certs.d/docker.iocat>/etc/containerd/certs.d/docker.io/hosts.toml<<EOF server = "https://registry-1.docker.io" [host."https://docker.m.daocloud.io"] capabilities = ["pull", "resolve"] [host."https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com"] capabilities = ["pull", "resolve"] EOFregistry.k8s.io 加速(K8s 官方镜像):
mkdir-p/etc/containerd/certs.d/registry.k8s.iocat>/etc/containerd/certs.d/registry.k8s.io/hosts.toml<<EOF server = "https://registry.k8s.io" # 首选 DaoCloud [host."https://k8s.m.daocloud.io"] capabilities = ["pull", "resolve"] [host."https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com"] capabilities = ["pull", "resolve"] EOF内网/私有仓库 hub.laoma.cloud:
mkdir-p/etc/containerd/certs.d/hub.laoma.cloudcat>/etc/containerd/certs.d/hub.laoma.cloud/hosts.toml<<EOF server = "http://hub.laoma.cloud" [host."http://hub.laoma.cloud"] capabilities = ["pull", "resolve"] EOF2.4 K8s 环境内核参数准备
加载网络相关内核模块并开启转发,属于部署 K8s 的标准前置步骤:
modprobe-aoverlay br_netfiltercat>/etc/modules-load.d/k8s-net.conf<<EOF br_netfilter overlay EOFcat>/etc/sysctl.d/k8s.conf<<'EOF' net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 EOFsysctl-p/etc/sysctl.d/k8s.conf生效验证:
net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 12.5 重启 containerd 使配置生效
systemctl restart containerd↑ 回到目录
三、nerdctl 安装与 bash 补全
nerdctl 是 containerd 的 Docker 兼容命令行工具。
3.1 安装 nerdctl 与 CNI 插件
wgethttp://192.168.46.200/class/course-materials/softwares/stage03/nerdctl-1.7.7-linux-amd64.tar.gztar-xfnerdctl-1.7.7-linux-amd64.tar.gz-C/usr/bin/wgethttp://192.168.46.200/class/course-materials/softwares/stage03/cni-plugins-linux-amd64-v1.6.0.tgzmkdir-p/opt/cni/bintar-xfcni-plugins-linux-amd64-v1.6.0.tgz-C/opt/cni/bin验证版本:
$ nerdctl version Client: Version: v1.7.7 OS/Arch: linux/amd64 Server: containerd: ...3.2 bash 补全(含踩坑)
生成补全脚本时一直报错:
-bash: _get_comp_words_by_ref: command not found原因是系统没装bash-completion。解决:
aptinstall-ybash-completionsource/root/.bashrc补全脚本放哪其实无所谓(系统装好bash-completion后自动加载),本次把之前手动生成的脚本删掉、直接依赖系统机制:
rm-f/etc/bash_completion.d/nerdctlsource/root/.bashrc↑ 回到目录
四、镜像管理(nerdctl image)
4.1 拉取镜像
nerdctl pull busybox# Docker Hub(走加速)nerdctl pull registry.k8s.io/pause:3.9# K8s 沙箱镜像(pause)nerdctl pull hub.laoma.cloud/library/mysql# 内网仓库镜像pull 过程中可见resolving | downloading的进度条,走 hosts.toml 配置的加速镜像。
4.2 查看镜像
nerdctl images# 或 nerdctl image lsREPOSITORY TAG IMAGE ID PLATFORM SIZE busybox latest dc2d74b28e4c linux/amd64 4.4 MiB ubuntu latest 678c6550cc43 linux/amd64 109.8 MiB hub.laoma.cloud/library/mysql latest 3b1edfde8351 linux/amd64 938.2 MiB hub.laoma.cloud/library/nginx 1.27 114dff0fc8ee linux/amd64 197.3 MiB registry.k8s.io/pause 3.9 7031c1b28338 linux/amd64 732.0 KiB4.3 查看镜像详情
nerdctl image inspect busybox输出 JSON 格式,包含Id、RepoTags、RepoDigests、Created、Config等,长输出以......省略。
4.4 打标签、登录与推送
nerdctl tag busybox mage161196/busybox nerdctl image tag hub.laoma.cloud/library/nginx:1.27 hub.laoma.cloud/ningcode/nginx:1.27 nerdctl login hub.laoma.cloud-uadmin nerdctl push hub.laoma.cloud/ningcode/nginx:1.274.5 导出与导入
nerdctl image save busybox-obusybox.tar# 导出为 tarnerdctl imagermbusybox# 删除本地镜像nerdctl image load-ibusybox.tar# 从 tar 导入4.6 清理与历史
nerdctl image prune-a--force# 清理全部未使用镜像nerdctl imagehistoryhub.laoma.cloud/library/mysql# 查看分层历史nerdctl imagermdocker.io/library/mysql注意:镜像删除要用完整仓库名。日志中先执行
nerdctl image rm docker.io/library/mysql报no such image,因为实际拉取的镜像名是hub.laoma.cloud/library/mysql。
↑ 回到目录
五、容器管理(nerdctl container)
5.1 运行容器
nerdctl container run-itubuntu# 交互式运行,直接进入容器nerdctl run--nameweb-dhub.laoma.cloud/library/nginx:1.27# 后台运行 nginxnerdctl run-dnginx# 简写形式注意:
nerdctl不能省略,日志中误输run --name web ...直接报-bash: run: command not found。
5.2 查看容器
nerdctl containerls# 只显示运行中的容器nerdctl containerls-a# 显示所有容器(含已退出)CONTAINER ID IMAGE STATUS NAMES 32c67ad53ae5 hub.laoma.cloud/library/nginx:1.27 Up web 9fe197759311 docker.io/library/ubuntu:latest Exited (0) ubuntu ed1123ae9708 docker.io/library/ubuntu:latest Created ubuntu-ed1125.3 生命周期管理
nerdctl containerrenameubuntu-1 ubuntu# 改名nerdctl container stop775# 停止nerdctl container start775# 启动nerdctl container restart775# 重启nerdctl container pause775/ unpause775# 暂停 / 恢复nerdctl containerrm592# 删除(需先 stop)5.4 查看容器详情与“杀进程”实验
nerdctl container inspect775nerdctl container inspect775|grepPid通过 inspect 拿到容器主进程 PID 后,直接kill 59856模拟容器主进程被杀的场景(进程退出容器即停止)。
5.5 在容器内执行命令
nerdctlexecbusybox-af1d1 --ipa# 查看容器内网络nerdctlexecbusybox-b2f40 --ls/data/f1注意
--前后要有空格:--ip会报参数解析错误。
5.6 查看日志
nerdctl container logs bb3f5.7 端口映射
nerdctl container run--namenginx-d-p8080:80 nginx nerdctl container port nginx80/tcp -> 0.0.0.0:8080验证访问:
curl10.1.8.10:8080返回Welcome to nginx!的 HTML 页面,端口映射成功。
↑ 回到目录
六、容器网络
6.1 默认 bridge 网络
nerdctl networklsnerdctl network inspect bridge{"Name":"bridge","IPAM":{"Config":[{"Subnet":"10.4.0.0/24","Gateway":"10.4.0.1"}]},"Labels":{"nerdctl/default-network":"true"}}宿主机侧网卡:
ipaddr show nerdctl03: nerdctl0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ... inet 10.4.0.1/24 brd 10.4.0.255 scope global nerdctl06.2 容器内 IP
nerdctlexecbusybox-af1d1 --ipa容器内eth0从 bridge 自动分配:
2: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 ... inet 10.4.0.12/24 brd 10.4.0.255 scope global eth0本次实践里 nginx 容器web拿到10.4.0.3,容器间通过 bridge 直接互通:
curl10.4.0.3# 返回 nginx 欢迎页↑ 回到目录
七、数据卷与 namespace
7.1 挂载宿主机目录(bind mount)
mkdir-p/data nerdctl run-d-v/data/:/data busybox --sleepinfinity宿主机建文件,容器内立即可见:
touch/data/f1 nerdctlexecbusybox-b2f40 --ls/data/f17.2 命名卷(named volume)
nerdctl run-d-vdata:/data busybox --sleepinfinity nerdctlexecbusybox-3f2dc --touch/data/f1 nerdctl volumels误输
nerdctl -d -v ...(漏了 run)会报unknown shorthand flag: 'd'。
7.3 namespace(命名空间)
nerdctl namespacelsNAME CONTAINERS IMAGES VOLUMES LABELS default 9 5 1注:K8s 使用 containerd 时默认命名空间是
k8s.io,与 nerdctl 默认的default不同。
↑ 回到目录
八、命令速查表
apt vs yum 对照
| 功能 | yum | apt |
|---|---|---|
| 更新缓存 | yum makecache | apt update |
| 搜索 | yum search | apt search |
| 查看详情 | yum info | apt show |
| 安装 | yum install | apt install |
| 指定版本安装 | yum install pkg-版本 | apt install pkg=版本 |
| 重装 | yum reinstall | apt reinstall |
| 卸载 | yum remove | apt remove |
| 清理依赖 | yum autoremove | apt autoremove |
| 升级 | yum update | apt upgrade / full-upgrade |
| 查文件所属包 | yum provides | apt-file search / list |
| 只下载 | yumdownloader | apt download |
| 编辑源 | vim /etc/yum.repos.d/ | apt edit-sources |
nerdctl 常用命令
| 操作 | 命令 |
|---|---|
| 拉取镜像 | nerdctl pull <镜像> |
| 查看镜像 | nerdctl images |
| 删除镜像 | nerdctl image rm <镜像> |
| 导出/导入 | nerdctl image save -o x.tar <镜像>/nerdctl image load -i x.tar |
| 登录/推送 | nerdctl login <仓库>/nerdctl push <仓库>/<镜像> |
| 运行容器 | nerdctl run -d -p 8080:80 --name nginx nginx |
| 查看容器 | nerdctl container ls -a |
| 启停/重启 | nerdctl container start/stop/restart <ID> |
| 暂停/恢复 | nerdctl container pause/unpause <ID> |
| 进容器执行 | nerdctl exec <ID> -- <命令> |
| 看日志 | nerdctl container logs <ID> |
| 端口查看 | nerdctl container port <名称> |
| 网络管理 | nerdctl network ls/inspect |
| 数据卷 | nerdctl volume ls/create/rm |
| 命名空间 | nerdctl namespace ls |
↑ 回到目录
小结
- apt 是 Ubuntu 的包管理核心,绝大多数操作与 yum 一一对应,重点是
apt install 包名=版本号这种指定版本安装方式。 - containerd 的镜像加速不再靠 daemon.json,而是每个仓库域名一个
certs.d/<域名>/hosts.toml,并且要在config.toml里把config_path指到/etc/containerd/certs.d。 - nerdctl 是 containerd 的“docker 命令”,镜像、容器、网络、卷、namespace 的用法与 Docker 高度一致,适合作为 K8s 落地前的容器运行时演练。
- 部署 K8s 前的内核参数(overlay、br_netfilter、ip_forward)在本次已提前配置好。