포트 포워딩(Port Forwarding)과 환경 변수(Environment Variables)

  • 도커 컨테이너는 기본적으로 호스트 OS와 격리된 자체 네트워크와 파일 시스템을 가짐
  • 따라서 외부에서 컨테이너 내부 서비스에 접근하려면 포트 포워딩이라는 문을 열어주어야 함
  • 또한 컨테이너 내부 소스 코드를 수정하지 않고 설정을 바꾸려면 환경 변수를 주입해야 함

1. 포트 포워딩 (-p 옵션)의 동작 원리

  • 도커 컨테이너가 실행되면 🡲 외부와 차단된 자체 사설 IP(예: 172.17.0.2)를 할당받음
  • 외부 사용자나 호스트 PC의 브라우저에서 이 컨테이너 안의 웹 서버에 접속하려면 🡲 호스트의 특정 포트와 컨테이너의 특정 포트의 연결 필요
  • 이 기술을 포트 포워딩(Port Forwarding) 또는 포트 매핑(Port Mapping)이라고 함

  • 명령어 예시

      docker run -d -p 8080:80 --name my-web nginx
    
  • 내부 동작 원리 (호스트 포트 : 컨테이너 포트)

    • 사용자가 호스트 PC의 브라우저에 http://localhost:8080을 입력하면 🡲 시스템 내부에서는..
      1. 호스트 포트(8080) 대기
        • 도커 엔진은 호스트 OS의 8080번 포트를 열고
        • 외부 요청 대기
      2. 트래픽 토스 (포트 포워딩)
        • 8080 포트로 들어온 네트워크 트래픽은
        • 도커의 가상 네트워크 가교(Bridge)를 타고
        • 컨테이너 내부로 전달
      3. 컨테이너 포트(80) 수신
        • 컨테이너 내부에서 실제 구동 중인 Nginx 웹 서버의 80번 포트가 이 트래픽을 수신하여
        • 웹 페이지 응답
  • 실무 팁:
    • 컨테이너 내부 포트(80)는 이미지 생성 시 이미 결정되어 있으므로 바꿀 수 없음
    • 호스트 포트(8080)는 사용자의 PC 환경에 따라 충돌이 나지 않는 임의의 포트(예: 9090:80, 7070:80)로 자유롭게 바꾸어 연결할 수 있음

2. 환경 변수 주입 (-e 옵션)의 동작 원리

  • “개발 환경에서는 데모 DB에 연결하고, 상용 환경에서는 운영 DB에 연결해라.”
    • 소스 코드는 변경하지 않고 실행 환경에 따라 설정값(DB 주소, 비밀번호, API 키 등)만 바꾸어야 할 때 🡲 환경 변수(Environment Variables) 사용
    • 도커는 컨테이너를 생성하는 시점에 호스트 OS에서 컨테이너 내부 커널 공간으로 환경 변수를 강제로 주입하는 -e (Environment) 옵션 제공
  • 명령어 예시

      docker run -d \
      --name app-db \
      -e MYSQL_ROOT_PASSWORD=my-secret-pass \
      -e MYSQL_DATABASE=production_db \
      mysql:8.0
    
  • 내부 동작 원리

    1. 프로세스 환경 테이블 주입
      • 도커 데몬은 컨테이너를 프로세스로 띄우기 직전,
      • 프로세스가 참조하는 메모리 상의 환경 변수 테이블(Environment Table)에
      • -e로 지정한 KEY=VALUE 쌍을 탑재
    2. 애플리케이션 코드의 참조
      • 컨테이너 내부에서 실행된 애플리케이션(위 예시의 경우 MySQL 엔진)은 기동하면서 자신의 언어별 환경 변수 읽기 메서드를 통해 이 값을 가져옴
        • Java: System.getenv("KEY")
        • Python: os.environ.get("KEY")
        • Node.js: process.env.KEY
    3. 동적 설정 적용
      • MySQL 이미지는 내부에 짜인 스크립트에 따라
      • 주입받은 my-secret-pass 값을 루트 비밀번호로 초기화
      • production_db라는 이름의 데이터베이스를 자동으로 생성
  • 보안 및 실무 팁:
    • 비밀번호나 API 토큰 같은 민감한 정보를 Dockerfile 내부에 하드코딩(ENV 명령어 사용)하면 이미지를 내려받는 누구나 보안 정보를 볼 수 있게 되므로 매우 위험함
    • 따라서 이미지는 순수하게 실행 파일만 담아 빌드하고, 비밀번호 같은 민감 정보는 컨테이너를 실행하는 시점에 -e 옵션이나 .env 파일을 통해 주입하는 것이 도커 보안의 대원칙



  • 요약
    • -p (Port): 격리된 컨테이너에 접근할 수 있는 네트워크 통로를 호스트 OS에 뚫어주는 역할
    • -e (Environment): 소스 코드 수정 없이 실행 환경을 제어할 수 있도록 설정값을 프로세스 메모리에 주입하는 역할

© 2020. AiDALab Co. All rights reserved.

Powered by Hydejack v9.2.1