Ubuntu系统和CentOS系统到底区别在哪?全面从docker到k8s进阶!!!
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 格式,包含 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 -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/mysql报no 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)在本次已提前配置好。
更多推荐
所有评论(0)