容器里的配置文件路径不对,想进去看一眼。顺手敲了 docker attach web,改完按 Ctrl+C 退出,结果整个容器跟着停了,网站直接 502。这个坑不少人踩过。
首选 docker exec -it
docker exec -it web /bin/bash-i 保持标准输入,-t 分配一个终端,两个一起用才有正常的命令行提示符。web 换成容器名或者容器 ID 都行。退出时输入 exit 或者按 Ctrl+D,只结束这个 shell,容器继续跑。
镜像里没有 bash,会报 executable file not found,换成 sh:
docker exec -it web shAlpine 这类精简镜像默认只有 sh,别硬装 bash,多出来的体积也是成本。
exec 还能干别的
- 看配置:docker exec -it web cat /etc/nginx/nginx.conf
- 查进程:docker exec web ps aux
- 用 root 进:docker exec -it -u root web bash,普通用户没权限改文件时用。
- 临时跑命令:docker exec web ls -lh /app,执行完就退出,不留 shell。
attach 是接主进程,不是开新终端
docker attach 连的是容器主进程的标准输入输出,适合看启动日志,或者给交互式程序输指令。它不会新开 shell,按 Ctrl+C 很可能把主进程一起终止。非要用的话,退出时按 Ctrl+P 再按 Ctrl+Q,容器才不会被带走。
看日志其实有更安全的办法:docker logs -f --tail 200 web,效果差不多,还不会误杀容器。
不想进容器也能改文件
只改一个配置文件,可以用 docker cp web:/etc/nginx/nginx.conf ./nginx.conf 拷出来,改完再 cp 回去,然后 docker exec web nginx -s reload。生产环境少开 shell,能拷文件就别进去敲命令。
docker进入容器命令的优先级记好:exec 进容器,logs 看日志,cp 传文件,attach 只留给必须交互的场景。容器是拿来跑服务的,不是拿来当虚拟机的。