4

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 Answers1

6

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

shearn89
  • 3,610