I'm at the first stage in learning how to use Docker so I'm trying basic things. I've created two Node Express services that need to exchange data via HTTP-requests.
My docker-compose.yml
file
networks: isolation-network: driver: bridge services: service1-nodejs: build: context: ./service1/ dockerfile: .docker/node.dockerfile ports: - "10000:9000" - "10001:5858" env_file: ./service1/.docker/env/app.${APP_ENV}.env networks: - isolation-network service2-nodejs: build: context: ./service2/ dockerfile: .docker/node.dockerfile ports: - "10010:9000" - "10011:5858" env_file: ./service2/.docker/env/app.${APP_ENV}.env networks: - isolation-network
service1
uses the request module to make a POST-request to service 2
.
request({ url: "http://service2:10010/api/", method: "POST", headers: { "Content-Type": "application/json" }, json: true, body: { ... }, time: true }, function (err, res, body) { if (!err && res.statusCode == 200) { // success } // failed });
The result of this call is:
{ Error: connect ECONNREFUSED 172.18.0.3:10010}
Using postman I can test service2
at http://localhost:10010/api/
and I can confirm they actually can be reached and work as expected.
I'm missing something but can't figure it out. What is going wrong here?
If you are running more than one container, you can let your containers communicate with each other by attaching them to the same network. Docker creates virtual networks which let your containers talk to each other. In a network, a container has an IP address, and optionally a hostname.
Containers can only communicate with each other if they share a network. Containers that don't share a network cannot communicate with one another. That's one of the isolation features provided by Docker. A container can belong to more than one network, and a network can have multiple containers inside.
Docker also finds ports you expose with --expose 8080 (assuming you want to expose port 8080). Docker maps all of these ports to a host port within a given epehmeral port range . You can find the configuration for these ports (usually 32768 to 61000) in /proc/sys/net/ipv4/ip_local_port_range .
See the document. The port 10010 is a host port but not container port. You should use 9000 when you access service2
container directly.
So just change "http://service2:10010/api/"
to "http://service2:9000/api/"
and it will work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With