Reading time: 3 minutes
In this tutorial, we will show you how to create a Docker container with NGINX Proxy Manager, phpMyAdmin, MySQL, and FastAPI (with Python) using Docker Compose. This will allow you to have a complete stack for web development and API in a single container.

Prerequisites
Before getting started, you will need to have Docker and Docker Compose installed on your machine. If you haven’t done so already, follow these steps:
- Download and install Docker Desktop from the official website: https://www.docker.com/products/docker-desktop
- Verify that Docker has been installed successfully by running the following command in the terminal:
docker --version
You should see the version of Docker that you have installed.
Install Docker Compose by following the instructions in the official documentation: https://docs.docker.com/compose/install/
Verify that Docker Compose has been installed successfully by running the following command in the terminal:
docker-compose --versionYou should see the version of Docker Compose that you have installed.
Step 1: Create the docker-compose.yml File
The first thing we need to do is create a docker-compose.yml file in a new directory. You can do this by running the following command in the terminal:
mkdir myapp && cd myapp touch docker-compose.yml
Then, open the docker-compose.yml file in your favorite text editor and add the following content:
version: "3.8"
services:
proxy:
image: jlesage/nginx-proxy-manager:latest
container_name: proxy
restart: always
ports:
- "80:80"
- "443:443"
- "81:81"
environment:
- TZ=America/New_York
- PUID=1000
- PGID=1000
volumes:
- ./data:/config
- ./letsencrypt:/etc/letsencrypt
- ./nginx.tmpl:/app/nginx.tmpl:ro
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
container_name: phpmyadmin
restart: always
ports:
- "8080:80"
environment:
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=my-secret-pw
mysql:
image: mysql:8
container_name: mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=my-secret-pw
volumes:
- mysql-data:/var/lib/mysql
app:
build: ./app
container_name: app
restart: always
ports:
- "8000:8000"
environment:
- DATABASE_URL=mysql+pymysql://root:my-secret-pw@mysql:3306/mydatabase
depends_on:
- mysql
volumes:
mysql-data:
This file defines four services:
proxy: uses the NGINX Proxy Manager image to handle reverse proxy management and SSL certificate management.phpmyadmin: uses the phpMyAdmin image to provide a user-friendly graphical interface for MySQL.mysql: uses the official MySQL image for the database server.app: builds the FastAPI application image using theDockerfilelocated in the./appdirectory.
Step 2: Create the FastAPI Application
Now we need to create the FastAPI application. In this tutorial, we will use a simple example that demonstrates how to connect to the MySQL database.
First, create a new app directory inside the myapp directory. Then, create a app/main.py file with the following content:
FROM python:3.9 WORKDIR /app COPY requirements.txt ./ RUN pip install -r requirements.txt COPY ./app . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
This file defines the Docker image for our FastAPI application, which uses Python 3.9 and runs on port 8000.
Finally, create a app/requirements.txt file with the following content:
fastapi uvicorn SQLAlchemy pymysql
This file defines the dependencies of our application, including FastAPI, Uvicorn, SQLAlchemy, and PyMySQL.
Step 3: Run the Docker Container
Now we are ready to run the Docker container using Docker Compose.
To do this, make sure you are in the myapp directory and run the following command in the terminal:
docker-compose up -d
This command will start the four services defined in the docker-compose.yml file in detached mode, which means they will run in the background.
Once the containers are up and running, you can access the following URLs from your web browser:
- NGINX Proxy Manager: http://localhost:81
- phpMyAdmin: http://localhost:8080
- FastAPI: http://localhost:8000
Conclusion
In this tutorial, you learned how to create a Docker container that includes NGINX Proxy Manager, phpMyAdmin, MySQL, and FastAPI. Using Docker Compose, you were able to define and run all these services with a single command. This approach allows you to build more complex web applications and APIs in a controlled and scalable environment.
