
docker-compose 中 ports 和 expose 有什么区别?
ports 把容器端口发布到宿主机(外部可访问),expose 仅在 compose 内部网络向其他服务开放端口(不对外)。内部依赖用 expose,对外服务用 ports。
聚焦概念、架构、排障、价格与选型,一篇解决一个明确问题。

ports 把容器端口发布到宿主机(外部可访问),expose 仅在 compose 内部网络向其他服务开放端口(不对外)。内部依赖用 expose,对外服务用 ports。

镜像是只读的应用打包模板(代码+依赖+配置),容器是镜像的运行实例(带可写层与进程状态)。一个镜像可启动多个容器,容器依赖镜像而存在。本文用类比讲清二者关系。

RUN 在构建镜像时执行(装包、建目录,结果固化进镜像层),CMD 指定容器启动时的默认命令(可被 docker run 覆盖)。构建期用 RUN,运行期用 CMD。

COPY 只做本地文件拷贝;ADD 额外支持 URL 下载和 tar 自动解压,但行为不透明。官方最佳实践:默认用 COPY,确需自动解压才用 ADD,下载文件用 RUN+curl 替代。

/var/run/docker.sock 是 Linux 的 Unix socket,Windows 上不存在;Windows 容器需用命名管道 npipe 或 Docker Remote API;Docker Desktop 里跑…

docker exec -it 容器名 /bin/bash 进容器后用编辑器修改(容器常无编辑器,可先 apt install 或用 sed 改);不折腾的做法是 docker cp 拷出来改完再拷回去。注意改动不持久。

运行中的容器用 docker exec -it 容器名 /bin/sh 进去看;不打扰进程用 docker export 导出文件系统快照;容器已停止用 docker cp 或 commit 成镜像再看。本文汇总各方法。

非 root 用户跑 Docker 报权限拒绝,是因为不在 docker 用户组:sudo groupadd docker、sudo usermod -aG docker $USER,重新登录后免 sudo。本文给出完整步骤与安全提醒。

docker build --no-cache 跳过全部层缓存从零构建;只想让某一步之后的缓存失效,可用 --build-arg 注入变化值或 docker compose build --no-cache。本文给出各场景做法。

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名 即可拿到容器 IP;容器在哪个网络就有哪个网段的 IP。

Dockerfile 用 # 开头写注释,独占一行,不支持行尾注释;指令参数里的 # 不算注释。另可用 parser directive 指定语法版本。本文说明规则与常见坑。

cron 守护进程不读取容器启动时的环境变量,常见解法:启动脚本把 env 导出到文件(env > /etc/environment)让 cron 源它,或用 docker run -e 显式传入。本文给出可靠做法。