
저는 많은 서비스를 실행하고 있습니다(대부분은 Docker로 관리됩니다). 모든 포트 번호를 관리하는 데 어려움을 겪고 있습니다. 문제는 HTTP 서버와 같은 새로운 것을 돌리고 싶을 때 발생합니다. 다른 서비스에서 아직 사용하지 않은 포트 번호를 찾아야 합니다. 현재 새 서버를 돌리고 싶을 때, docker ps
예를 들어 가져온 포트가 8001, 8002, 8003,...8051인 경우 가져온 모든 포트를 찾은 다음 포트 8052를 할당합니다. 일부 서비스가 일시적으로 중단될 때까지는 정상적으로 작동합니다. , 따라서 에 표시되지 않으므로 docker ps
해당 포트를 새 서비스에 할당하고 이전 서비스가 복원되면 포트 충돌이 발생합니다.
저는 이미 역방향 프록시용 Nginx를 사용하여 내 서버를 공용 네트워크에 노출하고 있습니다. 그러나 이것은 내 문제를 해결하지 못합니다. 어떻게든 사용되지 않은 최신 포트 번호를 찾아야 하며, 이 상황에서는 단일 진실 소스도 마찬가지입니다 nginx.conf
.docker ps
포트 관리 솔루션이 있나요? 일부 레지스트리?
답변1
컨테이너를 생성할 때 Docker가 무료 포트를 찾도록 하세요.
에서문서:
기본 임시 포트 범위와 다른 컨테이너 포트를 바인딩하기 위해 호스트 포트 범위를 지정할 수 있습니다.
$ docker run -d -p 8000-9000:5000 training/webapp python app.py
이렇게 하면 컨테이너의 포트 5000을 호스트의 8000~9000 사이에서 임의로 사용 가능한 포트에 바인딩합니다.
docker inspect
예를 들어 다음과 같이 나중에 를 사용하여 노출된 포트를 얻을 수 있습니다 .
docker inspect --format '{{ range .HostConfig.PortBindings }}{{ range . }}{{ . }}{{ end }}{{ end }}' container
{127.0.0.1 8095}
내 테스트 컨테이너 구성:
"PortBindings": {
"8080/tcp": [
{
"HostIp": "127.0.0.1",
"HostPort": "8095"
}
]
}
답변2
http 기반 서비스를 사용하면 역방향 프록시를 사용하여 이 작업을 더 쉽게 수행할 수 있습니다. 포트 80/443에서 수신 대기하는 하나의 서비스가 있고 와일드카드 DNS를 사용하여 모든 호스트 이름을 Docker 호스트에 매핑하면 고유한 호스트 이름으로 각 서비스에 액세스할 수 있습니다. 경로 기반 라우팅을 사용할 수도 있지만 배포된 앱이 상대 경로로 작성되지 않으면 더욱 어려워집니다.
역방향 프록시의 예로는 nginx, haproxy 및 traefik이 있습니다. 내가 선호하는 것은 실행 중인 컨테이너를 기반으로 자동으로 재구성되도록 설계되었기 때문에 traefik입니다. 이러한 프록시는 docker에서 실행되고 공유 docker 네트워크를 사용하며 프록시에만 게시된 포트가 있고 나머지 서비스는 프록시를 통해 docker 네트워크를 통해 액세스됩니다.
이 프록시는 Docker 외부에서 실행할 수 있는 프록시와 별개입니다. 네트워크의 다른 서버로 이동하는 다른 외부 요청이 있는 경우 둘 다 공존할 수 있습니다. Docker 호스트의 컨테이너에 대한 모든 요청에 대해 외부 프록시는 Docker 기반 프록시에 요청을 보냅니다.