├── requirements.txt ├── mysql ├── Dockerfile └── dump.sql ├── README.md ├── nginx ├── Dockerfile └── nginx.conf ├── Dockerfile ├── docker-compose.yml └── app └── app.py /requirements.txt: -------------------------------------------------------------------------------- 1 | flask 2 | flask-mysql 3 | redis 4 | python-memcached 5 | pymongo 6 | -------------------------------------------------------------------------------- /mysql/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mysql:5.7 2 | 3 | ADD dump.sql /docker-entrypoint-initdb.d 4 | 5 | EXPOSE 3306 6 | CMD ["mysqld"] 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # docker-flask 2 | 3 | ``` 4 | docker-compose build 5 | docker-compose up 6 | docker-compose up -d 7 | docker-compose build app 8 | docker-compose up --no-deps -d app 9 | docker exec -it flask_app_1 bash 10 | ``` 11 | 12 | 13 | -------------------------------------------------------------------------------- /nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:1.13 2 | 3 | # Clean default confs 4 | RUN rm -f /etc/nginx/conf.d/* 5 | 6 | # forward request and error logs to docker log collector 7 | RUN ln -sf /dev/stdout /var/log/nginx/access.log 8 | RUN ln -sf /dev/stderr /var/log/nginx/error.log 9 | 10 | COPY nginx.conf /etc/nginx/nginx.conf 11 | 12 | EXPOSE 80 13 | 14 | CMD ["nginx", "-g", "daemon off;"] 15 | -------------------------------------------------------------------------------- /nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes 2; 3 | 4 | events { 5 | worker_connections 1024; 6 | } 7 | 8 | http { 9 | access_log /var/log/nginx/access.log; 10 | error_log /var/log/nginx/error.log; 11 | 12 | server { 13 | listen 80; 14 | # apps is the name of the network alias in Docker 15 | location / { 16 | proxy_pass http://app:8080; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Use an official Python runtime as a parent image 2 | FROM python:3.6.4-alpine3.7 3 | 4 | # Set the working directory to /app 5 | WORKDIR /app 6 | 7 | # Copy the current directory contents into the container at /app 8 | ADD ./app /app 9 | 10 | # Copy the requirements into the container at /etc 11 | COPY ./requirements.txt /etc 12 | 13 | # Install any needed packages specified in requirements.txt 14 | RUN pip install -r /etc/requirements.txt 15 | 16 | # Make port 8080 available to the world outside this container 17 | EXPOSE 8080 18 | 19 | # Define environment variable 20 | ENV NAME World 21 | ENV MYSQL_HOST mysql 22 | ENV MYSQL_ROOT_PASSWORD EXAMPLE 23 | ENV MYSQL_DATABASE TEST 24 | ENV MYSQL_USER TEST 25 | ENV MYSQL_PASSWORD TEST 26 | ENV MONGO_HOST mongodb 27 | ENV REDIS_HOST redis 28 | ENV MEMCACHE_HOST "memcache:11211" 29 | 30 | # Run app.py when the container launches 31 | CMD ["python", "app.py"] 32 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | web: 4 | build: 5 | context: ./nginx/ 6 | dockerfile: Dockerfile 7 | ports: 8 | - "80:80" 9 | networks: 10 | - webnet 11 | 12 | app: 13 | build: 14 | context: . 15 | dockerfile: Dockerfile 16 | ports: 17 | - "8080:8080" 18 | environment: 19 | MYSQL_HOST: mysql 20 | MYSQL_ROOT_PASSWORD: EXAMPLE 21 | MYSQL_DATABASE: TEST 22 | MYSQL_USER: TEST 23 | MYSQL_PASSWORD: TEST 24 | MONGO_HOST: mongodb 25 | REDIS_HOST: redis 26 | MEMCACHE_HOST: memcache:11211 27 | networks: 28 | - webnet 29 | 30 | redis: 31 | image: redis 32 | ports: 33 | - "6379:6379" 34 | volumes: 35 | - ./data-redis:/data 36 | networks: 37 | - webnet 38 | 39 | memcached: 40 | image: memcached 41 | ports: 42 | - "11211:11211" 43 | networks: 44 | - webnet 45 | 46 | mysql: 47 | build: 48 | context: ./mysql/ 49 | dockerfile: Dockerfile 50 | environment: 51 | MYSQL_ROOT_PASSWORD: EXAMPLE 52 | MYSQL_DATABASE: TEST 53 | MYSQL_USER: TEST 54 | MYSQL_PASSWORD: TEST 55 | volumes: 56 | - ./data-mysql:/var/lib/mysql 57 | networks: 58 | - webnet 59 | 60 | mongodb: 61 | image: mongo 62 | environment: 63 | - MONGO_DATA_DIR=/data/db 64 | volumes: 65 | - ./data-mongo:/data/db 66 | ports: 67 | - 27017:27017 68 | networks: 69 | - webnet 70 | 71 | networks: 72 | webnet: 73 | -------------------------------------------------------------------------------- /mysql/dump.sql: -------------------------------------------------------------------------------- 1 | -- phpMyAdmin SQL Dump 2 | -- version 4.6.6 3 | -- https://www.phpmyadmin.net/ 4 | -- 5 | -- Host: localhost:3306 6 | -- Generation Time: Aug 09, 2017 at 12:57 PM 7 | -- Server version: 5.5.55-cll 8 | -- PHP Version: 5.6.30 9 | 10 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 11 | SET time_zone = "+00:00"; 12 | 13 | 14 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 15 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 16 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 17 | /*!40101 SET NAMES utf8mb4 */; 18 | 19 | -- 20 | -- Database: `cirolini` 21 | -- 22 | 23 | -- -------------------------------------------------------- 24 | 25 | -- 26 | -- Table structure for table `test` 27 | -- 28 | 29 | CREATE TABLE `test` ( 30 | `id` int(11) NOT NULL, 31 | `test` varchar(250) NOT NULL 32 | ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 33 | 34 | -- 35 | -- Dumping data for table `test` 36 | -- 37 | 38 | INSERT INTO `test` (`id`, `test`) VALUES 39 | (1, 'test'), 40 | (2, 'test 2'); 41 | 42 | -- 43 | -- Indexes for dumped tables 44 | -- 45 | 46 | -- 47 | -- Indexes for table `test` 48 | -- 49 | ALTER TABLE `test` 50 | ADD PRIMARY KEY (`id`); 51 | 52 | -- 53 | -- AUTO_INCREMENT for dumped tables 54 | -- 55 | 56 | -- 57 | -- AUTO_INCREMENT for table `test` 58 | -- 59 | ALTER TABLE `test` 60 | MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; 61 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 62 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 63 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 64 | -------------------------------------------------------------------------------- /app/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flaskext.mysql import MySQL 3 | from redis import Redis, RedisError 4 | from pymongo import MongoClient 5 | import memcache 6 | import os 7 | import socket 8 | 9 | 10 | 11 | MYSQL_HOST = os.getenv("MYSQL_HOST", "mysql") 12 | MYSQL_ROOT_PASSWORD = os.getenv("MYSQL_ROOT_PASSWORD", "EXAMPLE") 13 | MYSQL_DATABASE = os.getenv("MYSQL_DATABASE", "TEST") 14 | MYSQL_USER = os.getenv("MYSQL_USER", "TEST") 15 | MYSQL_PASSWORD = os.getenv("MYSQL_PASSWORD", "TEST") 16 | MONGO_HOST = os.getenv("MONGO_HOST", "mongodb") 17 | REDIS_HOST = os.getenv("REDIS_HOST", "redis") 18 | MEMCACHE_HOST = os.getenv("MEMCACHE_HOST", "memcached") 19 | 20 | app = Flask(__name__) 21 | 22 | # Connect to Redis 23 | redis = Redis(host=REDIS_HOST, db=0, socket_connect_timeout=2, socket_timeout=2) 24 | 25 | # Connect to Memcache 26 | mc = memcache.Client([MEMCACHE_HOST], debug=0) 27 | mc.set("key", "1") 28 | 29 | # Configure MySQL connection. 30 | mysql = MySQL() 31 | 32 | app.config['MYSQL_DATABASE_USER'] = MYSQL_USER 33 | app.config['MYSQL_DATABASE_PASSWORD'] = MYSQL_PASSWORD 34 | app.config['MYSQL_DATABASE_DB'] = MYSQL_DATABASE 35 | app.config['MYSQL_DATABASE_HOST'] = MYSQL_HOST 36 | mysql.init_app(app) 37 | 38 | # Connect to mongodb 39 | mongo = MongoClient(MONGO_HOST, 27017) 40 | mongo_db = mongo.test 41 | 42 | @app.route("/") 43 | def hello(): 44 | try: 45 | # try redis 46 | redis_result = redis.incr("counter") 47 | 48 | #try memcache 49 | memcache_result = mc.incr("key") 50 | 51 | #try mysql 52 | mysql_cursor = mysql.get_db().cursor() 53 | mysql_cursor.execute("SELECT * from test") 54 | mysql_result = mysql_cursor.fetchone() 55 | 56 | #try mongodb 57 | mongo_db.test.insert({"value": 1}); 58 | mongo_result = mongo_db.test.find_one(); 59 | except: 60 | print("ERROR") 61 | 62 | 63 | html = "