Reading time: 2 minutes
When implementing Nginx Proxy Manager in Docker or Docker Compose, it is important to ensure that it accesses the implemented containers/services using a local address to avoid going through the public network if the connection is not SSL internally. This way, we prevent unencrypted traffic from going outside.
The first thing we need to do is to connect the Docker containers in the Docker Compose file by adding links:
version: "3.1"
services:
miservicio_mysql:
image: biarms/mysql:5.7
env_file:
- ./Dockerfile/mysql.env
container_name: mysql_container
command: --max_allowed_packet=67108864
environment:
MYSQL_DATABASE: "db"
MYSQL_USER: "user"
MYSQL_PASSWORD: "pass_user"
# Password for root access
MYSQL_ROOT_PASSWORD: "pass_root"
volumes:
# Mount a volume for MySQL to preserve database data
- ./mysql:/var/lib/mysql
expose:
- 3306
ports:
- 3306:3306
networks:
- docker-network
miservicio_php:
build:
context: ./Dockerfile
dockerfile: php_file
env_file:
- ./Dockerfile/php.env
container_name: php_container
volumes:
- ./www/:/var/www/html
- ./logs/apache:/var/log/apache2
expose:
- 80
- 443
ports:
- 8000:80
- 442:443
links:
- miservicio_mysql
networks:
- docker-network
adminer:
image: adminer
restart: always
ports:
- 8080:8080
links:
- miservicio_mysql:db
networks:
- docker-network
nginxproxymanager:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in the format :
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Default user:
# Email: admin@example.com
# Password: changeme
volumes:
- ./config/proxymanager/data:/data
- ./config/letsencrypt:/etc/letsencrypt
networks:
- docker-network
links:
- miservicio_mysql
- miservicio_php
- adminer
networks:
docker-network:
driver: bridge
As you can see in the example, I have added links in the nginxproxymanager container:
- miservicio_mysql - miservicio_php - adminer
This allows nginxproxymanager to access these containers locally.
Additionally, I have connected them through a Docker network named docker-network.
Now, in Nginx Proxy Manager, log in and go to the proxies:

Now, add or edit one and instead of using the IP, use the name of the container (either the one specified in the root or within the container_name tag):

And most importantly, remember to use the original service port in your Docker, not the exposed one. In other words, use the port on the right side within the ports section of your Docker Compose containers:
ports:
- 8000:80
- 442:443
