From 34390002c6f7d61f3426bda54b89938a77de6efa Mon Sep 17 00:00:00 2001 From: Andrey Arapov Date: Fri, 14 Jun 2019 23:09:37 +0200 Subject: [PATCH] first commit --- Dockerfile | 12 +++++++++ README.md | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++ entrypoint.sh | 12 +++++++++ 3 files changed, 92 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 entrypoint.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..de2b5a7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM nginx:alpine + +RUN apk --update add curl + +HEALTHCHECK \ + --interval=2s \ + --timeout=2s \ + --retries=2 \ + CMD curl -s http://localhost/status | grep -q '^alive$' + +COPY entrypoint.sh /entrypoint.sh +ENTRYPOINT ["sh", "/entrypoint.sh"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..0c1f49c --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +## Docker Swarm health check example + +This example shows how health check works in Docker Swarm. + +### What does this container do? + +Container runs a nginx server and it also runs a script which writes a ``dead`` +status to ``/usr/share/nginx/html/status`` file on every odd run which is then +picked by the health check that expects ``alive`` status from the nginx running +in the container. + +So every odd run the container gets ``unhealthy`` status. +Then you can observe that running this container in Docker Engine alone will +not restart it. Hence we will run it as a service in the Docker Swarm which +will ensure the container gets restarted until it gets ``healthy`` status. + +### Building image + +``` +docker build -t healthcheck-test . +``` + +### Setting up env + +Make sure you have recent Docker Engine installed. + +``` +docker swarm init +``` + +### Running the service + +``` +docker service create \ + --name test1 \ + --mount type=bind,src=/tmp,dst=/usr/share/nginx/html \ + --detach healtcheck-test +``` + +### Watching the healtcheck + +``` +docker ps |grep test1 +docker service ls +``` + +### Cleaning up + +``` +docker service rm test1 +docker swarm leave --force +rm -rf -- /tmp/html +``` + +### Extra + +If you want to restart the container manually, you need to downscale it to 0 +first and then upscale it back again. + +``` +docker service scale test1=0 +docker service scale test1=1 +``` + +### References + +- https://docs.docker.com/compose/compose-file/ +- https://docs.docker.com/engine/reference/builder/ diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..20e547d --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +# Mount /usr/share/nginx/html must be persistent for this test to work properly +# in the Docker Swarm since it does not just restart the container but rather +# removes it and then starts it. +SFILE=/usr/share/nginx/html/status + +# I am unhealthy until I get restarted and then I will become healthy again. +# That way I will be healthy every even run and unhealthy every odd run. +grep dead $SFILE && ( echo alive | tee $SFILE ) || ( echo dead | tee $SFILE ) + +exec nginx -g "daemon off;"