Você não pode fazer isso via Docker, mas pode acessar a porta não exposta do contêiner na máquina host.
se você tiver um contêiner que, com algo em execução na porta 8000, poderá executar
wget http://container_ip:8000
Para obter o endereço IP do contêiner, execute os 2 comandos:
docker ps
docker inspect container_name | grep IPAddress
Internamente, o Docker faz chamadas para iptables quando você executa uma imagem, portanto, talvez alguma variação disso funcione.
para expor a porta 8000 do contêiner na porta 8001 de localhosts:
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000
Uma maneira de resolver isso é configurar outro contêiner com o mapeamento de porta desejado e comparar a saída do comando iptables-save (porém, tive que remover algumas das outras opções que forçam o tráfego a passar pelo docker proxy).
NOTA: isso está subvertendo a janela de encaixe, portanto, isso deve ser feito com a consciência de que pode criar fumaça azul
OU
Outra alternativa é procurar a opção (new? Post 0.6.6?) -P - que usará portas de host aleatórias e as conectará.
OU
com 0.6.5, você poderia usar o recurso LINKs para abrir um novo contêiner que se comunica com o existente, com algumas retransmissões adicionais aos sinalizadores -p desse contêiner? (Ainda não usei LINKs)
OU
com docker 0,11? você pode usar docker run --net host ..
para conectar seu contêiner diretamente às interfaces de rede do host (ou seja, a rede não é espaçada pelo nome) e, portanto, todas as portas que você abre no contêiner são expostas.