Start containers automatically
As of Docker 1.2, restart policies are the built-in Docker mechanism for restarting containers when they exit. If set, restart policies will be used when the Docker daemon starts up, as typically happens after a system boot. Restart policies will ensure that linked containers are started in the correct order.
If restart policies don’t suit your needs (i.e., you have non-Docker processes that depend on Docker containers), you can use a process manager like upstart, systemd or supervisor instead.
Using a process manager
Docker does not set any restart policies by default, but be aware that they will conflict with most process managers. So don’t set restart policies if you are using a process manager.
When you have finished setting up your image and are happy with your running container, you can then attach a process manager to manage it. When you run docker start -a
, Docker will automatically attach to the running container, or start it if needed and forward all signals so that the process manager can detect when a container stops and correctly restart it.
Here are a few sample scripts for systemd and upstart to integrate with Docker.
Examples
The examples below show configuration files for two popular process managers, upstart and systemd. In these examples, we’ll assume that we have already created a container to run Redis with --name=redis_server
. These files define a new service that will be started after the docker daemon service has started.
upstart
description "Redis container" author "Me" start on filesystem and started docker stop on runlevel [!2345] respawn script /usr/bin/docker start -a redis_server end script
systemd
[Unit] Description=Redis container Requires=docker.service After=docker.service [Service] Restart=always ExecStart=/usr/bin/docker start -a redis_server ExecStop=/usr/bin/docker stop -t 2 redis_server [Install] WantedBy=default.target
If you intend to use this as a system service, put the above contents in a file in the /etc/systemd/system
directory, e.g. /etc/systemd/system/docker-redis_server.service
.
If you need to pass options to the redis container (such as --env
), then you’ll need to use docker run
rather than docker start
. This will create a new container every time the service is started, which will be stopped and removed when the service is stopped. Make sure you don’t use “-d
” for “detached mode”. The command run from “ExecStart
” needs to run in the foreground.
[Service] ... ExecStart=/usr/bin/docker run --env foo=bar --name redis_server redis ExecStop=/usr/bin/docker stop -t 2 redis_server ExecStopPost=/usr/bin/docker rm -f redis_server ...
To start using the service, reload systemd and start the service:
systemctl daemon-reload systemctl start docker-redis_server.service
To enable the service at system startup, execute:
systemctl enable docker-redis_server.service
© 2017 Docker, Inc.
Licensed under the Apache License, Version 2.0.
Docker and the Docker logo are trademarks or registered trademarks of Docker, Inc. in the United States and/or other countries.
Docker, Inc. and other parties may also have trademark rights in other terms used herein.
https://docs.docker.com/v1.12/engine/admin/host_integration/