Skip to content
鼓励作者:欢迎打赏犒劳

dockerfile

常用的命令详解

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 建议定期运行以下命令,一键清除所有悬空镜像

如有转载或 CV 的请标注本站原文地址