
Docker 中 expose 和 publish 有什么区别?
EXPOSE 是 Dockerfile 里的文档性声明(声明容器监听端口,不做实际映射);publish(-p)是 docker run 时建立宿主机到容器的真实端口映射。声明 ≠ 开通,本文讲透两者关系。
聚焦概念、架构、排障、价格与选型,一篇解决一个明确问题。

EXPOSE 是 Dockerfile 里的文档性声明(声明容器监听端口,不做实际映射);publish(-p)是 docker run 时建立宿主机到容器的真实端口映射。声明 ≠ 开通,本文讲透两者关系。

run 是"创建+启动"二合一(产生新容器),start 是"启动已存在的容器"(复用旧容器状态);running 是容器主进程正在执行的状态。本文讲清 docker run/start/create 的状态流转。

容器共享宿主机内核,CPU/内存开销接近原生(通常 <5%);有开销的点是网络 NAT、存储驱动与磁盘 I/O、以及过度限制资源。本文量化常见开销并给出优化建议。

Linux 上 Docker 镜像默认存 /var/lib/docker(overlay2 分层目录),用 docker info 查 Docker Root Dir 确认;Mac/Windows 的 Docker Desktop …

502 表示 Nginx 作为反向代理连不上后端:先查后端服务是否在跑(systemctl status)、端口/socket 是否匹配、超时与缓冲区配置,再看 error.log 定因。本文给出完整排查链。

80 端口被占用导致 Nginx 起不来:用 ss -tulnp 或 lsof -i :80 找到占用进程(常是 Apache、旧 nginx、其他服务),停掉或改端口;也可能是配置里重复 listen。本文给排查步骤。

/var/www 推荐权限:属主 root 或部署用户、组 www-data;目录 755、文件 644;需写入的目录(上传/缓存)单独给 www-data 写权限。切忌 777。本文给出命令与安全原则。

可以:rsync 加 --stats 在结束时输出传输统计摘要(文件数、字节数、速度、耗时),不加 -v 即可避免逐文件输出;要更安静用 -q。本文给出常用输出级别组合。

client_max_body_size 不生效的常见原因:放错上下文层级被覆盖、改完没 reload、前面还有一层代理(云 LB/CDN)限制、或报错其实来自应用(如 PHP 的 upload_max_filesize)。逐项排查即可。

在一个 server 块内写多个 location,各自指定 root 即可;注意 root 与 alias 的路径拼接差异、静态站 SPA 的 try_files、以及末尾斜杠问题。本文给出完整配置示例。

该提示表示 cron 任务的输出无处投递:系统没装邮件服务(MTA),输出被丢弃。解法:任务里重定向到日志文件、装轻量 MTA(如 msmtp)、或用 systemd timer。本文给出各方案。

crontab 文件最后一行必须以换行符结尾,否则 cron 报 missing newline before EOF 且最后一行任务不生效。手动编辑加一行回车即可;自动生成 crontab 的脚本要补 \n。