Docker предоставляет функцию, которая решает эту проблему, которая называется Политика перезапуска Docker:
Docker provides restart policies to control whether your containers start automatically when they exit, or when Docker restarts. Restart policies ensure that linked containers are started in the correct order. Docker recommends that you use restart policies, and avoid using process managers to start containers.
Типы политик перезапуска:
no Do not automatically restart the container. (the default)
on-failure Restart the container if it exits due to an error, which
manifests as a non-zero exit code.
unless-stopped Restart the container unless it is explicitly stopped or
Docker itself is stopped or restarted.
always Always restart the container if it stops.
Затем вы можете использовать политику перезапуска, подобную этой:
$ docker run -dit --restart always redis
A restart policy only takes effect after a container starts successfully. In this case, starting successfully means that the container is up for at least 10 seconds and Docker has started monitoring it. This prevents a container which does not start at all from going into a restart loop.
If you manually stop a container, its restart policy is ignored until the Docker daemon restarts or the container is manually restarted. This is another attempt to prevent a restart loop.
Restart policies only apply to containers. Restart policies for swarm services are configured differently. See the flags related to service restart.
Здесь мы собираемся использовать контейнер hello -world Docker , чтобы проиллюстрировать, как это работает.
Для начала тянем вниз:
$ docker pull hello-world
Using default tag: latest
Trying to pull repository docker.io/library/hello-world...
latest: Pulling from docker.io/library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for docker.io/hello-world:latest
$
Загрузив наш контейнер, запустим его:
$ docker run -dit --restart always hello-world
0f6a61dddd3b667727a20df2c198941b2202653a71b6c86b8ace7b236bafc974
И если мы запустим пару docker ps
, мы увидим, что он перезапускается снова и снова:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f6a61dddd3b hello-world "/hello" 27 seconds ago Up Less than a second upbeat_brown
...time passes...
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f6a61dddd3b hello-world "/hello" 5 minutes ago Restarting (0) About a minute ago upbeat_brown
...time passes...
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f6a61dddd3b hello-world "/hello" 10 minutes ago Restarting (0) 3 minutes ago upbeat_brown
Глядя на журналы Docker, мы видим, что он перезапускается несколько раз:
$ docker logs 0f6a61dddd3b -f | grep "Hello from Docker"
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Hello from Docker!
Когда вы закончите, обязательно остановите контейнер, чтобы он не перезапустился навсегда:
$ docker stop 0f6
0f6
Чтобы решить проблему, просто запустите контейнер HBase Docker:
$ docker run -d --hostname hbase-db --name hbase --restart always \
-p 2181:2181 -p 8080:8080 -p 8085:8085 -p 9090:9090 -p 9095:9095 \
-p 16000:16000 -p 16010:16010 -p 16201:16201 -p 16301:16301 \
harisekhon/hbase
Здесь проблема не в корневой файловой системе, а в связке ключей ядра . Этот поток LXC хорошо объясняет это и имеет следующее решение :на хосте LXC(не внутри контейнера LXC ), увеличьте максимальное количество ключей с помощью:
echo 5000 | sudo tee /proc/sys/kernel/keys/maxkeys
5000
заведомо произволен; выберите число, которое больше, чем то, что у вас есть сейчас.
Цитата Стефана Грабера, сопровождающего LXD, из темы:
Kinda sounds like Docker may be attempting to use the kernel keyring? That’d certainly be a new behavior from them…
и спасибо simos также из этой ветки за предоставленную команду, которая решила эту проблему для меня.