(cd database-image && docker build -t initdemo/yorick-db . && docker push initdemo/yorick-db)
./mvnw clean package
docker build -t initdemo/yorick . && docker push initdemo/yorick
docker create -v /var/lib/postgresql/data --name yorick-db-storage postgres:9.6 /bin/true
docker run -d --volumes-from yorick-db-storage --name yorick-db initdemo/yorick-db
docker run -d -p 80:8090 --link yorick-db --name yorick initdemo/yorick
The application take a few seconds to start. To test it:
curl http://localhost/health
docker stop yorick yorick-db
docker rm yorick-db yorick
docker rmi initdemo/yorick-db
docker rmi initdemo/yorick
docker rm --volumes yorick-db-storage
Developers will have pushed updated images.
docker create -v /var/lib/postgresql/data --name yorick-db-storage postgres:9.6 /bin/true
docker run -d --volumes-from yorick-db-storage --name yorick-db initdemo/yorick-db
docker run -d -p 80:8090 --link yorick-db --name yorick initdemo/yorick
LetsEncrypt will take care of our TLS certificate needs. We also uses Nginx as a reverse proxy for the TLS part.
docker stop yorick && docker rm yorick
mkdir -p /certs
docker run -d \
--name nginx-proxy \
-p 80:80 -p 443:443 \
-v /certs:/etc/nginx/certs:ro \
-v /etc/nginx/vhost.d \
-v /usr/share/nginx/html \
-v /var/run/docker.sock:/tmp/docker.sock:ro \
jwilder/nginx-proxy
docker run -d \
--name letsencrypt \
--volumes-from nginx-proxy \
-v /certs:/etc/nginx/certs:rw \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
jrcs/letsencrypt-nginx-proxy-companion
docker run -d \
--name yorick \
--link yorick-db \
--expose=8090 \
-e "VIRTUAL_HOST=demo.init.se" \
-e "VIRTUAL_PORT=8090" \
-e "LETSENCRYPT_HOST=demo.init.se" \
-e "[email protected]" \
initdemo/yorick
docker stop yorick && docker rm yorick
docker run -d --name yorick --link yorick-db initdemo/yorick
The oauth2_proxy acts as a link between the NGINX and the yorick application.
docker run -d \
--name oauth2_proxy \
--link yorick \
--expose=4180 \
-e "VIRTUAL_HOST=demo.init.se" \
-e "VIRTUAL_PORT=4180" \
-e "LETSENCRYPT_HOST=demo.init.se" \
-e "[email protected]" \
skippy/oauth2_proxy \
-http-address="0.0.0.0:4180" \
-redirect-url="https://demo.init.se/oauth2/callback" \
-upstream="http://yorick:8090" \
-email-domain="*" \
-cookie-secret=BmhwRCl/YfwbHS2xzqQCFg== \
-client-id=783181937103-n0cvurbf63qjg03ln2u2b70mi73i2bhv.apps.googleusercontent.com \
-client-secret=<secret>
We are now using 6 different containers, and all the command line arguments are becoming unwieldy. Let's describe our solution in the file 'docker-compose.yml'. We can then let the 'docker-compose' tool set it all up automatically for us from scratch.
Let's remove all our containers and volumes:
docker stop $(docker ps -q)
docker rm --volumes $(docker ps -aq)
Then, with our docker-compose.yml in place, we just need to run:
docker-compose up
And when we want to take everything down, we simply run
docker-compose down
and all our containers will be stopped.
docker stop yorick yorick-db
docker rm yorick-db yorick
docker rmi initdemo/yorick-db
docker rmi initdemo/yorick
docker rm --volumes yorick-db-storage
docker stop nginx-proxy letsencrypt
docker rm --volumes nginx-proxy letsencrypt
docker stop oauth2_proxy
docker rm oauth2_proxy