On a separate PC (which has the locally accessible only IP, I have 3 containers: docker_compose_ui, docker_compose_web_console & nginx

Two of the containers are listening on ports but have not been forwarded to the host:

docker_compose_ui 5000/tcp
docker_compose_web_console 8888/tcp

Nginx is forwarded:

nginx>80/tcp, :::80->80/tcp

docker_compose_ui & docker_compose_web_console are on network backbone.

nginx is on networks backbone and outward.

Anything on backbone are not meant to be host-forwarded, thus not public accessible.

Anything on outward are meant to be host-forwarded, thus public accessible.

EDIT: To clarify, when I say public, I just meant outward from the host machine, I have not actually forwarded any ports to the internet via my router, yet.

If I inspect the network backbone I can see the IP addresses:


If I inspect the network outward I can see the IP address for mginx,

If I curl from nginx to docker_compose_ui:

 docker exec nginx curl http://docker_compose_ui:5000

I get a html response and Ok, so docker_compose_ui is both reachable from nginx and resolvable.

If I do docker exec nginx nginx -T I can see that the config is being loaded by nginx (last server directive).

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
# /etc/nginx/nginx.conf

user nginx;

# Set number of worker processes automatically based on number of CPU cores.
worker_processes auto;

# Enables the use of JIT for regular expressions to speed-up their processing.
pcre_jit on;

# Configures default error logger.
error_log /var/log/nginx/error.log warn;

# Includes files with directives to load dynamic modules.
include /etc/nginx/modules/*.conf;

# Uncomment to include files with config snippets into the root context.
# NOTE: This will be enabled by default in Alpine 3.15.
#include /etc/nginx/conf.d/*.conf;

events {
        # The maximum number of simultaneous connections that can be opened by
        # a worker process.
        worker_connections 1024;

http {
    # Docker dns resolver
    resolver ipv6=off;
        # Includes mapping of file name extensions to MIME types of responses
        # and defines the default type.
        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        # Name servers used to resolve names of upstream servers into addresses.
        # It's also needed when using tcpsocket and udpsocket in Lua modules.
        #resolver 2606:4700:4700::1111 2606:4700:4700::1001;

        # Don't tell nginx version to the clients. Default is 'on'.
        server_tokens off;

        # Specifies the maximum accepted body size of a client request, as
        # indicated by the request header Content-Length. If the stated content
        # length is greater than this size, then the client receives the HTTP
        # error code 413. Set to 0 to disable. Default is '1m'.
        client_max_body_size 1m;

        # Sendfile copies data between one FD and other from within the kernel,
        # which is more efficient than read() + write(). Default is off.
        sendfile on;

        # Causes nginx to attempt to send its HTTP response head in one packet,
        # instead of using partial frames. Default is 'off'.
        tcp_nopush on;

        # Enables the specified protocols. Default is TLSv1 TLSv1.1 TLSv1.2.
        # TIP: If you're not obligated to support ancient clients, remove TLSv1.1.
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

        # Path of the file with Diffie-Hellman parameters for EDH ciphers.
        # TIP: Generate with: `openssl dhparam -out /etc/ssl/nginx/dh2048.pem 2048`
        #ssl_dhparam /etc/ssl/nginx/dh2048.pem;

        # Specifies that our cipher suits should be preferred over client ciphers.
        # Default is 'off'.
        ssl_prefer_server_ciphers on;

        # Enables a shared SSL cache with size that can hold around 8000 sessions.
        # Default is 'none'.
        ssl_session_cache shared:SSL:2m;

        # Specifies a time during which a client may reuse the session parameters.
        # Default is '5m'.
        ssl_session_timeout 1h;

        # Disable TLS session tickets (they are insecure). Default is 'on'.
        ssl_session_tickets off;

        # Enable gzipping of responses.
        gzip on;

        # Set the Vary HTTP header as defined in the RFC 2616. Default is 'off'.
        gzip_vary on;

        # Helper variable for proxying websockets.
        map $http_upgrade $connection_upgrade {
                default upgrade;
                '' close;

        # Specifies the main log format.
        log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

        # Sets the path, format, and configuration for a buffered log write.
        access_log /var/log/nginx/access.log main;

        # Includes virtual hosts configs.
        include /etc/nginx/sites-enabled/*;

# TIP: Uncomment if you use stream module.
#include /etc/nginx/stream.conf;

# configuration file /etc/nginx/mime.types:

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.wap.wmlc                         wmlc;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;

# configuration file /etc/nginx/sites-enabled/_default.conf:
# This is a default site configuration which will simply return 404, preventing
# chance access to any other virtualhost.

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # Everything is a 404
        location / {
                return 404;

        # You may need this to prevent return 404 recursion.
        location = /404.html {

# configuration file /etc/nginx/sites-enabled/docker_compose_ui.conf:
server {
    listen       80;
    #server_name  localhost;
    server_name  _;

    access_log  /var/log/nginx/docker_compose_ui.access.log  main;

    location /docker-compose-ui/ {
        proxy_pass http://docker_compose_ui:5000;

    location /web-console/ {
        proxy_pass http://docker_compose_web_console:8888;

    location /web-console/exec {
        proxy_pass http://docker_compose_web_console:8888;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

docker-compose config (two separate files):

--- # docker-compose-ui.yml

version: "3.9"

    image: francescou/docker-compose-ui
    container_name: docker_compose_ui
    hostname: docker_compose_ui
    restart: unless-stopped
    working_dir: /opt/docker-compose-projects
      - 'WEB_CONSOLE_PATTERN=/web-console/?cid={containerName}&cmd={command}'
      - /var/run/docker.sock:/var/run/docker.sock
      - /opt/docker-compose-pojects:/data/docker/docker-compose-ui
      - backbone
    image: bitbull/docker-exec-web-console
    container_name: docker_compose_web_console
    hostname: docker_compose_web_console
    restart: unless-stopped
      - 'CONTEXT_PATH=/web-console/'
    read_only: true
      - /var/run/docker.sock:/var/run/docker.sock
      - backbone

    external: true

--- # nginx.yml

version: "3.9"

    image: nginx:mainline-alpine
    container_name: nginx
    restart: unless-stopped
      - /data/docker/nginx:/etc/nginx
      - /var/log/nginx:/var/log/nginx
      - /var/run:/var/run
      - /var/cache/nginx
      - "80:80"
      - backbone
      - outward

    external: true
    external: true

Doing from my laptop returns the standard "Nginx is installed message".

Why then does from my laptop return only a HTTP 404 error page?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.