Atualmente, estou fazendo algo semelhante. Eu uso o recurso de link do Docker. Ao vincular dois contêineres, você pode definir um DN no qual o contêiner vinculado está acessível. Eu pessoalmente uso docker-compose para uma configuração melhor do que apenas comandos simples. Você pode até mesmo configurar redes e dar aos contêineres acesso a isso. Mas todos os acessos acontecem sobre o docker e criam DNs, pois os IPs do contêiner podem ser alterados na reinicialização.
Como exemplo, como eu o uso para owncloud e nginx como um proxy de descarregamento SSL.
version: '2'
services:
nginx:
container_name: nginx_proxy
image: nginx
links:
- owncloud:owncloud
networks:
- owncloud_web
ports:
- 80:80
- 443:443
volumes:
- ...
owncloud:
container_name: owncloud
links:
- owncloud_db:postgresql
networks:
- gitlab_web
volumes:
- ...
owncloud_db:
container_name: owncloud_db
image: postgres:9.4
networks:
- owncloud_db
volumes:
- ...
networks:
owncloud_web:
owncloud_db:
Com esse nginx pode acessar owncloud sob owncloud enquanto owncloud pode acessar seu banco de dados sob postgresql. Eu configurei redes separadas para que o nginx não possa acessar o banco de dados diretamente.
Ao usar um servidor DNS externo, você precisa saber os endereços IP dos contêineres que podem ser alterados em qualquer reinicialização. Até mesmo a sub-rede completa pode mudar. Então você tem que implementar um sistema DNS dinâmico ou esperar que o IP não mude.
Ao usar internamente do docker, você não precisa executar nenhum serviço adicional e nunca precisa depender de endereços IP.