Adding Docker to your Python and Flask development environment can be confusing when you are just getting started with containers. Let's quickly get Docker installed and configured for developing Flask web applications on your local system.
Docker for Mac is necessary. I recommend the stable release unless you have an explicit purpose for the edge channel.
Within the Docker contain we will use:
All of the code for the Dockerfile and the Flask app are available open source under the MIT license on GitHub under the docker-flask-mac directory of the blog-code-examples repository. Use the code for your own purposes as much as you like.
We need to install Docker before we can spin up our Docker containers. If you already have Docker for Mac installed and working, feel free to jump to the next section.
On your Mac, download the Docker Community Edition (CE) for Mac installer.
Find the newly-downloaded install within Finder and double click on the file. Follow the installation process, which includes granting administrative privileges to the installer.
Open Terminal when the installer is done. Test your Docker installation with the
If Docker is installed correctly you should see the following output:
Docker version 17.12.0-ce, build c97c6d6
Note that Docker runs through a system agent you can find in the menu bar.
I have found the Docker agent to take up some precious battery life on my Macbook Pro. If I am not developing and need to max battery time I will close down the agent and start it back up again when I am ready to code.
Now that Docker is installed let's get to running a container and writing our Flask application.
Docker needs to know what we want in a container, which is where the
Dockerfile comes in.
# this is an official Python runtime, used as the parent image FROM python:3.6.4-slim # set the working directory in the container to /app WORKDIR /app # add the current directory to the container as /app ADD . /app # execute everyone's favorite pip command, pip install -r RUN pip install --trusted-host pypi.python.org -r requirements.txt # unblock port 80 for the Flask app to run on EXPOSE 80 # execute the Flask app CMD ["python", "app.py"]
Save the Dockerfile so that we can run our next command with the completed contents of the file. On the commandline run:
docker build -t flaskdock .
docker build file uses the
-t flag to tag the image with
the name of
If the build worked successfully we can see the image in with the
docker image ls command. Give that a try now:
docker image ls
We should then see our tag name in the images list:
REPOSITORY TAG IMAGE ID CREATED SIZE flaskdock latest 24045e0464af 2 minutes ago 165MB
Our image is ready to load up as a container so we can write a quick Flask app that we will use to test our environment by running it within the container.
Time to put together a super simple "Hello, World!" Flask web app to test
running Python code within our Docker container. Within the current
project directory, create a file named
app.py with the following contents:
from flask import Flask, Response app = Flask(__name__) @app.route("/") def hello(): return Response("Hi from your Flask app running in your Docker container!") if __name__ == "__main__": app.run("0.0.0.0", port=80, debug=True)
The above 7 lines of code (not counting blank PEP8-compliant lines) in app.py allow our application to return a simple message when run with the Flask development server.
Save the file and we can give the code a try.
Now that we have our image in hand along with the Python code in a file
we can run the image as a container with the
docker run command. Execute
the following command, making sure to replace the absolute path for the
volume to your own directory.
docker run -p 5000:80 --volume=/Users/matt/devel/py/flaskdocker:/app flaskdock
If you receive the error
python: can't open file 'app.py': [Errno 2] No such file or directory then
you likely forgot to chance
/Users/matt/devel/py/flaskdocker to the
directory where your project files, especially
app.py, are located.
Everything worked when you see a simple text-based HTTP response like what is shown above in the screenshot of my Chrome browser.
We just installed Docker and configured a Flask application to run inside a container. That is just the beginning of how you can integrate Docker into your workflow. I strongly recommend reading the Django with PostgreSQL quickstart that will introduce you to Docker Swarm as well as the core Docker container service.