服务器重启后,docker ps 一看全是 Exited (0),网站跟着 502。这时候需要的不是 docker run,而是 docker start,两个命令一字之差,干的事完全不同。
start 启动已有容器,run 新建一个
docker start 后面跟容器名或者 ID,把已经存在但停掉的容器重新拉起来,原来的端口、挂载、环境变量都还在。docker run 是拿镜像新建一个容器,每执行一次就是一次新的创建。
docker ps -adocker start webdocker restart webdocker ps -a 列出所有容器,包括退出的;docker restart 相当于先 stop 再 start。容器名在 docker run 时用 --name 指定,不指定系统会随机起名,后面操作只能翻 ID。
一条常用的 run 命令长什么样
docker run -d --name web -p 8080:80 -v /data/html:/usr/share/nginx/html --restart=always nginx:latest- -d 后台运行,不加的话日志刷满终端,Ctrl+C 一按容器就没了。
- -p 8080:80 把宿主机的 8080 映射到容器 80,前者是外面访问用的端口。
- -v 挂载目录,容器删了数据还在宿主机上。
- --restart=always 让容器跟着 docker 服务自启,服务器重启后不用手工拉。
启动失败先看日志
docker start 显示成功但 docker ps 里看不到,说明容器起来又退了。用 docker logs --tail 100 web 看最后一百行,常见原因是配置文件写错、端口被占、数据库连不上。端口冲突会报 bind: address already in use,用 ss -lntp 查谁占着。
还有一种是镜像本身没有默认启动命令,run 的时候得在最后补上,比如 bash 或者具体的启动脚本。
docker启动容器记住一句:容器还在就用 start,容器没了才用 run。run 的参数最好写进 compose 文件,不然过俩月没人记得当时加了什么挂载。