文章总结: 本文详细讲解Docker镜像构建方法,重点介绍Dockerfile的定义与核心指令,涵盖FROM、RUN、COPY、ADD、EXPOSE、CMD等指令的作用与使用细节。通过构建自定义Nginx镜像的实战示例,完整演示了从编写Dockerfile到构建镜像及运行容器的操作流程,为容器化部署提供了清晰指导。 综合评分: 71 文章分类: 安全开发,其他
构建Docker镜像 | Docker容器【五】
原创
北京昊网 北京昊网
北京昊网CTF题解
2026年2月27日 11:05 北京
关注北京昊网公众号,与大家共话网络安全。
五、Docker 镜像的构建
前面我们都是 “用别人做好的镜像”(如 Docker Hub 的 Nginx 镜像),但实际工作中需要 “根据业务需求定制镜像”(比如在基础镜像中安装自己的代码、配置文件)—— 这就需要 Dockerfile;
5.1、什么是 Dockerfile?
Dockerfile是一个文本文件,里面包含一系列 “指令”(如 FROM、RUN、COPY),每条指令对应镜像的一个分层。Docker 会按指令顺序执行,最终生成一个自定义镜像;
5.2、Dockerfile 核心指令
1、创建项目目录
mkdir my-nginx创建文件夹cd my-nginx进入文件夹
在终端中执行以下命令,创建一个专门的文件夹(比如叫 my-nginx),并进入该目录,后续所有操作都在这个目录下进行,确保文件路径正确;
2、编写 Dockerfile
在 my-nginx 目录下,创建一个名为 Dockerfile 的文件(注意:文件名必须是 Dockerfile,没有后缀);
vim Dockerfile
基础镜像:使用最新版 CentOS,建议改为 centos:7 或 centos:8,因 latest 标签可能失效FROM centos:latest(8)维护者信息(可选,用于标识镜像作者)LABEL maintainer="[email protected]"切换到 root 用户(默认可能就是 root,但显式声明更稳妥)USER root创建数据卷:用于持久化数据(比如 Nginx 的日志、配置)VOLUME ["/data"]替换 yum 源为阿里云(加速后续软件安装)RUN cd /etc/yum.repos.d/ && rm -rf *.repo && curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo && yum clean all && yum makecacheRUN yum install -y epel-release安装依赖和 NginxRUN yum install -y gcc gcc-c++ pcre pcre-devel openssl openssl-devel nginx复制本地的 index.html 到容器内 Nginx 的默认网页目录,如果不需要自定义首页,可以删除,会使用 Nginx 自带的默认首页COPY index.html /usr/share/nginx/html从远程 URL 下载 Nginx 源码包到容器内的 /root 目录(示例用,这里安装的是 yum 版 Nginx)ADD https://nginx.org/download/nginx-1.22.1.tar.gz /root声明容器运行时监听 80 端口(仅声明,不实际映射)EXPOSE 80容器启动时执行的命令:启动 Nginx 并以前台模式运行(避免容器启动后立即退出)CMD ["nginx", "-g", "daemon off;"]
FROM centos:8LABEL maintainer="[email protected]"USER rootVOLUME ["/data"]RUN cd /etc/yum.repos.d/ && rm -rf *.repo && curl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo && yum clean all && yum makecacheRUN yum install -y gcc gcc-c++ pcre pcre-devel openssl openssl-devel nginxADD https://nginx.org/download/nginx-1.22.1.tar.gz /rootEXPOSE 80CMD ["nginx", "-g", "daemon off;"]
| | | | | | — | — | — | — | | 指令 | 示例 | 核心作用 | 关键细节 | | FROM | FROM centos:latest | 指定基础镜像(所有镜像都必须基于一个基础镜像) | – 基础镜像可以是官方镜像(如 centos、alpine),也可以是私有仓库的镜像 – alpine 是最小的 Linux 基础镜像(仅几 MB),比 centos(几百 MB)更节省空间 | | LABEL | LABEL maintainer=”[email protected]” | 添加元数据(如作者、版本、描述) | 用 docker inspect 镜像名 能看到这些元数据,方便团队协作时识别镜像归属 | | USER | USER root | 指定构建镜像和运行容器时的用户 | – 默认是 root(管理员用户),如果需要限制权限,可以切换为普通用户(如 USER nobody) | | VOLUME | VOLUME [“/data”] | 创建数据卷挂载点 | – 作用:容器运行时,/data 目录会自动挂载为数据卷(数据卷的好处是 “容器删除后,数据不丢失”) – 常用于存储数据库数据、日志等需要持久化的内容 | | RUN | RUN cd /etc/yum.repos.d/ && rm -rf *.repo && curl … | 在构建镜像时执行命令(如安装软件、修改配置) | – 多个命令可以用 && 连接(减少分层数量,优化镜像体积) – 示例中是 “删除 CentOS 默认的 yum 源,替换为阿里云源,再清理缓存”,目的是加速后续软件安装 | | COPY | COPY index.html /usr/share/nginx/html | 从主机复制文件 / 目录到镜像中 | – 只能复制主机 “构建上下文” 内的文件(构建上下文是 docker build 命令后的 .,即当前目录)- 示例中是把主机的 index.html(自定义首页)复制到镜像的 Nginx 网页目录,实现 “自定义 Nginx 首页”。 | | ADD | ADD https://nginx.org/download/nginx-1.22.1.tar.gz /root | 类似 COPY,但支持自动解压 tar 文件和下载远程 URL | – 示例中是 “从 Nginx 官网下载压缩包,直接放到镜像的 /root 目录” – 注意:如果复制的是本地 tar 文件,ADD 会自动解压,COPY 不会(这是两者的核心区别) | | EXPOSE | EXPOSE 80 | 声明容器运行时监听的端口(仅为 “文档说明”,不实际映射) | – 作用:告诉使用者 “这个容器需要映射哪个端口”,比如 EXPOSE 80 表示容器内的 Nginx 监听 80 端口- 实际端口映射需要在 docker run 时用 -p 主机端口:容器端口(如 -p 80:80)。 | | CMD | CMD [“nginx”, “-g”, “daemon off;”] | 指定容器启动时执行的命令(可被 docker run 的参数覆盖) | – 示例中是 “启动 Nginx,并以非守护进程模式运行”(Nginx 默认是后台运行,Docker 要求容器的前台进程不退出,否则容器会停止,所以需要 daemon off;) – 一个 Dockerfile 只能有一个 CMD,多个 CMD 只有最后一个生效 | | ENTRYPOINT | ENTRYPOINT [“nginx”, “-g”, “daemon off;”] | 类似 CMD,但不会被 docker run 的参数覆盖 | – 比如用 ENTRYPOINT 启动 Nginx 后,docker run 镜像名 -v 会执行 nginx -g “daemon off;” -v(参数 -v 追加到后面) – 常用于 “固定容器启动命令,只允许追加参数” 的场景(如数据库镜像) | | ENV | ENV MY_ENV=value | 设置环境变量(构建镜像和运行容器时都生效) | – 示例:ENV NGINX_VERSION=1.22.1,后续指令可引用这个变量(如 RUN wget https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz),方便版本管理 | | WORKDIR | WORKDIR /root | 设置后续指令的工作目录(类似 cd 命令) | – 比如 WORKDIR /root 后,后续的 RUN、COPY 指令都会在 /root 目录下执行,不用每次写绝对路径 |
3、构建并运行自定义镜像
有了 Dockerfile 后,需要通过 docker build 命令生成镜像,再用 docker run 启动容器;
构建镜像
docker build -t my-nginx:8 .
-t my-nginx:latest:指定镜像名(my-nginx)和标签(8);
.:指定 “构建上下文” 为当前目录(Docker 会读取当前目录下的 Dockerfile 和所有文件,用于构建)- 构建过程中会输出每一步指令的执行结果,最后显示 Successfully built 镜像ID 表示成功;
运行镜像
docker run -d --name my-nginx -p 80:80 my-nginx:8
如果运行失败,可能名为 my-nginx 的容器名称已被占用,Docker 不允许重复使用相同的容器名称;
docker stop my-nginxdocker rm my-nginxdocker run -d --name my-nginx -p 80:80 my-nginx:8
docker run:创建并启动容器的命令(镜像只是静态模板,容器才是运行的实例);
-d:–detach 的缩写,表示 “后台运行容器”。如果不加 -d,容器会占用当前终端,关闭终端则容器停止;
–name my-nginx:给容器起一个唯一的名字(my-nginx),方便后续操作(比如停止、删除)。如果不指定,Docker 会自动生成一个随机名称(如 angry_bell);
-p 80:80:–publish 的缩写,用于 “端口映射”,格式为 宿主机端口:容器内端口;
my-nginx:8:指定要运行的镜像;
| | | | |
| — | — | — | — |
| |
|
|
|
学网安,找北京昊网,就业有保障,带你冲刺10-40万年薪!
招生要求:
| | | | — | — | | 学历与年龄 | 30岁以下大学本科毕业生(条件优秀可放宽到专科) | | 能力 | 具备基本逻辑思维能力,可耐心排查问题,接受“终身学习“的行业属性 | | 目标 | 明确想从事网络安全相关岗位(如安全运维、渗透测试、安全服 务等 | | 健康 | 身心健康 |
适合人群:
| | | — | | 零基础,转行一族 | | 高校应往届与在校生 | | IT职场转型者 |
北京昊网科技网络安全工程师培训,前沿技能教学 + 项目实训 + 就业全流程服务,从技能打磨到岗位对接一站式赋能。
咨询对接:黎歌|18500324210(同微信)
签约《就业保障服务协议》,未达成协议内就业标准,全额退费。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:北京昊网CTF题解 北京昊网 北京昊网《构建Docker镜像 | Docker容器【五】》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论