07 - Dockerizing your web applications ====================================== **General Tips** Always add and use these file to all your web applications for dockerization: * Dockerfile * .dockerignore * docker-compose.yml * .env "The secret to change is to focus all of your energy not on fighting the old but on building the new" -> force you to design your apps in a scale-able way, even if you are not scaling beyond one host **Logging** Issue * Ruby write log messages in a /tmp folder by default * Hence, they are written into the container * All log files are lost when restarting the container, since volumes are not used during production Solution * Redirect your log to STOUT (Flask does this automatically) * Logs are then managed by docker at the host level, not the container level (web app level) * What happens with the log file is then defined on the host level **Use ENV variables** * Use your own env variables even if your application uses its own config files * That way separate environments will have separate environment files (e.g. dev and production) * Remember: docker-compose can load multiple env files in a specified order **Keep your apps stateless** Issue * Keep them as stupid as possible * Don't store important data inside your app * If webapp get restarted, all data is lost Solution * Use redis (or similar tools) to store data between requests * In reality those data is often stored on the client site as signed cookies * To store them on the server side, use redis to save them at the backend -> See the "Twelve-Factor App" for a guide to design web applications (https://12factor.net/)