当前位置:首页 > 技术 > 正文内容

Docker 核心命令详解:镜像构建与容器管理

访客 技术 2026年7月14日 2

docker commit:从运行容器生成镜像

当需要对现有容器进行修改并保存为可复用的镜像时,docker commit 是常用的命令。它会基于容器当前状态创建一个新的镜像层。

docker commit [OPTIONS] 容器 [仓库名[:标签]]

常用参数说明:

  • -a--author:标注镜像作者信息
  • -m--message:添加提交说明
  • -p--pause:提交过程中暂停容器(默认开启)
  • -c--change:应用 Dockerfile 指令修改

实际应用示例:将 ID 为 f8a6b2c9e3d1 的容器打包为新镜像,并附加作者和描述。

$ docker commit -a "devops@company.com" -m "添加了定时任务配置" f8a6b2c9e3d1  webapp:v2.1
sha256:9e2f5c8d3a7b4e1f6c9d0a2b8e4f7c1d5a3b6e9f0c2d4a8b7e1f3c6d9a0b4e2f1

$ docker images webapp:v2.1
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
webapp       v2.1      9e2f5c8d3a7b   12 seconds ago   287 MB

docker rmi:清理本地镜像资源

镜像积累过多会占用大量磁盘空间,docker rmi 用于移除不再需要的本地镜像。

docker rmi [OPTIONS] 镜像 [镜像...]

关键参数:

  • -f--force:强制删除,即使镜像被容器引用
  • --no-prune:保留未被标签引用的父镜像(默认会清理)

强制删除指定镜像:

$ docker rmi -f myproject/backend:staging
Untagged: myproject/backend:staging
Deleted: sha256:3f7a9e2c5d8b1f4e6a0c9d2b5e8f1a7c4d6b3e9f0a2c8d4b7e1f3a6c9d0b4e2f1
Deleted: sha256:8b1f4e6a0c9d2b5e8f1a7c4d6b3e9f0a2c8d4b7e1f3a6c9d0b4e2f1a7c4d6b3e

docker build:基于 Dockerfile 构建镜像

这是将应用代码标准化打包的核心命令,通过解析 Dockerfile 中的指令序列完成镜像构建。

docker build [OPTIONS] 构建上下文路径 | URL | -

常用构建参数:

参数作用说明
-t, --tag为生成的镜像指定名称和标签
-f, --file指定非默认路径的 Dockerfile
--no-cache禁用构建缓存,确保全新构建
--build-arg传递构建时变量
--pull强制拉取基础镜像最新版本
--target多阶段构建时指定构建阶段
--network设置 RUN 指令执行时的网络模式

构建示例:

# 使用当前目录 Dockerfile,镜像标记为 api-gateway:1.0
docker build -t api-gateway:1.0 .

# 指定自定义 Dockerfile 路径
docker build -f ./docker/Dockerfile.prod -t api-gateway:prod .

# 从 Git 仓库直接构建
docker build -t demo-app:latest https://github.com/org/demo.git#main

# 带构建参数的复杂示例
docker build \
  --build-arg NODE_ENV=production \
  --build-arg API_VERSION=3.2 \
  --no-cache \
  -t frontend:release-v3 .

构建前 Docker 会自动校验 Dockerfile 语法,存在错误时将直接报错:

$ docker build -t test-image .
Sending build context to Docker daemon  4.096 kB
Error response from daemon: Dockerfile parse error line 7: unknown instruction: INSTAL

docker history:追溯镜像构建历程

该命令展示镜像各层的创建信息,便于排查镜像体积膨胀或安全问题。

docker history [OPTIONS] 镜像

查看镜像 myapp/web:v3 的详细构建历史:

$ docker history myapp/web:v3
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
7d8f9e3a2b1c   2 hours ago    /bin/sh -c #(nop)  CMD ["node" "server.js"]    0 B       
<missing>      2 hours ago    /bin/sh -c npm ci --only=production            45.2 MB   
<missing>      2 hours ago    /bin/sh -c #(nop) COPY . /app/                 2.1 kB    
<missing>      3 days ago     /bin/sh -c #(nop)  FROM node:18-alpine         0 B       
<missing>      3 days ago     /bin/sh -c #(nop) ADD file:abc123... in /      176.8 MB

docker run:启动并运行容器

作为最常用的 Docker 命令之一,docker run 负责创建新容器实例并执行指定命令。

docker run [OPTIONS] 镜像 [命令] [参数...]

