How do you access a service that is in another stack?
I have a docker swarm configuration and in there I deployed two stacks (main
and mon
) I can expose a port in one stack and I can refer to it from another. However, I was trying to find a way of not doing that but instead have it access it using the 127.0.0.11 DNS.
In mon
I have a service called grafana
Using https://docs.docker.com/docker-cloud/apps/service-links/#discovering-services-or-containers-on-another-stack which indicated that I can use the stack name to refer to it didn't work when I tried to ping grafana.mon
it just returned invalid host name.
To do this, all you need is to make it use the same network, then they will be visible. In my case I defined a network called public
, that is referred to externally by all my stacks
docker network create -d overlay --attachable public
From there in my docker-compose.yml file I have
networks:
public:
external:
name: public
To access it, just use the service name.
You need to enable both stacks to connect through an overlay network type, and then allow both stacks to use (at least on the service required) the overlay network that was created externally to both stacks.
The overlay network should be created before the stacks go up, so the services that needs to connect through can 'attach' to it.
Create the network like this
docker network create --driver overlay --attachable
Then reference the service name on your env file, you can check what name does your services has calling
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
vkz5vccbmce7 foo-stack_por-service replicated 1/1 por-service:1.0.0 *:33065->3306/tcp
sjpnrkm1iiha foo-stack_vic-service replicated 1/1 vic-service:1.0.0 *:8081->80/tcp
0capavl31oab bar-stack_tar-service replicated 1/1 tar-service:1.0.0 *:33066->3306/tcp
9vohh24jt6hy bar-stack_zen-service replicated 1/1 zen-service:1.0.0 *:8082->80/tcp
Now get the name the service from the NAME column. Ex: bar-stack_tar-service
Notice your services are prefixed by the stack name you give when deploy
docker stack ls
NAME SERVICES ORCHESTRATOR
foo-stack 2 Swarm
bar-stack 2 Swarm