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 更新软件源缓存

apt update

作用相当于 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 查询软件包

apt list                     # 列出所有可安装包(输出很长,略)
apt list openssh-server      # 查看指定包状态
apt list openssh*            # 通配符匹配
apt list 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 查看包详细信息

apt show 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 machines

1.4 搜索软件包

apt search --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 安装 / 重装 / 卸载

apt install apache2 -y        # 安装(-y 免确认)
apt reinstall apache2 -y      # 重装
apt remove apache2 -y         # 卸载(保留配置文件)
apt autoremove -y             # 清理不再需要的依赖包

安装指定版本(后面 containerd 就用到了):

apt install -y containerd=1.7.12-0ubuntu4

踩坑:1.7.12-Oubuntu4(大写 O)是误输,正确写法是 0ubuntu4(数字 0),否则报 E: Version '1.7.12-Oubuntu4' for 'containerd' was not found

1.6 升级软件包

apt upgrade                  # 常规升级(安装/升级现有包)
apt full-upgrade openssh-server -y   # 完整升级,可处理依赖变更

1.7 只下载不安装

apt download openssh-server

仅把 .deb 下载到当前目录,不做安装。

1.8 编辑软件源

export EDITOR=vim
apt edit-sources

默认用 vim 打开源配置文件,等价于手改 /etc/apt/sources.list

1.9 apt-file:查包内文件清单

apt-file 相当于 yum 的 yum provides,可以反查“某个文件属于哪个包 / 某个包包含哪些文件”:

apt install -y apt-file
apt-file update              # 更新文件索引(比较慢,本次中途放弃)
apt-file list openssh-server

apt-file --help 的完整用法以 ...... 省略。

1.10 apt-key:管理仓库密钥

apt-key

用于添加/删除软件源的 GPG 公钥,帮助信息较长,此处省略(新版本建议使用 sources.list 内的 signed-by 方式)。

↑ 回到目录


二、containerd 安装与配置

目标:安装 containerd 并配置镜像加速,为 nerdctl/K8s 做准备。

2.1 安装指定版本

apt list containerd -a
apt install -y containerd=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.io
cat > /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"]
EOF

registry.k8s.io 加速(K8s 官方镜像):

mkdir -p /etc/containerd/certs.d/registry.k8s.io
cat > /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.cloud
cat > /etc/containerd/certs.d/hub.laoma.cloud/hosts.toml << EOF
server = "http://hub.laoma.cloud"

[host."http://hub.laoma.cloud"]
  capabilities = ["pull", "resolve"]
EOF

2.4 K8s 环境内核参数准备

加载网络相关内核模块并开启转发,属于部署 K8s 的标准前置步骤:

modprobe -a overlay br_netfilter

cat > /etc/modules-load.d/k8s-net.conf << EOF
br_netfilter
overlay
EOF

cat > /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
EOF

sysctl -p /etc/sysctl.d/k8s.conf

生效验证:

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

2.5 重启 containerd 使配置生效

systemctl restart containerd

↑ 回到目录


三、nerdctl 安装与 bash 补全

nerdctl 是 containerd 的 Docker 兼容命令行工具。

3.1 安装 nerdctl 与 CNI 插件

wget http://192.168.46.200/class/course-materials/softwares/stage03/nerdctl-1.7.7-linux-amd64.tar.gz
tar -xf nerdctl-1.7.7-linux-amd64.tar.gz -C /usr/bin/

wget http://192.168.46.200/class/course-materials/softwares/stage03/cni-plugins-linux-amd64-v1.6.0.tgz
mkdir -p /opt/cni/bin
tar -xf cni-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。解决:

apt install -y bash-completion
source /root/.bashrc

补全脚本放哪其实无所谓(系统装好 bash-completion 后自动加载),本次把之前手动生成的脚本删掉、直接依赖系统机制:

rm -f /etc/bash_completion.d/nerdctl
source /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 ls
REPOSITORY                    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 KiB

4.3 查看镜像详情

nerdctl image inspect busybox