核心参数分类说明:

运行模式控制

  • -d, --detach:后台守护运行
  • -i, --interactive:保持标准输入打开
  • -t, --tty:分配伪终端
  • --rm:容器停止后自动删除

网络与端口

  • -p, --publish:精确映射端口 主机端口:容器端口
  • -P, --publish-all:暴露 Dockerfile 中声明的所有端口到随机主机端口
  • --network:指定网络模式(bridge/host/none/自定义网络)

存储与资源

  • -v, --volume:挂载数据卷
  • -e, --env:设置环境变量
  • -m, --memory:限制内存使用
  • --cpus:限制 CPU 核心数

典型运行场景:

# 后台启动 Nginx,指定容器名称
docker run --name proxy-server -d nginx:alpine

# 交互式进入容器调试
docker run -it --rm ubuntu:22.04 /bin/bash

# 端口映射 + 目录挂载 + 环境变量
docker run -d \
  -p 8080:80 \
  -v /var/web/logs:/usr/share/nginx/logs \
  -e NGINX_WORKER_PROCESSES=4 \
  --name web-frontend \
  nginx:stable

# 绑定到特定网卡地址
docker run -p 127.0.0.1:3306:3306 -d mysql:8.0

# 使用自定义网络并连接其他容器
docker run -d \
  --network backend-net \
  --link redis-cache:redis \
  --link postgres-db:db \
  --name api-worker \
  myapp/worker:2.3

docker ps:容器状态查询

用于监控和管理运行中的容器实例,支持丰富的过滤和格式化选项。

docker ps [OPTIONS]

参数速查:

  • -a, --all:显示所有容器(含已停止)
  • -l, --latest:仅显示最近创建的容器
  • -n, --last:显示最近创建的 N 个
  • -q, --quiet:仅输出容器 ID
  • -s, --size:显示容器总文件大小
  • -f, --filter:按条件筛选(status/expose/name 等)
  • --format:自定义输出模板

实用查询示例:

# 查看所有运行中的容器
$ docker ps
CONTAINER ID   IMAGE            COMMAND                  STATUS          PORTS                    NAMES
e7f3a2b9c1d5   redis:7-alpine   "docker-entrypoint.s…"   Up 2 hours      0.0.0.0:6379->6379/tcp   cache-store
a4c8d1e5f7b2   postgres:15      "docker-entrypoint.s…"   Up 2 hours      0.0.0.0:5432->5432/tcp   user-database

# 获取所有容器 ID(常用于批量操作)
$ docker ps -aq
e7f3a2b9c1d5
a4c8d1e5f7b2
8f2b6c4d9a1e

# 筛选出状态为 exited 的容器
$ docker ps -f status=exited

# 格式化输出容器名称和 IP 地址
$ docker ps --format "table {{.Names}}\t{{.Networks}}"

docker images:本地镜像清单管理

查看和管理本地存储的镜像资源,支持按仓库名过滤。

docker images [OPTIONS] [仓库名[:标签]]

常用选项:

  • -a, --all:显示中间层镜像
  • --digests:显示镜像摘要
  • -q, --quiet:仅显示镜像 ID
  • --no-trunc:完整显示镜像 ID

查询示例:

$ docker images
REPOSITORY        TAG        IMAGE ID       CREATED        SIZE
api-gateway       2.1.0      4f8e2c7a9b1d   3 hours ago    156 MB
data-processor    latest     9c3d5f8e2a4b   2 days ago     412 MB
<none>            <none>     7b1e4f9c3d8a   2 days ago     89 MB

# 只查看指定仓库的镜像
$ docker images api-gateway
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
api-gateway   2.1.0     4f8e2c7a9b1d   3 hours ago   156 MB
api-gateway   2.0.9     2a7b9c4e1f8d   5 days ago    148 MB

容器网络连接基础

容器间通信是微服务部署的关键环节,Docker 提供了多种网络连接机制。最常用的方式是通过自定义网络实现容器互联,相比传统的 --link 参数,自定义网络具有更好的隔离性和 DNS 解析能力。

创建网络并启动互联容器:

# 创建桥接网络
docker network create --driver bridge app-network

# 在自定义网络中启动服务
docker run -d --name user-service --network app-network myapp/users:1.0
docker run -d --name order-service --network app-network myapp/orders:1.0

# 容器间可通过服务名直接通信
docker exec -it order-service ping user-service
标签: Docker

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。