Docker管理指南(2) – 自动启动容器

docker 1.2版本,docker机制内置了当容器退出时重启它们的重启策略。如果设置了,重启策略会在docker daemon启动时使用,如经典场景系统启动时。同时重启策略会确保链接容器以正确的顺序启动。
如果重启策略没有满足你的需求(如你可能有非docker进程依赖docker容器),你可以使用进程管理器,如upstart,systemd或supervisor。

使用进程管理器

docker默认不会设置任何的重启策略,不过需要注意它们会与大多数的进程管理器冲突。所以如果你使用了进程管理器就不要设置重启策略了。
当你设置好你的镜像并已经运行容器,你可以把它们附加到进程管理器来管理。当你执行docker start -a,docker就会自动附着所有运行的容器,或按需启动并转向所有信号以便进程管理器在一个容器停止能探测到并正确重启它。

示例

下面的示例显示两个进程管理器的配置,upstart和systemd。在这个示例中我们假设你已经启动了一个Redis容器,命名为redis_server。这些文件定义了当docker daemon启动时自动启动容器。

upstart

  1. description "Redis container"
  2. author "Me"
  3. start on filesystem and started docker
  4. stop on runlevel [!2345]
  5. respawn
  6. script
  7.   /usr/bin/docker start -a redis_server
  8. end script

systemd

  1. [Unit]
  2. Description=Redis container
  3. Requires=docker.service
  4. After=docker.service
  5.  
  6. [Service]
  7. Restart=always
  8. ExecStart=/usr/bin/docker start -a redis_server
  9. ExecStop=/usr/bin/docker stop -t 2 redis_server
  10.  
  11. [Install]
  12. WantedBy=default.target

如果你想设置为一个系统服务,把上面的内容放到/etc/systemd/system目录下的一个文件,如/etc/systemd/system/docker-redis_server.service。
如果你需要传递选项到redis容器,如–env,那么你需要使用docker run而不是docker start来启动容器。这个会每次服务启动时创建一个新的容器,这容器当服务停止时会自动停止和删除。

  1. [Service]
  2. ...
  3. ExecStart=/usr/bin/docker run --env foo=bar --name redis_server redis
  4. ExecStop=/usr/bin/docker stop -t 2 redis_server
  5. ExecStopPost=/usr/bin/docker rm -f redis_server
  6. ...

要使用这个服务,重载systemd和启动服务:

  1. systemctl daemon-reload
  2. systemctl start docker-redis_server.service

设置开机启动:

  1. systemctl enable docker-redis_server.service
标签:Docker容器 发布于:2019-11-20 01:17:34