输出 JSON 格式,包含 IdRepoTagsRepoDigestsCreatedConfig 等,长输出以 ...... 省略。

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 -u admin
nerdctl push hub.laoma.cloud/ningcode/nginx:1.27

4.5 导出与导入

nerdctl image save busybox -o busybox.tar    # 导出为 tar
nerdctl image rm busybox                     # 删除本地镜像
nerdctl image load -i busybox.tar            # 从 tar 导入

4.6 清理与历史

nerdctl image prune -a --force   # 清理全部未使用镜像
nerdctl image history hub.laoma.cloud/library/mysql   # 查看分层历史
nerdctl image rm docker.io/library/mysql

注意:镜像删除要用完整仓库名。日志中先执行 nerdctl image rm docker.io/library/mysqlno such image,因为实际拉取的镜像名是 hub.laoma.cloud/library/mysql

↑ 回到目录


五、容器管理(nerdctl container)

5.1 运行容器

nerdctl container run -it ubuntu          # 交互式运行,直接进入容器
nerdctl run --name web -d hub.laoma.cloud/library/nginx:1.27   # 后台运行 nginx
nerdctl run -d nginx                      # 简写形式

注意:nerdctl 不能省略,日志中误输 run --name web ... 直接报 -bash: run: command not found

5.2 查看容器

nerdctl container ls      # 只显示运行中的容器
nerdctl container ls -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-ed112

5.3 生命周期管理

nerdctl container rename ubuntu-1 ubuntu   # 改名
nerdctl container stop 775                 # 停止
nerdctl container start 775                # 启动
nerdctl container restart 775              # 重启
nerdctl container pause 775 / unpause 775  # 暂停 / 恢复
nerdctl container rm 592                   # 删除(需先 stop)

5.4 查看容器详情与“杀进程”实验

nerdctl container inspect 775
nerdctl container inspect 775 | grep Pid

通过 inspect 拿到容器主进程 PID 后,直接 kill 59856 模拟容器主进程被杀的场景(进程退出容器即停止)。

5.5 在容器内执行命令

nerdctl exec busybox-af1d1 -- ip a    # 查看容器内网络
nerdctl exec busybox-b2f40 -- ls /data/f1

注意 -- 前后要有空格:--ip 会报参数解析错误。

5.6 查看日志

nerdctl container logs bb3f

5.7 端口映射

nerdctl container run --name nginx -d -p 8080:80 nginx
nerdctl container port nginx
80/tcp -> 0.0.0.0:8080

验证访问:

curl 10.1.8.10:8080

返回 Welcome to nginx! 的 HTML 页面,端口映射成功。

↑ 回到目录


六、容器网络

6.1 默认 bridge 网络

nerdctl network ls
nerdctl network inspect bridge
{
    "Name": "bridge",
    "IPAM": { "Config": [ { "Subnet": "10.4.0.0/24", "Gateway": "10.4.0.1" } ] },
    "Labels": { "nerdctl/default-network": "true" }
}

宿主机侧网卡:

ip addr show nerdctl0
3: nerdctl0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    inet 10.4.0.1/24 brd 10.4.0.255 scope global nerdctl0

6.2 容器内 IP

nerdctl exec busybox-af1d1 -- ip a

容器内 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 直接互通:

curl 10.4.0.3    # 返回 nginx 欢迎页

↑ 回到目录


七、数据卷与 namespace

7.1 挂载宿主机目录(bind mount)

mkdir -p /data
nerdctl run -d -v /data/:/data busybox -- sleep infinity

宿主机建文件,容器内立即可见:

touch /data/f1
nerdctl exec busybox-b2f40 -- ls /data/f1

7.2 命名卷(named volume)

nerdctl run -d -v data:/data busybox -- sleep infinity
nerdctl exec busybox-3f2dc -- touch /data/f1
nerdctl volume ls

误输 nerdctl -d -v ...(漏了 run)会报 unknown shorthand flag: 'd'

7.3 namespace(命名空间)

nerdctl namespace ls
NAME       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)在本次已提前配置好。

更多推荐