🛠️ Docker 심화: 데이터 관리와 나만의 이미지 만들기

어제 Docker의 문을 열었다면, 오늘은 그 집을 내 취향대로 꾸미는 방법을 배웠다. 컨테이너의 데이터를 안전하게 보관하는 마운트(Mount) 기술과, Dockerfile로 나만의 맞춤형 이미지를 제작하는 방법을 익혔다. 이제 정말 ‘내 환경’을 코드로 찍어낼 수 있게 되었다

:guard: “데이터는 컨테이너 밖에, 안전하게”

컨테이너는 쓰고 버리는 일회용품과 같다. 하지만 그 안에서 만든 소중한 데이터까지 함께 버릴 순 없다. 마운트는 컨테이너 속 세상을 현실 세계(호스트)와 연결해, 데이터가 영원히 살아남게 하는 마법이다. 이제 컨테이너를 지웠다 다시 만들어도 데이터는 그대로다.


📂 데이터, 어떻게 주고받을까? cp vs. mount

컨테이너와 바깥세상(호스트)이 소통하는 두 가지 방법이다.

구분 파일 복사 (docker cp) 바인드 마운트 (-v 또는 --mount)
개념 일회성 택배 📦 실시간 거울 🪞
특징 - 간단하고 빠르다
- 원본과 사본이 따로 논다
- 호스트에서 바꾸면 컨테이너도 바로 바뀐다
- 컨테이너가 사라져도 데이터는 남는다
용도 설정 파일 주입, 로그 백업 등 소스 코드 개발, DB 저장소 등

🔗 실습: 바인드 마운트로 실시간 개발 환경 만들기

호스트의 폴더를 nginx 컨테이너에 실시간으로 연결해봤다.

# 1. 호스트에 작업 폴더와 index.html 만들기
mkdir bindstorage && cd bindstorage
echo '<h1>Real-time Sync!</h1>' > index.html

# 2. 바인드 마운트 옵션으로 컨테이너 실행!
# 현재 폴더($(pwd))를 컨테이너의 웹 루트와 연결
docker run --name nginx-mount-test -d -p 8082:80 -v $(pwd):/usr/share/nginx/html nginx

이제 호스트에서 index.html을 수정하고 브라우저를 새로고침하면? 성공! 🎉 컨테이너 재시작 없이 바로 반영된다. 개발 효율이 엄청나게 올라가는 순간이다.


📜 Dockerfile: 나만의 이미지 레시피

드디어 Docker의 꽃, Dockerfile을 직접 써봤다. 이미지 제작 과정을 코드로 남겨, 누가 만들어도 똑같은 결과물이 나오게 하는 것이다.

Dockerfile 핵심 명령어

명령어 설명
FROM 베이스캠프 ⛺: 어떤 이미지에서 시작할지 지정
WORKDIR 작업실 🏠: 컨테이너 안에서 명령을 실행할 기본 폴더
COPY 짐 옮기기 🚚: 내 컴퓨터의 파일을 이미지로 복사
RUN 인테리어 🔨: 이미지에 필요한 프로그램을 설치 (pip install 등)
EXPOSE 창문 내기 🪟: 외부와 통신할 포트를 지정
CMD 메인 스위치 💡: 컨테이너가 시작될 때 실행할 명령어

Streamlit 앱 이미지 빌드하기

예전에 만든 Streamlit 앱을 Docker 이미지로 만드는 Dockerfile이다.

# 1. 베이스 이미지: Python 3.12 환경
FROM python:3.12

# 2. 작업 디렉토리 설정
WORKDIR /app

# 3. 의존성 설치 (캐시 활용을 위해 소스코드보다 먼저!)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 4. 소스코드 복사
COPY . .

# 5. 포트 노출
EXPOSE 8501

# 6. 앱 실행!
CMD ["streamlit", "run", "app.py"]

Dockerfile을 만들고 docker build -t my-streamlit-app . 명령을 실행하면, 내 앱이 담긴 이미지가 뚝딱 만들어진다. 이제 이 이미지 하나만 있으면, 어디서든 내 앱을 똑같이 실행할 수 있다!


✨ 오늘의 회고

Dockerfile을 직접 작성해보니, 왜 DevOps에서 Docker가 필수인지 알 것 같았다. 단순히 서버를 띄우는 걸 넘어, 개발 환경 자체를 코드처럼 관리한다는 개념이 정말 강력하게 다가왔다.
다음에는 이렇게 만든 이미지를 전 세계 개발자들과 공유하는 Docker Hub에 올리고, 여러 컨테이너를 지휘하는 Docker Compose를 알아볼 것이다. 점점 더 재밌어진다! 😄