Docker Service 与容器管理详解

在日常使用 Docker 时,我们常常用 docker run 来启动容器。但一旦涉及 集群管理、服务编排,就会用到 Docker Swarm 模式。
在 Swarm 中,我们不再直接管理单个容器,而是管理 Service(服务)。


1. Service 与 Container 的关系

在 Swarm 中,容器是由 服务 (Service) 来统一调度和管理的。

  • docker run → 直接启动一个独立容器。
  • docker service create → 创建一个服务,Swarm 负责保证该服务的副本数(replicas)。

比如:

docker service create --name web --replicas 2 nginx

会启动一个名为 web 的服务,并保持 2 个副本始终运行。
这两个副本本质上还是容器,但它们的生命周期由 Swarm 控制,而不是用户手动 docker stop/start。


2. 为什么关机重启后 docker ps -a 变得很乱?

很多人遇到的情况是:

docker ps -a

里面有一堆退出的容器,还有新的容器在运行,看起来很混乱。

原因是:

  • Swarm 会维护副本数。如果某个容器退出,Swarm 会立即拉起一个新容器。

  • 旧容器不会消失,而是以 Exited 状态留在 docker ps -a 里。

  • 所以就会出现 多个历史容器,名字类似:

    service_name.1.abcd1234xxxx
    service_name.1.efgh5678yyyy
    

这些是同一个副本(.1 表示副本编号),只是旧容器退出了,Swarm 新建了一个替代容器。


3. 正确的观测方式

不要再单纯依赖 docker ps -a,在 Swarm 模式下应该使用以下命令:

  • 查看所有服务:

    docker service ls
    

    输出示例:

    ID            NAME     MODE        REPLICAS  IMAGE
    abc123xyz     web      replicated  2/2       nginx:latest
    
  • 查看某个服务的副本任务:

    docker service ps web
    

    你会看到:

    NAME        DESIRED STATE  CURRENT STATE   ERROR
    web.1       Running        Running 2h ago
     \_ web.1   Shutdown       Failed 2h ago   "task: non-zero exit (255)"
    web.2       Running        Running 2h ago
     \_ web.2   Shutdown       Rejected        "cannot create a swarm scoped …"
    

    这解释了为什么 docker ps -a 有那么多退出容器:它们是 Swarm 的历史任务记录。

  • 查看服务日志:

    docker service logs web
    

4. 常见的 Rejected / Failed

  • Rejected “cannot create a swarm scoped …”
    通常是配置问题,比如端口冲突、错误的网络类型(Swarm 不支持 --network bridge,要用 overlay)。

  • Failed “task: non-zero exit (255)”
    表示容器启动后异常退出。

用 docker service logs <service> 查看容器日志排查。


5. 如何清理退出的容器?

虽然 Swarm 会留下历史任务的容器,但可以手动清理:

docker container prune

这会删除所有 Exited 的容器,让 docker ps -a 更干净。

但注意:这不会影响 正在运行的副本。


6. 如果只是单机部署?

如果你没有使用 Swarm 集群的需求(比如只是部署到一台服务器),建议不要用 docker service create,而是用:

docker run -d --name web --restart always -p 8080:80 nginx
  • --restart always 可以保证容器随系统启动而自动运行。
  • 这样就不会产生一堆历史容器,管理起来更简单。

7. 总结

  • Swarm 模式下,容器由服务管理,退出的容器会被替代,但历史记录仍会保留。

  • 正确的管理方式是:

    • docker service ls → 查看服务列表
    • docker service ps <service> → 查看副本运行情况
    • docker service logs <service> → 查看日志
  • 清理环境 用 docker container prune。

  • 如果只是单机运行,推荐直接用 docker run --restart always,而不是 Swarm。


延申:Swarm 的定位

  • 优点:内置于 Docker,轻量级,快速上手,适合中小项目的服务编排。

  • 缺点:功能比 Kubernetes 简单,社区生态较弱。

  • 现实选择:

    • 生产环境多用 Kubernetes。
    • 内网实验、小型项目,用 Swarm 足够。

https://github.com/0voice

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