自动启动容器
从Docker 1.2起,重启策略作为Docker内置机制,为了重启那些处于退出状态的容器。如果设置了重启策略,在Docker守护进程启动的时候会被触发,一般发生在系统重启后。重启策略将保证连接容器的启动顺序。
如果重启策略不符合你的需求(例如,依赖Docker容器的非Docker进程),你可以使用一个类似upstart, systemd 或 supervisor 进程管理器来替代。
使用一个进程管理器
Docker默认情况下,不会设置任何的重启策略,但是要注意,它们和大多数的进程管理器不兼容。所以,如果你正在使用一个进程管理器,请不要设置重启策略。
注意:在Docker 1.2之前的版本,Docker容器的重启必须要Prior to Docker 1.2, Docker容器的重启策略默认呢是打开的,需要显示设置禁用它。你可以参考以前版本的相关文档了解相关的细节。
当你构建完你的镜像,且对于你运行中的容器感到很满意了,你可以附加一个进程管理器去管理它。当你执行docker start -a
时,Docker将会附加到正在运行的容器,或启动它。如果需要转发所有的信号以便进程管理器可以探测,当一个容器停止和正确重启。
这里提供几个upstart、systemd和Docker整合实例脚本。
例子
后面的例子中,将向你展示两个流行的进程管理器(upstart, systemd)的配置文件。在这些例子里,我们假定我们已经创建一个使用了 --name=redis_server
参数、运行着Redis的容器。这些文件定义了一个新的服务,它会在Docker守护进程启动后启动。
upstart
description "Redis container"
author "Me"start on filesystem and started dockerstop on runlevel [!2345]
respawn
script
/usr/bin/docker start -a redis_server
end script
systemd
[Unit]Description=Redis containerRequires=docker.serviceAfter=docker.service
[Service]Restart=alwaysExecStart=/usr/bin/docker start -a redis_serverExecStop=/usr/bin/docker stop -t 2 redis_server
[Install]WantedBy=local.target
如果你需要传递选项到redis容器中(如: --env
),那么你将需要使用 docker run
而不是 docker start
。这样,每次服务启动的时候,都会创建一个新的容器。在服务停止的时候,容器会被停止和删除掉。
[Service]
...
ExecStart=/usr/bin/docker run --env foo=bar --name redis_server redis
ExecStop=/usr/bin/docker stop -t 2 redis_server ; /usr/bin/docker rm -f redis_server
...