在这篇文章中,你将学习如何从零开始构建一个 Docker 镜像,并使用 Dockerfile 将你的应用部署并运行在 Docker 容器中。
众所周知,Docker 是一个用于打包、部署和运行应用的轻量级容器工具。如果你想先了解 Docker 基础,可以参考相关入门文章。
如果你还没有安装 Docker,可参考官方安装指南。
构建 Docker 镜像最核心的组件就是 Dockerfile。
Dockerfile 是一个包含指令(INSTRUCTION)与参数(ARGUMENT)的简单文本文件。Docker 会根据 Dockerfile 中的内容自动构建镜像。
在 Dockerfile 中:
文件名是:Dockerfile或者dockerfile(无扩展名)
常见 Dockerfile 指令与解释
指令 | 含义 |
|---|---|
FROM | 指定基础镜像(来自 Docker Hub、GCR、Quay、ECR 等) |
RUN | 在镜像构建期间执行命令 |
ENV | 设置环境变量(构建期 + 容器运行时均可用) |
COPY | 复制本地文件到镜像 |
EXPOSE | 声明容器需要暴露的端口 |
ADD | COPY 的增强版(支持 URL、自动解压 tar),但官方推荐优先使用 COPY |
WORKDIR | 设置工作目录 |
VOLUME | 创建 / 挂载数据卷 |
USER | 指定容器运行使用的用户 |
LABEL | 为镜像添加元数据 |
ARG | 设置构建期变量(不会出现在运行时) |
SHELL | 指定后续 RUN、CMD 等使用的 shell |
CMD | 容器启动时执行的命令(可被覆盖) |
ENTRYPOINT | 容器默认入口点(可通过 CLI 覆盖) |
我们将用一个真实示例来学习整个流程: 从零构建一个 Nginx 镜像,并替换首页 index.html。

mkdir nginx-image && cd nginx-image
mkdir files
touch .dockerignore
步骤 2:准备 HTML 与 Nginx 配置
进入 files 目录:
cd files
创建 index.html
vi index.html
内容如下:
<html>
<head>
<title>Dockerfile</title>
</head>
<body>
<div class="container">
<h1>My App</h1>
<h2>This is my first app</h2>
<p>Hello everyone, This is running via Docker container</p>
</div>
</body>
</html>
创建 Nginx 配置文件 default
vi default
内容如下:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /usr/share/nginx/html;
index index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
步骤 3:选择基础镜像
使用 Ubuntu 18.04:
FROM ubuntu:18.04
官方建议:
步骤 4:编写 Dockerfile 在 nginx-image 目录下创建 Dockerfile: vim Dockerfile 内容如下: FROM ubuntu:18.04 LABEL maintainer="contact@devopscube.com" RUN apt-get -y update && apt-get -y install nginx COPY files/default /etc/nginx/sites-available/default COPY files/index.html /usr/share/nginx/html/index.html EXPOSE 80 CMD ["/usr/sbin/nginx", "-g", "daemon off;"] 步骤 5:构建 Docker 镜像 最终目录结构如下: nginx-image ├── Dockerfile └── files ├── default └── index.html 运行构建命令: docker build -t nginx:1.0 . 步骤 6:运行并测试镜像 docker run -d -p 9090:80 --name webserver nginx:1.0 访问: http://<host-ip>:9090

推送镜像到 Docker Hub 登录: docker login

打标签: docker tag nginx:1.0 <username>/nginx:1.0

推送: docker push <username>/nginx:1.0


Dockerfile heredoc 用法 示例: RUN <<EOF apt-get update apt-get upgrade -y apt-get install -y nginx EOF 可用于写入 Python 文件: RUN python3 <<EOF with open("/hello", "w") as f: print("Hello", file=f) print("World", file=f) EOF 可用于直接生成 HTML: COPY <<EOF /usr/share/nginx/html/index.html <html>...</html> EOF Dockerfile 最佳实践
.dockerignore常见构建问题
官方可信镜像仓库 Registry内容Docker Hub官方基础镜像Google CloudDistroless 基础镜像AWS ECR PublicAmazon 公共镜像RedHat Quay企业级镜像仓库Docker 镜像 vs 容器 镜像容器只读层组成镜像 + 可写层如 VM 镜像如 VM 实例可有多个标签镜像必须存在才能运行 如何从 Git 仓库构建镜像? docker build https://github.com/user/repo.git 什么是 Docker build context? 就是构建镜像时提交给 Docker Engine 的整个目录内容。 你接下来可以练习 你可以尝试为以下应用制作 Docker 镜像:
总结: 本文详细介绍了如何构建 Docker 镜像、使用 Dockerfile、推送镜像、最佳实践等内容。对于 DevOps 工程师而言,熟悉镜像构建流程,是学习容器化与 Kubernetes 的基础。
本文分享自 DevOps和k8s全栈技术 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!