# 5. expose\_vs\_ports

docker-compose.yml 파일의 service 하위의 syntax 로 expose 와 ports 가 있다. 둘다 네트워크 포트 설정과 관련된 명령어인데, 각각의 기능과 차이점을 설명한다.

## expose

* 해당 컨테이너가 사용하는 포트를 문서화
* 동일한 Docker 내부 네트워크 내에서 다른 컨테이너들이 이 포트를 통해 연결할 수 있도록 함
* expose에 정의한 포트는 외부에는 노출되지 않으며, 오직 동일한 네트워크 내의 다른 컨테이너들만 접근

## ports

* 컨테이너의 포트를 호스트의 포트에 바인딩하여 외부 네트워크에서도 접근할 수 있도록 함
* ports를 통해 컨테이너의 포트에 외부에서 직접 접근할 수 있음

### expose 와 ports 의 차이점

expose 는 내부 네트워크에서만 접근 가능하며, ports는 외부 네트워크에서도 접근할 수 있도록 한다. 개발자는 expose를 사용하여 다른 서비스들이 컨테이너와 통신할 수 있음을 명시할 수 있으며, ports는 외부 요청을 컨테이너로 라우팅할 때 사용한다.

다음은 간단한 docker-compose.yml 파일 예제입니다. 여기서는 web 서비스가 5000 포트를 사용하고 이를 외부에 노출시키며, db 서비스는 5432 포트를 사용하지만 내부적으로만 노출합니다.

### 예제

```docker-compose
version: '3.8'

services:
  db:
    container_name: postgres
    image: postgres:14.11-alpine
    restart: always
    ports:
      - '5433:5432'
    volumes:
      - ./docker/db_data:/var/lib/postgresql/data
    networks:
      - nestjs-backend
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=backend
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'postgres']

  app:
    image: node-local:0.1
    container_name: node-local
    build:
      context: .
      dockerfile: ./docker/Dockerfile.local
    ports:
      - '8000:80'
    volumes:
      - ./src:/app/src
    command: >
      sh -c "npm run mig:local:run && npm run start"
    networks:
      - nestjs-backend
    depends_on:
      db:
        condition: service_healthy

networks:
  nestjs-backend:
    driver: bridge
```

서비스 db는 호스트의 5433 포트와 컨테이너의 5432포트를 매핑한다. 따라서, 외부의 5433 포트에서 접근하면, 이 요청은 내부 컨테이너의 포트 5432 포트로 매핑된다. 이 설정으로, 호스트 컴퓨터의 datagrip과 같은 IDE툴에서 컨테이너의 database 에 접근이 가능하다. ports를 삭제하고, expose 5432만 설정한다면, 외부에서 접근이 불가능하고, app 과 같은 서비스에서만 접근 가능하다.

서비스 app은 호스트의 8000 포트와 내부 컨테이너의 80포트를 매핑하여, 외부의 8000 포트에서 들어오는 요청을 내부 컨테이너의 80포트와 연결한다.
