Introduction
This article offers a look at how to get started with docker and flask through a practical and hands-on (approach) python application. The goal is to provide a first look and understanding of some of the most quintessential tools for developers in the contemporary world.
Docker
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.
Docker Container
Essentially, a container refers to a unit that houses all the code and dependencies of an application in a standard format that allows it to runs quickly and reliably across computing environments. Therefore, a docker container lightweight, standalone, executable container that comprises all components necessary to run an application such as libraries,code, and runtime.
Docker Installation
The recommended method of installation is through setting up Docker’s repositories and installing from them; it’s not only easy to install but also enables quick upgradability. Therefore, we shall install using the repository approach in Ubuntu 20.04 LTS.
Set up the repository
- First, update apt and install necessary packages to us a repository over HTTPS:
$ sudo apt-get update
$ sudo apt-get install \
> apt-transport-https \
> ca-certificates \
> curl \
> gnupg \
> lsb-release
- Add Docker’s official GPG key:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- Set up a stable repository and add the nightly or test (or both) repository:
$ echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Install Docker Engine
- Run an update apt and install the latest version of Docker Engine and containerd:
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
- Confirm whether the Docker Engine is correctly installed using hello-world:
$ sudo docker run hello-world
You can visit the official Docker Docs page to view the installation procedures for other operating systems.
Flask
This is a simple and lightweight Python web framework that offers useful tools for developing Python web applications. Flask is super useful for building microservices, you can utilize any number of its built-in extensions to design and deploy microservices at high velocity.
Setting Up Our Environment
This project will require:
- Python 3.6+ and PIP3
- Virtual environment - Venv
- Create project directory
- Create venv
- Install required packages using PIP e.g. Flask
- Create a directory for the app and navigate into the directory:
$ mkdir demoapp
$ cd demoapp/
- Create a virtual environment using
venv
:
$ python3 -m venv venv
$ ls
venv
- Activate the virtual environment:
$ source venv/bin/activate
The prefix (venv
) is an indication that the virtual environment is active.
- Install Flask using pip3:
$ pip3 install flask
Demo Flask Application
Build the python application:
This is a simple python application that utilizes the GET and POST requests. It creates a form where a user (say a student), is prompted to enter their name and the field of interest. The user inputs are the formatted and displayed upon clicking the submit button.
- Create
app.py
and code using an IDE of your choice. In this case, we use VS Code:
$ touch app.py
- Here is the code for the application:
# import Flask and request
from flask import Flask, app, request
# develop the app
app = Flask(__name__)
# both GET and POST requests
@app.route("/form-example", methods=['GET', 'POST'])
def form_example():
# the POST request
if request.method == 'POST':
username = request.form.get('username')
interest = request.form.get('interest')
return '''
<h1>The student's name is: {}</h1>
<h1>The field of interest is: {}</h1>'''.format(username, interest)
# the GET request
return '''
<form method="POST">
<div><label>Username: <input type="text" name="username"></label></div>
<div><label>Interest: <input type="text" name="interest"></label></div>
<input type="submit" value="Submit">
</form>'''
if __name__ == '__main__':
# we'll run the app in debug mode on port 3000
app.run(debug=True, port=3000, host="0.0.0.0")
- Generate a
requirements.txt
file using freeze command.
$ pip freeze > requirements.txt
Build the App’s container image:
In order to build the application, you need to use a Dockerfile. A Dockerfile is simply a text-based script of instructions that is used to create a container image.
- Create a file named Dockerfile in the same directory as
app.py
:
$ touch Dockerfile
- Contents of the Dockerfile:
FROM python:3.6
COPY . /src
COPY ./requirements.txt /src/requirements.txt
WORKDIR src
EXPOSE 3000:3000
RUN pip3 install -r requirements.txt
CMD [ "python", "app.py" ]
- Build the container image using docker build command:
$ sudo docker build -t demoapp .
Running the application:
- Start the container using
docker run
command
$ sudo docker run -dp 3000:3000 demoapp
- Use your browser to access http://172.17.0.2:3000/form-example. You should see the app!
Results
The first page is a form with Username and Interest field entries and a Submit button:
Upon entering the name, field of interest press Submit.
And Voila!