还在用默认Nginx页面?一个命令,让Docker瞬间拥有专属欢迎页!
你是不是也觉得,每次启动Nginx容器,看到的都是那个千篇一律的“Welcome to nginx!”页面,有点太没个性了?
想象一下,当你的应用部署成功,访问端口时,迎面而来的是一句亲手写下的“Hello World!”,或者是你团队的酷炫Logo,那种感觉是不是完全不一样了?
今天,我们就来玩点不一样的。不写复杂的代码,不搞繁琐的配置,只用几行命令,就能让你的Nginx容器告别“大众脸”,挂载上你自己的专属页面。
从零开始,打造你的第一个自定义容器
别被“挂载”、“卷”这些词吓到。你可以把它想象成,给容器这个“小房间”开一扇窗户,这扇窗户直接通向你电脑上的某个文件夹。房间里的人(Nginx进程)透过这扇窗户,就能直接看到、使用你放在文件夹里的东西。
我们的目标简单又酷:让Nginx显示我们自己的网页,而不是它自带的那个。
第一步,我们需要准备点“弹药”——一个简单的HTML文件。
打开你的终端,深吸一口气。我们不需要进入什么复杂的目录,就在你顺手的地方,创建一个专属的文件夹。
mkdir -pv nginx-html && echo '<h1>Hello Docker Compose!</h1>' > nginx-html/index.html
看,就一行命令!它默默做了两件事:先创建了一个叫 nginx-html 的文件夹,然后在这个文件夹里,生成了一个 index.html 文件,文件内容就是我们热血沸腾的问候语:“Hello Docker Compose!”。

这里有个几乎人人都会踩的小坑,你注意到了吗?命令里用的是单引号‘ ’ 包裹我们的HTML内容。
为什么?由于那个激情澎湃的感叹号 ! 在bash shell里是个“特殊分子”,它叫历史命令扩展符。如果你用双引号或者不用引号,bash会以为你想调用某条历史命令,然后一脸懵地告知你:“event not found!(事件未找到)”
所以记住这个秘诀:在echo命令里写包含感叹号的内容时,优先用单引号。这是最干净利落的解决方式。
你也可以像个黑客一样给它“戴个口罩”进行转义,写成 Hello Docker Compose!,或者在执行命令前先念句“咒语”set +H 关闭历史扩展功能。但最简单优雅的,还是用单引号。
目前,用 cat nginx-html/index.html 看一眼。看到了吗?那句属于你的问候已经安静地躺在那里了。
编写魔法契约:docker-compose.yml
页面准备好了,我们怎么告知Docker:“嘿,兄弟,别用你自带的页面了,用我放在窗边(nginx-html文件夹)的这个!”
这就需要一份“魔法契约”——docker-compose.yml 文件。它用人类和机器都能理解的语言,清晰地描述我们想要什么样的容器服务。
创建一个文件,名字就叫 docker-compose.yml,然后把下面的内容一字不差地放进去:
例子2:Nginx挂载本地页面
services: nginx: image: nginx:alpine ports: – “8080:80” volumes:
本地目录:容器目录(ro=只读,避免容器修改本地文件)
./nginx-html:/usr/share/nginx/html:ro restart: always
我们来拆解一下这份契约的每一句“咒语”:
**`image: nginx:alpine`**: 我们要召唤一个轻量级的Nginx精灵,它的名字叫 `alpine` 版本。
**`ports: - "8080:80"`**: 在宿主机的8080端口和容器的80端口之间架起一座桥。这意味着,你在浏览器访问 `https://localhost:8080`,请求就会通过这座桥,直达容器内部的Nginx服务。
**`volumes: - ./nginx-html:/usr/share/nginx/html:ro`**: 这就是最核心的“开窗”魔法了!
* `./nginx-html`: 你主机上当前目录下的那个文件夹,我们放“Hello Docker Compose!”页面的地方。
* `/usr/share/nginx/html`: 容器内部,Nginx默认寻找网页文件的“客厅”位置。
* `:`: 中间这个冒号,就是连接两者的等号,意味着“映射”。
* `:ro`: 最后的 `ro` 是 `read-only`(只读)的缩写。这是一个**超级重大的安全与最佳实践**。它意味着容器里的Nginx可以尽情阅读这个文件夹里的内容,但绝不允许修改或删除你主机上的原文件。就像给窗户装了防盗网,只许看,不许碰。
**`restart: always`**: 给服务加上一个“永生”祝福。只要Docker守护进程在运行,无论这个容器由于什么缘由停了,它都会自动重新启动。对于Web服务来说,这太有安全感了。
见证奇迹的时刻
契约签订完毕,是时候念出最终的启动咒语了。确保你的终端位于存放着 docker-compose.yml 文件的目录下,然后输入:
docker-compose up -d
那个 -d 参数,是 detached 的缩写,意味着让服务在后台安静运行,还你一个干净的终端。
片刻之后,打开你心爱的浏览器,在地址栏郑重地输入:https://localhost:8080。
回车!
看到了吗? 那个熟悉的、默认的Nginx欢迎页面消失了。取而代之的,是硕大、居中、带着一丝笨拙却无比真诚的—— “Hello Docker Compose!”。
这一刻,你是否感觉到一种奇妙的连接?你主机文件系统上的一个普通文本文件,通过一条清晰的路径,瞬间成为了一个运行在独立容器环境中的Web服务的核心内容。

你可以随时去修改 nginx-html/index.html 文件里的内容,列如改成 <h1>欢迎来到我的魔法世界!</h1>,然后刷新浏览器页面。无需重启容器! 变化是实时生效的。这就是卷挂载的魔力:它让静态数据的持久化和动态更新变得如此自然。
不止于此:关于卷挂载的无限遐想
成功了吗?当然!但这仅仅是冰山一角。你刚刚解锁的 volumes 挂载,是Docker世界里最强劲、最常用的特性之一。
今天你挂载了一个HTML目录,明天你就可以:
挂载一个配置文件目录,随时调整Nginx、MySQL、Redis的配置,而不用重新构建镜像。
挂载一个日志目录,把容器内应用产生的日志文件,持久化保存在主机上,方便查看和分析。
挂载一个数据库的数据目录,确保你的数据不会由于容器的销毁而丢失。
那个小小的 :ro(只读)标记,请你务必重点关注。 对于网页、配置文件这类一般由我们人类主导的内容,加上只读限制,是保护主机文件系统不被意外破坏的好习惯。当然,对于需要写入的场景,列如日志、数据,你只需要去掉 :ro 即可。
所以,别再忍受默认页面了。从这一行 echo 命令,这一份 docker-compose.yml 文件开始,去定制,去创造,去让你手中的每一个容器都打上属于自己的烙印。
Docker的世界,本就该如此生动。