惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
G
GRAHAM CLULEY
T
Threat Research - Cisco Blogs
Spread Privacy
Spread Privacy
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
NISL@THU
NISL@THU
Latest news
Latest news
N
News and Events Feed by Topic
量子位
爱范儿
爱范儿
M
MIT News - Artificial intelligence
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
A
Arctic Wolf
Google Online Security Blog
Google Online Security Blog
W
WeLiveSecurity
S
Security Affairs
Webroot Blog
Webroot Blog
B
Blog
N
Netflix TechBlog - Medium
Hugging Face - Blog
Hugging Face - Blog
I
InfoQ
博客园 - 司徒正美
H
Heimdal Security Blog
罗磊的独立博客
L
LINUX DO - 最新话题
Security Archives - TechRepublic
Security Archives - TechRepublic
博客园_首页
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
The Hacker News
The Hacker News
Y
Y Combinator Blog
C
CERT Recently Published Vulnerability Notes
C
Cybersecurity and Infrastructure Security Agency CISA
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
V
Vulnerabilities – Threatpost
T
The Exploit Database - CXSecurity.com
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
PCI Perspectives
PCI Perspectives
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
O
OpenAI News
S
Security @ Cisco Blogs
Google DeepMind News
Google DeepMind News

卡卡罗特

最后代码 | 卡卡罗特 swagger文档 | 卡卡罗特 react脚手架开发 | 卡卡罗特 python的对象增强 | 卡卡罗特 langchain实现Agent | 卡卡罗特 03.python列表集合元组字典 | 卡卡罗特 python依赖打包 | 卡卡罗特 python的异步 | 卡卡罗特 python的生成器 | 卡卡罗特 eino整合Tools | 卡卡罗特 eino实现Agent | 卡卡罗特 eino整合RAG | 卡卡罗特 docker打包go服务 | 卡卡罗特 01-docker入门 | 卡卡罗特 docker-compose | 卡卡罗特 linux安装docker | 卡卡罗特 hertz中间件 | 卡卡罗特 go整合向量数据库ChromaDB | 卡卡罗特 langchainjs | 卡卡罗特 ollama调用各大模型 | 卡卡罗特 spring-ai | 卡卡罗特 自定义一个MCP | 卡卡罗特 context.Context是什么? | 卡卡罗特 01-获取指定网站的所有的链接 | 卡卡罗特 01-Bing每日一图接口 | 卡卡罗特 02-腾讯API高清QQ头像https调用接口 | 卡卡罗特 openCV初体验 | 卡卡罗特 RWMutex读写锁 | 卡卡罗特 SyncMap的使用 | 卡卡罗特 defer的使用 | 卡卡罗特
dockerfile | 卡卡罗特
2026-05-10 · via 卡卡罗特

常用的命令详解 ​

run和cmd的区别 ​

run 是镜像构建时的命令

cmd 是容器启动时的命令

查看镜像是如何构建的 ​

它就像是在看这个镜像的“成长日记”或“施工记录”。它会按时间倒序列出这个镜像在制作过程中,每一层(Layer)都执行了什么操作、增加了多少体积以及是什么时候创建的

shell

docker history nginx:1.4

#默认情况下,为了排版整齐,Docker 会把很长的命令截断(显示为 ...)。如果你想看完整的命令内容,可以加上 --no-trunc 参数:
# 查看完整的历史记录,不截断长命令
docker history --no-trunc nginx:1.4

启动容器随机映射端口 ​

  • docker run -p (小写):手动指定映射(例如 -p 8080:80)。
  • docker run -P (大写):自动映射 EXPOSE 声明的端口到随机端口。

这个很特别,比如nginx镜像,我们一般启动容器的时候 ,都需要这样写 手动绑定端口 才能访问。

shell

## 将宿主机8080 绑定到镜像的80端口   我们访问127.0.0.1::8080 就可以了
docker run -d -p 8080:80  --name my-nginx nginx

但是,如果我们这样写的话,就会随机生成一个端口自动绑定

shell

docker run -d -P  --name my-nginx nginx

自动挂载卷 ​

比如我在Dockerfile文件里面写 VOLUME ["/data"]

当你构建了包含这行代码的镜像,并启动容器(且你没有手动指定挂载)时,Docker 会做以下操作:

  • 自动创建:Docker 会在宿主机上自动创建一个匿名卷。
  • 位置:这个卷通常位于宿主机的 /var/lib/docker/volumes/<随机长串ID>/_data。
  • 数据迁移:如果镜像原本的 /data 目录里有文件,Docker 会把这些文件自动复制到这个新卷里。

当你 在启动容器的时候 显示的指定挂载 docker run -d -v /my_host_data:/data my-image

  • 结果:你的指令优先级最高! Docker 会忽略 Dockerfile 里的自动分配,直接使用你指定的 /my_host_data 挂载到 /data。
  • 效果:这叫绑定挂载。数据存在你指定的文件夹,非常直观,方便备份和修改。

其实,在启动容器之后,可以通过 docker inspect 容器id 来查看详细的配置信息

shell

{
  "Mounts": [  // 如果有挂载  这里会显示宿主机的路径
    {
      "Type": "bind",
      "Source": "/data", //宿主机的路径
      "Destination": "/usr/share/nginx/html", // 容器内部的路径
      "Mode": "",
      "RW": true,
      "Propagation": "rprivate"
    }
  ],
  "NetworkSettings": {
    "Ports": {
      "80/tcp": [
        {
          "HostIp": "0.0.0.0",
          "HostPort": "32769"  // 被映射的宿主机端口
        },
        {
          "HostIp": "::",
          "HostPort": "32769"
        }
      ]
    }
  }
}

构建一个健康检查的镜像 ​

shell

# 最通用的实战写法
FROM alpine:3.19

RUN apk add --no-cache curl

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -fs http://localhost/ || exit 1

构建nginx镜像Dockerfile文件 ​

shell

FROM alpine:3.19

LABEL maintainer="liuzhw"

# 安装 nginx(Alpine 官方源)
RUN apk add --no-cache nginx wget

# 复制网站文件
COPY index.html /usr/share/nginx/html/

# 创建必要的目录(Alpine nginx 需要)
RUN mkdir -p /run/nginx

# 声明端口
EXPOSE 80

# 前台运行 nginx
ENTRYPOINT ["nginx", "-g", "daemon off;"]

构建

shell

docker build -t my-nginx:v1.0 .
  • docker build: 告诉 Docker 进行构建。
  • -t my-nginx:v1.0: 关键部分。给镜像起名为 my-nginx,标签为 v1.0。
  • .: 注意最后的点。它代表“当前目录”,告诉 Docker 去当前文件夹找 Dockerfile 和所需的文件(构建上下文)。

当重新构建的时候需要注意

当你使用相同的名称(例如 myapp:v1.0)重新构建时,Docker 会成功构建出新镜像,并将这个名字从旧镜像身上“摘下来”,贴到新构建的镜像上
假设你第一次构建了 my-nginx:v1.0,它的镜像 ID 是 1111111
然后你修改了代码或 Dockerfile,再次运行 docker build -t my-nginx:v1.0 .,构建了新的版本,新镜像 ID 是 22222222
旧镜像变孤儿:原来的 1111111 依然存在硬盘里,但它的名字变成了 <none>:<none>。这种没有名字、没人引用的镜像被称为悬空镜像。
如果不处理,这些 <none> 镜像会越积越多,占用大量磁盘空间。
docker image prune 建议定期运行以下命令,一键清除所有悬空镜像