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

