포트 포워딩(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을 입력하면 🡲 시스템 내부에서는..- 호스트 포트(8080) 대기
- 도커 엔진은 호스트 OS의
8080번 포트를 열고 - 외부 요청 대기
- 도커 엔진은 호스트 OS의
- 트래픽 토스 (포트 포워딩)
8080포트로 들어온 네트워크 트래픽은- 도커의 가상 네트워크 가교(Bridge)를 타고
- 컨테이너 내부로 전달
- 컨테이너 포트(80) 수신
- 컨테이너 내부에서 실제 구동 중인 Nginx 웹 서버의
80번 포트가 이 트래픽을 수신하여 - 웹 페이지 응답
- 컨테이너 내부에서 실제 구동 중인 Nginx 웹 서버의
- 호스트 포트(8080) 대기
- 사용자가 호스트 PC의 브라우저에
- 실무 팁:
- 컨테이너 내부 포트(
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내부 동작 원리
- 프로세스 환경 테이블 주입
- 도커 데몬은 컨테이너를 프로세스로 띄우기 직전,
- 프로세스가 참조하는 메모리 상의 환경 변수 테이블(Environment Table)에
-e로 지정한KEY=VALUE쌍을 탑재
- 애플리케이션 코드의 참조
- 컨테이너 내부에서 실행된 애플리케이션(위 예시의 경우 MySQL 엔진)은 기동하면서 자신의 언어별 환경 변수 읽기 메서드를 통해 이 값을 가져옴
- Java:
System.getenv("KEY") - Python:
os.environ.get("KEY") - Node.js:
process.env.KEY
- Java:
- 컨테이너 내부에서 실행된 애플리케이션(위 예시의 경우 MySQL 엔진)은 기동하면서 자신의 언어별 환경 변수 읽기 메서드를 통해 이 값을 가져옴
- 동적 설정 적용
- MySQL 이미지는 내부에 짜인 스크립트에 따라
- 주입받은
my-secret-pass값을 루트 비밀번호로 초기화 production_db라는 이름의 데이터베이스를 자동으로 생성
- 프로세스 환경 테이블 주입
- 보안 및 실무 팁:
- 비밀번호나 API 토큰 같은 민감한 정보를
Dockerfile내부에 하드코딩(ENV명령어 사용)하면 이미지를 내려받는 누구나 보안 정보를 볼 수 있게 되므로 매우 위험함- 따라서 이미지는 순수하게 실행 파일만 담아 빌드하고, 비밀번호 같은 민감 정보는 컨테이너를 실행하는 시점에
-e옵션이나.env파일을 통해 주입하는 것이 도커 보안의 대원칙
- 요약
-p(Port): 격리된 컨테이너에 접근할 수 있는 네트워크 통로를 호스트 OS에 뚫어주는 역할-e(Environment): 소스 코드 수정 없이 실행 환경을 제어할 수 있도록 설정값을 프로세스 메모리에 주입하는 역할