Search code examples
node.jsoracle-databasedockerconnection

Node.js app in a docker container not reachable over Internet "Connection refused"


I am struggling for a quite some time making a node.js app to be accessible over Internet. The docker container is running on a port 9000. The host machine is an Oracle Linux virtual machine one, on the Oracle Cloud. I have enabled the port 9000 there.

In the container I run the node.js app with:

sh-4.2# node index.js
Starting application
Initializing database module
libDir = /usr/lib/oracle/19.3/client64/lib
Initializing web server module
Web server listening on Host:0.0.0.0, Port:9000

Check the docker container process from within the Oracle Linux host: docker ps

CONTAINER ID        IMAGE                          COMMAND             CREATED              STATUS              PORTS               NAMES
8504964aa23c        227d64c853db/domaevid-server   "sh"                About a minute ago   Up About a minute   9000/tcp            mystifying_babbage

And testing the connection on the host is giving back the error:

[opc@instance-20210318-1902 ~]$ curl http://public.ip:9000/api/home
curl: (7) Failed connect to public.ip:9000; Connection refused

The content of the Dockerfile:

FROM oraclelinux:7-slim

WORKDIR /usr/src/app
COPY package*.json ./

RUN  yum -y install oracle-release-el7 && \
    yum -y install oracle-instantclient19.3-basiclite && \
    yum -y install oracle-nodejs-release-el7 && \
    yum-config-manager --disable ol7_developer_EPEL && \
    yum install vim-enhanced -y && \ 
    yum -y install nodejs && \
    npm install && \
    rm -rf /var/cache/yum
RUN echo "export xxx" >> ~/.bashrc && \
    echo "export xxx" >> ~/.bashrc && \
    echo "export xxx" >> ~/.bashrc && \
    echo "export xxx" >> ~/.bashrc && \
    echo "export xxx" >> ~/.bashrc
RUN source ~/.bashrc 
COPY /_docker/ORACLE/NETWORK/ADMIN/* /usr/lib/oracle/19.3/client64/lib/network/admin 

COPY . .

EXPOSE 9000
CMD [ "node", "index.js" ]

What else should be done so the node.js app is reachable over Internet?

Kind regards, Dime


Solution

  • It looks like you haven't mapped port 9000 in the container to port 9000 on the host when you started the container.

    The 'Ports' section of the docker ps display looks like this

    PORTS
    9000/tcp
    

    but should look like this

    PORTS
    0.0.0.0:9000->9000/tcp
    

    You map the port by adding -p 9000:9000 as a parameter on the docker run command (before the image name). This maps port 9000 on the host to port 9000 in the container, so it's reachable.