Flask bagi yang belum tahu adalah web framework berbasis bahasa pemrograman python. Salah satu framework populer ini memang sangat mudah digunakan. Pada tutorial kali ini, kita akan menginstall Flask Framework dengan Docker. Docker sendiri memungkinkan kita membuat lingkungan development yang sama pengalamannya dan mudah pengalamannya.
Syarat:
- punya akun root atau akun non-root dengan kemampuan sudo,
- sudah terinstall docker dan docker compose
- koneksi internet
Langkah 1: Buat file Docker Compose
Buat sebuah folder dengan nama
flaskapp misalnya, lalu buat file
docker-compose.yml dengan konten seperti ini:
[sourcecode]
version: '3'
services:
flask:
build:
context: app
dockerfile: Dockerfile
container_name: flask
image: digitalocean.com/flask-python:3.6
restart: unless-stopped
environment:
APP_ENV: "prod"
APP_DEBUG: "False"
APP_PORT: 5000
MONGODB_DATABASE: flaskdb
MONGODB_USERNAME: flaskuser
MONGODB_PASSWORD: your_mongodb_password
MONGODB_HOSTNAME: mongodb
volumes:
- appdata:/var/www
depends_on:
- mongodb
networks:
- frontend
- backend
mongodb:
image: mongo:4.0.8
container_name: mongodb
restart: unless-stopped
command: mongod --auth
environment:
MONGO_INITDB_ROOT_USERNAME: mongodbuser
MONGO_INITDB_ROOT_PASSWORD: your_mongodb_root_password
MONGO_INITDB_DATABASE: flaskdb
MONGODB_DATA_DIR: /data/db
MONDODB_LOG_DIR: /dev/null
volumes:
- mongodbdata:/data/db
networks:
- backend
webserver:
build:
context: nginx
dockerfile: Dockerfile
image: digitalocean.com/webserver:latest
container_name: webserver
restart: unless-stopped
environment:
APP_ENV: "prod"
APP_NAME: "webserver"
APP_DEBUG: "true"
SERVICE_NAME: "webserver"
ports:
- "80:80"
- "443:443"
volumes:
- nginxdata:/var/log/nginx
depends_on:
- flask
networks:
- frontend
networks:
frontend:
driver: bridge
backend:
driver: bridge
volumes:
mongodbdata:
driver: local
appdata:
driver: local
nginxdata:
driver: local
[/sourcecode]
Langkah 2: Bikin Template Server Flask dengan Dockerfile
Pada folder diatas tadi, silakan bikin folder
app lalu bikin file Dockerfile dengan konten:
[sourcecode]
FROM python:3.6.8-alpine3.9
LABEL MAINTAINER="FirstName LastName <example@domain.com>"
ENV GROUP_ID=1000 \
USER_ID=1000
WORKDIR /var/www/
ADD . /var/www/
RUN pip install -r requirements.txt
RUN pip install gunicorn
RUN addgroup -g $GROUP_ID www
RUN adduser -D -u $USER_ID -G www www -s /bin/sh
USER www
EXPOSE 5000
CMD [ "gunicorn", "-w", "4", "--bind", "0.0.0.0:5000", "wsgi"]
[/sourcecode]
pada folder
/flaskapp buat folder nginx, kemudian file Dockerfile:
[sourcecode]
FROM digitalocean.com/alpine:latest
LABEL MAINTAINER="FirstName LastName <example@domain.com>"
RUN apk --update add nginx && \
ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log && \
mkdir /etc/nginx/sites-enabled/ && \
mkdir -p /run/nginx && \
rm -rf /etc/nginx/conf.d/default.conf && \
rm -rf /var/cache/apk/*
COPY conf.d/app.conf /etc/nginx/conf.d/app.conf
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
[/sourcecode]
lalu buat Reverse Proxy dengan Nginx. buat folder /flaskapp/nginx/conf.d/. buat file
app.conf.
[sourcecode]
upstream app_server {
server flask:5000;
}
server {
listen 80;
server_name _;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
client_max_body_size 64M;
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
gzip_static on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_buffering off;
proxy_redirect off;
proxy_pass http://app_server;
}
}
[/sourcecode]
Langkah 3: Contoh Aplikasi Flask
Contoh bikin sebuah file bernama
/app/app.py dengan contoh:
[sourcecode language="python"]
import os
from flask import Flask, request, jsonify
from flask_pymongo import PyMongo
application = Flask(__name__)
application.config["MONGO_URI"] = 'mongodb://' + os.environ['MONGODB_USERNAME'] + ':' + os.environ['MONGODB_PASSWORD'] + '@' + os.environ['MONGODB_HOSTNAME'] + ':27017/' + os.environ['MONGODB_DATABASE']
mongo = PyMongo(application)
db = mongo.db
@application.route('/')
def index():
return jsonify(
status=True,
message='Welcome to the Dockerized Flask MongoDB app!'
)
@application.route('/todo')
def todo():
_todos = db.todo.find()
item = {}
data = []
for todo in _todos:
item = {
'id': str(todo['_id']),
'todo': todo['todo']
}
data.append(item)
return jsonify(
status=True,
data=data
)
@application.route('/todo', methods=['POST'])
def createTodo():
data = request.get_json(force=True)
item = {
'todo': data['todo']
}
db.todo.insert_one(item)
return jsonify(
status=True,
message='To-do saved successfully!'
), 201
if __name__ == "__main__":
ENVIRONMENT_DEBUG = os.environ.get("APP_DEBUG", True)
ENVIRONMENT_PORT = os.environ.get("APP_PORT", 5000)
application.run(host='0.0.0.0', port=ENVIRONMENT_PORT, debug=ENVIRONMENT_DEBUG)
[/sourcecode]
lalu buat file
wsgi.py dengan konten:
[sourcecode]
from app import application
if __name__ == "__main__":
application.run()
[/sourcecode]
Langkah 4: Build Container dan Coba
Pastikan semua langkah diatas sudah di ikuti, lalu jalankan docker-compose untuk membuat stack server Nginx, Flask/Python, dan MongoDB.
[sourcecode]docker-compose up -d[/sourcecode]
dan coba dengan:
[sourcecode]curl -i http://your_server_ip/todo[/sourcecode]