도커 이미지 만들기: Dockerfile 작성부터 도커 허브 등록까지 완벽 가이드
안녕하세요, 개발자 여러분! 오늘은 도커(Docker)를 활용해 커스텀 이미지를 만드는 방법에 대해 자세히 알아보겠습니다. 도커 이미지를 만들기 위해 필요한 Dockerfile 작성법부터 이미지 빌드, 그리고 도커 허브(Docker Hub)에 등록하는 과정까지 예시와 함께 단계별로 설명드릴게요. 초보자도 쉽게 따라 할 수 있도록 차근차근 진행하겠습니다. 그럼 시작해볼까요? 🚀
1. Dockerfile 작성하는 방법 (+ Dockerfile 문법)
Dockerfile이란?
Dockerfile은 도커 이미지를 생성하기 위한 설계도입니다. 이 파일에는 도커 이미지를 구성하는 명령어들이 포함되어 있으며, 이를 기반으로 도커가 이미지를 빌드합니다. Dockerfile은 보통 프로젝트 루트 디렉토리에 위치하며, 파일 이름은 반드시 Dockerfile로 지정해야 합니다.
Dockerfile 기본 문법
Dockerfile은 몇 가지 주요 명령어를 사용해 작성됩니다. 각 명령어는 도커 이미지의 레이어(Layer)를 생성하며, 아래는 자주 사용되는 명령어들입니다:
- FROM: 베이스 이미지를 지정합니다. 모든 Dockerfile은 FROM으로 시작해야 합니다.
위 예시는 Ubuntu 20.04 이미지를 베이스로 사용하겠다는 의미입니다.
- RUN: 이미지 빌드 중 실행할 명령어를 지정합니다.
RUN apt-get update && apt-get install -y python3
위 명령어는 Ubuntu에서 패키지 리스트를 업데이트하고 Python3를 설치합니다.
- COPY: 로컬 파일을 도커 이미지 내부로 복사합니다.
로컬 ./app 디렉토리를 이미지 내부 /app 경로로 복사합니다.
- WORKDIR: 작업 디렉토리를 설정합니다. 이후 명령어는 해당 디렉토리에서 실행됩니다.
- CMD: 컨테이너가 시작될 때 실행할 기본 명령어를 지정합니다. 리스트 형태로 작성하는 것이 일반적입니다.
CMD ["python3", "app.py"]
- EXPOSE: 컨테이너가 외부로 노출할 포트를 지정합니다. (참고용으로 사용됨)
예시: 간단한 Python Flask 애플리케이션 Dockerfile 작성
간단한 Flask 애플리케이션을 위한 Dockerfile을 작성해보겠습니다. 먼저 프로젝트 구조는 다음과 같다고 가정합니다:
my-flask-app/
├── app.py
└── requirements.txt
app.py는 다음과 같은 간단한 Flask 앱입니다:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, Docker!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
requirements.txt는 필요한 패키지를 정의합니다:
이제 Dockerfile을 작성해보겠습니다:
# 베이스 이미지로 Python 3.9 슬림 버전 사용
FROM python:3.9-slim
# 작업 디렉토리 설정
WORKDIR /app
# 현재 디렉토리의 requirements.txt를 이미지 내부로 복사
COPY requirements.txt .
# 필요한 패키지 설치
RUN pip install --no-cache-dir -r requirements.txt
# 현재 디렉토리의 모든 파일을 이미지 내부로 복사
COPY . .
# 컨테이너가 시작될 때 실행할 명령어
CMD ["python", "app.py"]
# 외부로 노출할 포트 지정
EXPOSE 8080
위 Dockerfile은 Python 이미지를 기반으로, Flask 애플리케이션을 실행할 환경을 설정합니다. 각 명령어가 어떤 역할을 하는지 이해하셨나요?
2. Dockerfile로 이미지 만드는 방법
Dockerfile을 작성했다면, 이제 이를 기반으로 도커 이미지를 빌드(Build)할 차례입니다. 도커 이미지를 빌드하는 과정은 매우 간단합니다.
도커 이미지 빌드 명령어
도커 이미지를 빌드하려면 아래 명령어를 사용합니다:
docker build -t 이미지이름:태그 .
- -t: 이미지 이름과 태그를 지정합니다. 예: my-flask-app:1.0
- .: Dockerfile이 위치한 디렉토리를 지정합니다. 현재 디렉토리라면 .로 설정하면 됩니다.
예시: Flask 앱 이미지 빌드
위에서 작성한 Dockerfile을 사용해 이미지를 빌드해봅시다. 프로젝트 디렉토리에서 아래 명령어를 실행합니다:
docker build -t my-flask-app:1.0 .
명령어를 실행하면 도커가 Dockerfile을 읽고 각 명령어를 실행하며 이미지를 빌드합니다. 빌드 과정에서 각 단계가 콘솔에 출력되며, 완료되면 지정한 이름과 태그로 이미지가 생성됩니다.
빌드된 이미지 확인
빌드가 완료되면 아래 명령어로 생성된 이미지를 확인할 수 있습니다:
docker images
출력 예시:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-flask-app 1.0 7b9a1f2c3d4e 2 minutes ago 123MB
컨테이너 실행 테스트
빌드한 이미지를 실행해 제대로 동작하는지 확인해봅시다:
docker run -p 8080:8080 my-flask-app:1.0
- -p: 호스트와 컨테이너의 포트를 매핑합니다. 8080:8080은 호스트의 8080 포트를 컨테이너의 8080 포트에 연결합니다.
브라우저에서 http://localhost:8080에 접속하면 "Hello, Docker!" 메시지가 표시됩니다. 성공적으로 동작하는군요! 🎉
3. 이미지 도커 허브에 등록하는 방법
이제 만든 도커 이미지를 도커 허브(Docker Hub)에 업로드해 다른 사람과 공유하거나 다른 환경에서 사용할 수 있도록 해보겠습니다.
도커 허브란?
도커 허브는 도커 이미지를 저장하고 공유할 수 있는 클라우드 기반 레지스트리입니다. GitHub처럼 공개/비공개 리포지토리를 만들 수 있으며, 무료 계정으로도 충분히 활용 가능합니다.
도커 허브 계정 생성
먼저 도커 허브 계정이 필요합니다. 도커 허브 웹사이트에 접속해 계정을 생성하세요.
도커 CLI에서 로그인
터미널에서 도커 허브에 로그인합니다:
docker login
명령어를 실행하면 사용자 이름과 비밀번호를 입력하라는 메시지가 나타납니다. 도커 허브 계정 정보를 입력하면 로그인이 완료됩니다.
이미지 태그 변경
도커 허브에 업로드하려면 이미지 태그를 사용자이름/이미지이름:태그 형식으로 변경해야 합니다. 예를 들어, 제 도커 허브 사용자 이름이 johndoe라면 아래 명령어로 태그를 변경합니다:
docker tag my-flask-app:1.0 johndoe/my-flask-app:1.0
태그 변경 후 docker images 명령어로 확인해보면 새로운 태그가 추가된 것을 볼 수 있습니다.
도커 허브에 이미지 푸시
이제 이미지를 도커 허브로 업로드합니다:
docker push johndoe/my-flask-app:1.0
업로드가 완료되면 도커 허브 웹사이트에서 리포지토리가 생성되고 이미지를 확인할 수 있습니다.
다른 환경에서 이미지 사용
도커 허브에 업로드된 이미지는 다른 환경에서 쉽게 다운로드해 사용할 수 있습니다:
docker pull johndoe/my-flask-app:1.0
docker run -p 8080:8080 johndoe/my-flask-app:1.0
마무리
이제 여러분은 Dockerfile 작성부터 도커 이미지 빌드, 그리고 도커 허브에 등록하는 전 과정을 익혔습니다! 도커를 활용하면 애플리케이션 배포와 환경 설정이 훨씬 간편해지죠. 이번 예제는 간단한 Flask 앱을 기반으로 진행했지만, 여러분의 프로젝트에 맞게 Dockerfile을 커스터마이징해 다양한 이미지를 만들어보세요.