通过docker commit构建自定义镜像

基于 Ubuntu 基础镜像构建包含 ping、tracert、fping、mtr、nmap 等网络工具的自定义镜像的详细示例

文章目录

  • 构建自定义镜像
  • 验证自定义镜像
  • 临时运行自定义镜像
  • 后台运行自定义镜像

构建

首先获取官方 Ubuntu 镜像(以最新版为例)

docker pull ubuntu:latest

启动一个基于 Ubuntu 镜像的容器,并进入命令行交互模式(--name 为容器命名,方便后续操作)

docker run -it --name network-tools-temp ubuntu:latest /bin/bash

# -it:交互式终端模式(确保能输入命令)
# --name network-tools-temp:给容器起一个临时名称
# /bin/bash:进入 bash 终端

在容器的 bash 终端中,执行以下命令安装工具(需先更新 apt 源,否则可能找不到包)

# 更新 apt 源(必须先执行,否则可能无法安装包)
apt-get update

# 安装所需工具(逐个对应命令):
# - ping:来自 iputils-ping 包
# - tracert:Ubuntu 中对应 traceroute 命令,来自 traceroute 包
# - fping:来自 fping 包
# - mtr:来自 mtr 包
# - nmap:来自 nmap 包
apt-get install -y \
iputils-ping \
traceroute \
fping \
mtr \
nmap

在容器内执行以下命令,确认工具已正常安装

# 验证 ping
ping -c 2 www.baidu.com

# 验证 traceroute(对应 tracert 功能)
traceroute www.baidu.com

# 验证 fping
fping www.baidu.com

# 验证 mtr(按 q 退出)
mtr www.baidu.com

# 验证 nmap
nmap --version

退出容器并提交为新镜像

# 退出容器终端
exit

# 用 docker commit 将修改后的容器提交为新镜像
docker commit network-tools-temp network-tools:v1

验证

在 Docker 中,查看本地镜像

docker images
# 或
docker image ls

REPOSITORY TAG IMAGE ID CREATED SIZE
network-tools v1 72aed6a873a6 31 minutes ago 358MB

执行后会显示本地所有镜像的列表,包含以下信息:

  • REPOSITORY:镜像的仓库名称(如 ubuntu、network-tools)
  • TAG:镜像的标签(版本标识,如 latest、v1)
  • IMAGE ID:镜像的唯一 ID(简写形式)
  • CREATED:镜像的创建时间
  • SIZE:镜像大小

临时运行自定义镜像

  • docker exec 会在运行中的容器内执行指定命令,并将输出返回给宿主机终端。
  • 容器必须处于运行状态(可通过 docker ps 查看运行中的容器)
  • --rm 容器执行完命令后自动删除(避免残留无用容器)
# 格式:docker run --rm 镜像名 容器内的命令 [参数]
docker run --rm network-tools:v1 traceroute www.baidu.com

后台运行自定义镜像

Docker 容器的运行依赖于 “主进程”:如果主进程退出,容器会立即停止。
因此,后台运行容器时,必须指定一个不会自动退出的主进程(如 tail -f /dev/null、sleep infinity 等),确保容器持续运行。
通过这种方式,network-tools 容器会在后台常驻,随时可以通过 docker exec 调用其中的 traceroute、mtr 等工具,无需每次临时启动容器。

# 基于之前构建的 network-tools:v1 镜像,用以下命令在后台运行容器
docker run -d --name network-tools network-tools:v1 tail -f /dev/null

# 验证容器是否在后台运行
docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5c45c309ba9 network-tools:v1 "tail -f /dev/null" 30 minutes ago Up 30 minutes network-tools

使用后台容器中的工具

it:在执行交互式命令(如 mtr、bash)时必须添加,确保终端能接收输入

# 示例:执行 traceroute
docker exec network-tools traceroute www.baidu.com

# 示例:执行 mtr(按 q 退出,输出会显示在宿主机终端)
docker exec -it network-tools mtr www.baidu.com # 带 -it 支持交互(如 mtr 需要键盘操作)

# 示例:进入容器交互终端(临时操作)
docker exec -it network-tools /bin/bash

停止 / 重启后台容器

docker stop network-tools # 停止容器
docker start network-tools # 重启已停止的容器(仍会在后台运行)
docker rm network-tools # 删除容器(需先停止)