Perdoe o título vago da pergunta, sou um iniciante e não tenho a terminologia para fazer minha pergunta mais especificamente.
Estou desenvolvendo uma aplicação simples que consiste em um servidor de jogo (usando socket.io, portanto WebSockets) e um cliente de jogo, que é apenas um servidor HTTP. Terminei o desenvolvimento local e agora gostaria de hospedá-lo nos servidores da minha organização estudantil; visto que aquela máquina já tem o Docker instalado, imaginei que seria a solução mais fácil.
Concretamente, no desenvolvimento local, configurei o servidor WebSockets para usar a porta 3141 e o servidor HTTP para usar a porta 5173. Tentei usar docker compose
e descobri a seguinte configuração:
services:
server:
build: .
ports:
- 3141
frontend:
build: ./kwispel-client
ports:
- 5173
Usando docker inspect kwispel-server-server-1
, posso descobrir manualmente o endereço IP do servidor HTTP e conectar-me a ele. No entanto, a resolução de nomenclatura de contêineres não funciona; Eu preciso disso para
- informar ao lado do cliente do socket.io onde se conectar e passar http://server:3141 não funciona;
- informar ao lado do servidor do socket.io quais cabeçalhos CORS permitir e passar http://frontend:5173 não funciona. Localmente, o projeto funciona bem usando localhost em vez de servidor ou frontend.
Se eu tentar definir uma rede compartilhada, assim:
services:
server:
build: .
ports:
- 3141
networks:
kwispel-server_gedeeldNetwerk:
ipv4_address: 172.16.238.10
frontend:
build: ./kwispel-client
ports:
- 5173
networks:
kwispel-server_gedeeldNetwerk:
ipv4_address: 172.16.238.20
networks:
kwispel-server_gedeeldNetwerk:
driver: bridge
ipam:
config:
- subnet: "172.16.238.0/24"
para poder ter endereços IP fixos, não consigo nem me conectar ao servidor HTTP nesse endereço.
Estou perdendo algo óbvio? Preciso passar um sinalizador extra para docker-compose up para expor as portas que preciso? Estou completamente perdido. Quaisquer indicações na direção certa são muito apreciadas.
Os endereços IP internos do Docker são basicamente inúteis. Em particular, no seu cenário, eles nunca poderão ser acessados de outra máquina. Não há razão para procurá-los ou especificá-los diretamente.
No seu Compose,
ports:
você especificou apenas um único número de porta. Isso torna a porta do contêiner acessível do sistema host e de outros lugares, mas o Docker escolhe o número da porta. Você pode descobrir o número da porta que o Docker escolheu usandodocker-compose port
Esse número de porta também poderá ser usado em um sistema remoto, se você estiver usando diretamente o mecanismo Docker em um host Linux nativo.
É comum especificar dois números de porta em arquivos
ports:
. Dessa forma você escolhe a porta do host.As advertências são que o primeiro número da porta deve ser diferente de qualquer outro contêiner ou porta publicada do processo host; o segundo número da porta deve corresponder à porta em que o processo dentro do contêiner está sendo executado; e que o processo também deve estar escutando o endereço especial 0.0.0.0 "todas as interfaces".
É comum, mas definitivamente não obrigatório, que os dois números de porta correspondam.