To use Docker's port forwarding for Redis, add the flag -p host port:6379 to the docker run command. For example, to set up port forwarding so that you can connect to the container using port 7001, the docker run command is: sudo docker run -name my-redis-container -p 7001:6379 -d redis. You can then switch to another server. Step 3: Connect to your database #. The below CLI uses the first three alphanumeric character of Container ID and opens up 'sh' shell of Redis Docker container: $ docker exec -it 241 sh. Step 4: Testing Redis container #. Execute the below command to test the Redis server: 127.0.0.1:6379ping.
Estimated reading time: 11 minutes
On this page you build a simple Python web application running on DockerCompose. The application uses the Flask framework and maintains a hit counter inRedis. While the sample uses Python, the concepts demonstrated here should beunderstandable even if you’re not familiar with it.
Make sure you have already installed both Docker Engineand Docker Compose. You don’t need to install Python or Redis, asboth are provided by Docker images.
Define the application dependencies.
Create a directory for the project:
Create a file called
app.py in your project directory and paste this in:
In this example,
redis is the hostname of the redis container on theapplication’s network. We use the default port for Redis,
Handling transient errors
Note the way the
get_hit_countfunction is written. This basic retryloop lets us attempt our request multiple times if the redis service isnot available. This is useful at startup while the application comesonline, but also makes our application more resilient if the Redisservice needs to be restarted anytime during the app’s lifetime. In acluster, this also helps handling momentary connection drops betweennodes.
Create another file called
requirements.txt in your project directory andpaste this in:
In this step, you write a Dockerfile that builds a Docker image. The imagecontains all the dependencies the Python application requires, including Pythonitself.
In your project directory, create a file named
Dockerfile and paste thefollowing:
This tells Docker to:
requirements.txtand install the Python dependencies.
.in the project to the workdir
.in the image.
For more information on how to write Dockerfiles, see theDocker user guideand the Dockerfile reference.
Create a file called
docker-compose.yml in your project directory and pastethe following:
This Compose file defines two services:
web service uses an image that’s built from the
Dockerfile in the current directory.It then binds the container and the host machine to the exposed port,
5000. This example service uses the default port for the Flask web server,
redis service uses a public Redis image pulled from the Docker Hub registry.
From your project directory, start up your application by running
Compose pulls a Redis image, builds an image for your code, and starts theservices you defined. In this case, the code is statically copied into the image at build time.
Enter http://localhost:5000/ in a browser to see the application running.
If you’re using Docker natively on Linux, Docker Desktop for Mac, or Docker Desktop forWindows, then the web app should now be listening on port 5000 on yourDocker daemon host. Point your web browser to http://localhost:5000 tofind the
Hello World message. If this doesn’t resolve, you can also tryhttp://127.0.0.1:5000.
If you’re using Docker Machine on a Mac or Windows, use
docker-machine ipMACHINE_VM to get the IP address of your Docker host. Then, open
http://MACHINE_VM_IP:5000 in a browser.
You should see a message in your browser saying:
Refresh the page.
The number should increment.
Switch to another terminal window, and type
docker image ls to list local images.
Listing images at this point should return
You can inspect images with
docker inspect <tag or id>.
Stop the application, either by running
docker-compose downfrom within your project directory in the second terminal, or byhitting CTRL+C in the original terminal where you started the app.
docker-compose.yml in your project directory to add abind mount for the
volumes key mounts the project directory (current directory) on thehost to
/code inside the container, allowing you to modify the code on thefly, without having to rebuild the image. The
environment key sets the
FLASK_ENV environment variable, which tells
flask run to run in developmentmode and reload the code on change. This mode should only be used in development.
From your project directory, type
docker-compose up to build the app with the updated Compose file, and run it.
Hello World message in a web browser again, and refresh to see thecount increment.
Shared folders, volumes, and bind mounts
If your project is outside of the
Users directory (
cd ~), then youneed to share the drive or location of the Dockerfile and volume you are using.If you get runtime errors indicating an application file is not found, a volumemount is denied, or a service cannot start, try enabling file or drive sharing.Volume mounting requires shared drives for projects that live outside of
C:Users (Windows) or
/Users (Mac), and is required for any project onDocker Desktop for Windows that uses Linux containers.For more information, see File sharing on Dockerfor Mac, and the general examples on how toManage data in containers.
If you are using Oracle VirtualBox on an older Windows OS, you might encounter an issue with shared folders as described in this VB troubleticket. Newer Windows systems meet therequirements for Docker Desktop for Windows and do notneed VirtualBox.
Because the application code is now mounted into the container using a volume,you can make changes to its code and see the changes instantly, without havingto rebuild the image.
Change the greeting in
app.py and save it. For example, change the
Hello World!message to
Hello from Docker!:
Refresh the app in your browser. The greeting should be updated, and thecounter should still be incrementing.
If you want to run your services in the background, you can pass the
-d flag(for “detached” mode) to
docker-compose up and use
docker-compose ps tosee what is currently running:
docker-compose run command allows you to run one-off commands for yourservices. For example, to see what environment variables are available to the
docker-compose --help to see other available commands. You can also install command completion for the bash and zsh shell, which also shows you available commands.
If you started Compose with
docker-compose up -d, stopyour services once you’ve finished with them:
You can bring everything down, removing the containers entirely, with the
--volumes to also remove the data volume used by the Rediscontainer:
At this point, you have seen the basics of how Compose works.