Docker‑compose容器开机自启
Docker-compose 本身没有守护进程,服务器重启后服务不会自动恢复。
通过 systemd 创建托管服务,把 compose 项目注册为系统服务,就能在开机时自动执行 docker compose up -d,实现真正的开机自启。
本文面向 Linux 零基础用户,按步骤给出 service 文件、启用命令和验证方法,照着操作即可完成配置。
为什么不能只依赖 restart: always
很多人的 compose 文件里写了 restart: always,但服务器突然断电或重启时,Docker 引擎可能还没准备好,容器恢复顺序容易乱,甚至出现服务起不来的情况。
systemd 作为系统级进程管理器,可以明确指定等待 Docker 就绪后再启动 compose 项目,而且能设置依赖关系、开机自启和统一日志管理。
对于多容器项目,用 systemd 托管更稳定。
准备条件
操作前确认以下几项:
- Linux 服务器已安装 Docker,并确认 compose 命令可用:
docker compose version或docker-compose version。 - compose 项目目录固定,例如
/opt/myapp/docker-compose.yml。 - 项目能手动正常启动,即
docker compose up -d成功。
如果 docker compose 和 docker-compose 两条命令指向不同路径,后面写 service 文件时要注意区分。
创建 systemd 服务单元文件
以我的项目 myapp 为例,在 /etc/systemd/system/ 下新建服务文件:
sudo vi /etc/systemd/system/docker-compose-myapp.service
写入以下内容:
[Unit]
Description=Docker Compose MyApp Service
Requires=docker.service
After=docker.service network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
几个关键点需要留意:
WorkingDirectory必须指向 compose 文件所在目录,否则 systemd 找不到docker-compose.yml。ExecStart里的 docker 路径建议写绝对路径,可用which docker查看。- 如果系统只支持
docker-compose,把ExecStart改成/usr/local/bin/docker-compose up -d。 Type=oneshot搭配RemainAfterExit=yes,表示启动命令执行完后就保持 active 状态,方便 systemd 管理。
启用并启动服务
保存文件后,先让 systemd 重新加载配置:
sudo systemctl daemon-reload
然后设置开机自启并立即启动:
sudo systemctl enable docker-compose-myapp.service
sudo systemctl start docker-compose-myapp.service
检查服务状态:
sudo systemctl status docker-compose-myapp.service
如果显示 active (exited),说明配置成功,容器已经在运行。
也可以直接用 docker ps 确认容器状态。
验证开机自启是否真正生效
最稳妥的方式是重启服务器验证:
sudo reboot
重启完成后重新登录,依次执行:
sudo systemctl status docker-compose-myapp.service
docker compose ps
只要服务为 active,compose 里的容器状态为 Up,就说明开机自启已经生效。
常见问题与避坑说明
改了 compose 文件后要重启服务吗? 如果只是改环境变量或镜像配置,
建议直接执行 sudo systemctl restart docker-compose-myapp.service,
让 systemd 重新执行 docker compose up -d,
避免直接手动操作和 systemd 状态不一致。
服务启动失败怎么排查? 用 journalctl -u docker-compose-myapp.service 查看日志。
最常见原因是 WorkingDirectory 写错,或者 docker 命令路径不对。
另外,如果服务器上本身有防火墙或 SELinux 限制,也可能导致容器无法创建。
compose 文件里的 restart: always 要不要删? 建议删除或改为 restart: no,交给 systemd 统一管理。
否则 Docker 和 systemd 可能同时尝试拉起容器,造成状态不一致或日志混乱。
不需要这个服务时如何关闭? 执行 sudo systemctl disable --now docker-compose-myapp.service,
再删除对应的 service 文件即可。
如果你正在处理 Docker-compose 容器开机自启问题,建议先按本文步骤完整执行,再根据自己的环境微调;
遇到异常时优先回看避坑和高频问题部分。
系统化托管后,服务器任意重启,服务都能自动恢复,省去手动干预的麻烦。