3

I have a simple Python based web server running in a container set up with docker compose that exposes port 8080.

When I docker-compose up the services it reports the ports are exposed but the port is not exposed externally.

What should I look at diagnosing next?

Here's a typical run

➜  demo04 sudo docker-compose up -d
Recreating leagueweb_database ... done
Recreating leagueweb_server   ... done

The Python web server (using CherryPy) reports it has started OK and opened port 8080.

leagueweb_server | [25/Jan/2022:11:27:21] ENGINE Serving on http://127.0.0.1:8080

Docker reports that it is forwarding port 8080

➜  demo04 sudo docker-compose ps
       Name                     Command                  State                              Ports
------------------------------------------------------------------------------------------------------------------------
leagueweb_database   /entrypoint.sh mysqld            Up (healthy)   0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
leagueweb_server     ./wait-for-it.sh database: ...   Up             0.0.0.0:8080->8080/tcp,:::8080->8080/tcp

Testing this from a remote PC I can see that although port 3306 is open externally - port 8080 is not.

PS C:> Test-NetConnection 192.168.1.132 -Port 3306
RemoteAddress    : 192.168.1.132
RemotePort       : 3306
TcpTestSucceeded : True

PS C:> Test-NetConnection 192.168.1.132 -Port 8080
WARNING: TCP connect to (192.168.1.132 : 8080) failed

The firewall is turned off

➜  demo04 sudo ufw status
Status: inactive

This is the docker compose file

version: '3'
services:

    leagueweb:
        # Install Python and required libraries with a Dockerfile
        build:
            context: .
            dockerfile: leagueweb.dockerfile
            
        restart: unless-stopped
        
        container_name: leagueweb_server
        
        # Don't start up until the database is started
        depends_on:
            - database
        
        # Expose HTTP port 
        ports:
            - "8080:8080"

        # Mount the leagueweb code and resources
        volumes:
            - "/home/testuser/demo04/code:/leagueweb"
 
        # Start the server only once the database is running
        command: ["./wait-for-it.sh", "database:3306", "--", "python", "-u", "/leagueweb/leagueweb.py"]
        

    database:
        # Use MySQL 5.7 as the database
        image: mysql/mysql-server:5.7
        
        restart: unless-stopped
        
        container_name: leagueweb_database

        # Set environment variables to set initial database set-up
        environment:
            - "MYSQL_ROOT_PASSWORD=root"
            - "MYSQL_USER=leagueweb"
            - "MYSQL_PASSWORD=********"
            - "MYSQL_DATABASE=leagueweb01"
            
        # Uncomment to expose the MySQL database externally on port 3306 for 
        # testing 
        ports:
            - "3306:3306"

        # Mount init.sql file to automatically run and create tables for us.
        # everything in docker-entrypoint-initdb.d folder is executed as 
        # soon as container is up and running.
        volumes:
            - "/home/testuser/demo04/db:/docker-entrypoint-initdb.d"

1 Answer 1

5

This looks like a problem:

ENGINE Serving on http://127.0.0.1:8080

Looks like you need to reconfigure your python server to listen on 0.0.0.0, not 127.0.0.1

2
  • 1
    Thanks. Can't believe I didn't see that - it was starting me in the face. Looks like I had got too focused on thinking it was a container issue.
    – evoelise
    Jan 25, 2022 at 15:00
  • 1
    Happens to us all!
    – shearn89
    Jan 25, 2022 at 15:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.