이번에 GPU 서버에 모델을 올렸다 내렸다 하면서 claude 없었으면 뒤질뻔한 날들의 연속이었던 것. 인프라 쪽은 정말 하면서 부딪히는거라지만 너무 이해가 안가는 것 투성이라서 정리하기
예를 들어
-> IP는 컴퓨터를 특정할 뿐이고 컴퓨터 안에서 '어느 서비스한테 이 요청을 넘길지'는 Port 번호로 결정
| Port | 용도 |
|---|---|
| 22 | SSH |
| 80 | HTTP |
| 443 | HTTPS |
| 5432 | PostgreSQL |
| 6379 | Redis |
| 8000,8080 | 개발용 웹 서버 |
sudo netstat -tlnp또는 ss -tlnp 로 확인Docker 컨테이너는 자기만의 네트워크 공간을 가짐
즉,
Host
IP : 192.168.0.10
Container A
IP : 172.17.0.2
Container B
IP : 172.17.0.3
처럼 컨테니어마다 별도의 IP가 존재함
따라서 Container A 안에서
nginx
Port 80 Listening
이어도 Host에서는
192.168.0.10:80
으로 접근되지 않는다.
Host와 Container는 서로 다른 네트워크이기 때문이다.
그래서 호스트 port <-> 컨테이너 port를 매핑해야 밖에서 접근이 가능함.
예를 들어 내가 작업했던 nginx에서
nginx:
image nginx
ports:
- "10022:80"
이런것 처럼 호스트 10022를 컨테이너 내부 80으로 연결하는 것.
curl http://서버IP:10022을 Host가 받고 Docker가 10022 -> Container 80으로 전달하면, Container 내부 nginx가 응답하는 식으로 동작함.
컨테이너는 독립된 리눅스 커널을 갖는 것이 아니라, Host의 리눅스 커널을 공유하면서 프로세스와 네트워크를 격리한 실행 환이다.
Docker는 컨테이너를 만들 때 Linux의 여러 기능을 활용함
그래서 컨테이너 안에서는
127.0.0.1
eth0
IP 주소
Listening Port
등이 모두 독립적으로 존재하는 것처럼 보인다.
예를 들어
Container A
Port 8000
Container B
Port 8000
둘 다 동시에 사용할 수 있다.
왜냐하면 172.17.0.2:8000, 172.17.0.3:8000 처럼 IP가 서로 다르기 때문이다.
SERVICES:
NGINX:
VLLM:이라면, nginx 컨테이너에서는 http://vllm:8000으로 바로 접근할 수 있다. Docker가 내부적으로 vllm -> 172.18.0.5 처럼 이름을 IP로 변환(DNS)해주기 때문이다.브라우저 / curl
│
▼
http://203.0.113.10:10022
│
▼
Host(IP)
│
▼
Docker Port Mapping
10022 -> 80
│
▼
Container (nginx)
│
▼
nginx Reverse Proxy
│
▼
http://vllm:8000
│
▼
vLLM Container
│
▼
LLM 추론
│
▼
응답