Docker Compose是Docker官方编排工具,可以通过Docker Compose定义、启动和管理多个容器的集成应用程序。unless-stopped是Docker Compose的一个关键字,用于指定容器不应该在停止命令之后终止,只有在显式执行docker-compose down
命令时才会终止。
一、使用unless-stopped保持服务运行
在Docker Compose中,通过在docker-compose.yml
文件中指定unless-stopped
属性,可以确保容器在运行docker-compose down
命令之前一直运行。这对于需要持续运行的服务非常重要,例如数据库服务、消息代理服务等。
下面是一个使用unless-stopped
属性的docker-compose.yml
示例:
version: '3'
services:
db:
image: postgres
restart: unless-stopped
在这个示例中,指定了一个名为db
的服务,使用PostgreSQL镜像,并且设置了restart
属性为unless-stopped
。这样,当使用docker-compose up
启动服务后,即使服务出现故障导致容器被停止,容器也会自动重启,保持服务的可用性。
二、理解unless-stopped和no
除了unless-stopped
,Docker Compose还提供了另一个关键字no
,用于指定容器在容器退出时不应该自动重启。尽管no
和unless-stopped
都可以防止容器在故障时重启,但它们之间有很大的区别。
no
的作用是在容器退出之后不重启,而unless-stopped
的作用是在容器退出并且未被手动停止时重启。如果手动停止了容器,即使使用unless-stopped
指定了容器也不会重启。
例如,下面是一个使用no
属性的docker-compose.yml
示例:
version: '3'
services:
db:
image: postgres
restart: no
如果在使用该docker-compose
文件启动服务后,如果容器出现故障并退出,则该容器不会重启,而必须手动执行docker-compose up
以重新启动容器。
三、理解unless-stopped和always
除了no
和unless-stopped
之外,Docker Compose还提供了另一个关键字always
,用于指定容器始终重启。与unless-stopped
不同,always
不会受到手动停止的影响,并且即使docker-compose down
命令也无法停止容器。
在使用always
时需要注意,在某些情况下可能需要手动停止容器。例如,在升级容器时,可能需要先手动停止容器,然后再启动更新的容器。如果使用了always
,您将无法手动停止容器。
下面是一个使用always
属性的docker-compose.yml
示例:
version: '3'
services:
db:
image: postgres
restart: always
在这个示例中,指定了一个名为db
的服务,使用PostgreSQL镜像,并且设置了restart
属性为always
。这样,容器将始终重启,无论是在出现故障时还是手动停止时。
四、总结
通过以上的介绍,我们了解了Docker Compose中restart
的关键字,包括unless-stopped
、no
和always
。对于需要长时间运行的服务,我们可以使用unless-stopped
保证它在退出后能够自动重启。与之不同的是no
和always
,前者在容器退出后不会重启,后者则始终重启,即使手动停止容器也不会停止。