假设ECS测试机上的Web服务原来用8080,准备改成18080:编辑了compose.yaml,执行docker compose restart web,查询时却仍是旧端口。
我会把这个问题分成两步:Compose准备应用什么配置,现有容器实际用了什么配置。 restart只重启已有容器,不会应用Compose文件里的ports改动。先确认配置来源,再用up处理变更,能避免反复重启却始终查错对象。
本文依据Docker官方文档整理,未在ECS实例运行;镜像拉取、端口连通和业务响应均未实测。下面是供读者执行的独立演示,不是本次运行记录。
一、先锁定项目和文件,再改端口
已有业务环境先找回原启动命令:项目名、工作目录、-f文件顺序,以及使用过的--env-file、profile和变量来源。保持同一个Docker上下文,避免查到另一台主机。
Compose项目名用于隔离应用。随手加一个新的-p,可能是在创建第二套项目;在别的目录运行,也可能读到另一份文件。不要用下面的演示项目名替换现有业务项目名。
为看清变化,新建一个独立空目录,保存compose.yaml;确认演示项目名ports-lab-1019未被使用,8080和18080未被占用。示例采用Docker Engine 28及以上、Compose插件和默认bridge网络。
services:
web:
image: docker.1ms.run/library/nginx:1.30.6-alpine
ports:
- "127.0.0.1:8080:80"
后面的命令全部在这个目录执行,固定使用同一组-p和-f参数。这里docker compose的-p指定项目名,与docker run -p发布端口的含义不同。绑定127.0.0.1表示维护入口留在宿主机回环地址,不以开放公网作为改端口的验证方式。
docker compose -p ports-lab-1019 -f compose.yaml config --quiet
docker compose -p ports-lab-1019 -f compose.yaml pull web
docker compose -p ports-lab-1019 -f compose.yaml up -d web
docker compose -p ports-lab-1019 -f compose.yaml port web 80
先读取实际映射,不把“启动命令结束”写成网页已经可用。镜像标签已按官方索引核对,但不代表该代理入口的拉取或缓存状态已经验证。
二、用config看最终模型
现在只将文件里的127.0.0.1:8080:80改为127.0.0.1:18080:80,保持镜像和其他字段不变,运行:
docker compose -p ports-lab-1019 -f compose.yaml config
config会合并指定文件、解析变量,并将短格式展开。它给出准备应用的配置模型,不会因此修改运行中的容器。检查web的ports是否只有预期条目:
| 字段 | 本例应核对的值 |
|---|---|
host_ip |
127.0.0.1 |
published |
18080,宿主机端口 |
target |
80,容器端口 |
protocol |
tcp |
已有项目若通过多份-f文件启动,检查时也必须带齐,并保持顺序。后一个文件不是任何字段都整段替换:ports按包含IP、容器端口、宿主端口和协议的唯一键合并;改了宿主端口,可能把新条目追加进来,旧端口仍保留。因此要看最终模型,不能只看编辑器里的最后一份文件。
本例只用一份文件,避免为了换一个端口引入额外覆盖语法。真实配置输出可能含敏感信息,分享排查材料前先脱敏。

如果模型里还是8080,先停在配置来源这一层:确认保存的是命令指定的文件,变量是否来自预期环境,是否漏了原启动命令里的覆盖文件。模型本身就不对时,重建也只会应用错误配置。
三、将配置预期与实际容器对上
docker compose -p ports-lab-1019 -f compose.yaml ps --all
docker compose -p ports-lab-1019 -f compose.yaml port web 80
如果config已经指向18080,而port仍查询到8080,说明准备应用的配置与当前容器映射不一致;若项目、文件和Docker上下文都已核对,下一步就是应用变更。若port报错或没有可用映射,先看ps --all里的状态,不把空输出当作改端口成功。
restart在这里不会重建容器,也不会把新端口写进去。反复执行它,只是在重复启动同一份旧容器配置。
四、只对目标服务应用变更
docker compose -p ports-lab-1019 -f compose.yaml up -d --no-deps web
docker compose -p ports-lab-1019 -f compose.yaml port web 80
docker compose -p ports-lab-1019 -f compose.yaml ps --all
up检测到服务配置变化后会停止并重建对应容器;指定web把目标收窄到该服务,--no-deps避免启动它的依赖。重建期间该服务会短暂中断,业务环境应选择维护窗口;它不提供零停机保证。
演示服务没有依赖。已有业务使用--no-deps前,要确认依赖已处于所需状态;这个参数不替你检查数据库、缓存或其他服务是否可用。
本例不需要先down整套项目,也不需要删除卷。配置已发生变化时,通常也无需强加--force-recreate。如果18080被占用而启动失败,先处理端口冲突,再查实际状态,不能仅凭文件已经保存宣布完成。
最后确认实际映射只保留预期的回环18080入口,再在宿主机访问http://127.0.0.1:18080/核对目标页面。映射一致只证明配置已经落到容器;页面是否正确,仍要结合应用日志与响应单独验收。
把原启动参数、修改后的config和变更后的实际映射保留下来,下一位维护者就能分清:改了哪份文件、作用于哪个项目、容器最终用了哪个端口。