[Docker] 기본 첫걸음

심주흔·2025년 4월 19일

Kubernetes

목록 보기
3/3
post-thumbnail

이론은 배웠다. 간단한 Python 예제를 만들고 실습을 해보자

Python Project 생성

로컬 개발 환경에서 테스트 가능한 단순한 Flask 앱 구성
Flask 설치 후 app.py 에서 "Hello World" 출력 간단 구현

requirements.txt 작성

Dockerfile 작성

이미지 최소화 (slim 기반)
실행 전 의존성 설치
CMD 로 앱 실행

중간점검

이미지 빌드

docker build -t my-flask-app .

: 현재 디렉토리에 있는 Dockerfile 을 기반으로 my-flask-app 이라는 이름으로 Docker 이미지가 생성 됨

컨테이너 실행 (5030 포토 바인딩)

docker run -d -p 5030:5000 my-flask-app

  • 이미 5000 포트는 다른 프로젝트에 연결되어 있어서 임의로 5030 포트로 연결함.
    5030 -> 호스트 PC 외부포결
    5000 -> 컨테이너 내부 포트

오류
Bind for 0.0.0.0:5000 failed: port is already allocated.
“5030 포트는 이미 누군가가 쓰고 있어서, 내가 거기에 컨테이너 포트를 연결할 수 없어!”

localhost:5030 에 연결

수동으로 Docker 이미지 빌드 및 DockerHub 업로드

Docker 이미지 빌드

docker build -t my-flask-app ./python/docker-python-app
  • -t my-flask-app : 태그 이름 지정 (image 이름)
  • ./python/docker-python-app : Dockerfile 이 있는 디렉토리 지정

python/docker-python-app/Dockerfile 을 읽어서 Flask 프로젝트 전체를 이미지로 빌드
로컬에만 존재하는 my-flask-app 이미지가 생성됨

Docker 이미지 태깅 (DockerHub 용)

docker tag my-flask-app juheunshim/my-flask-app:latest
  • my-flask-app : 로컬에서 만든 이미지 이름
  • juheunshim/my-flask-app : DockerHub 사용자명 + 저장소명
  • latest : 태그(버전) - 생략 가능하지만 명시가 일반적

DockerHub 로그인

docker login -u "DockerID" (패스워드를 CL에 입력해야함) / docker login (토큰을 사용해서 로그인)

Docker 이미지 푸시 후 결과 확인

docker push juheunshim/my-flask-app:latest

https://hub.docker.com/repositories 에서 보이면 성공

현재 이미지 목록 보기

docker images

현재 컨테이너 목록 보기

docker ps -a

Github 코드 업로드

깃허브에 Repository 를 생성하고 프로젝트 디렉토리를 다음과 같이 맞게 설정(기능별로 폴더 분리)

.github / workflows / ci.yml 작성

name: Docker CI/CD - Build & Push

on:
  push:
    branches:
      - main

jobs:
  build-and-push:
    runs-on: ubuntu-latest

    steps:
      - name: 📥 코드 체크아웃
        uses: actions/checkout@v3

      - name: 🐍 Python 3.11 설정
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: 📦 의존성 설치
        run: |
          pip install -r python/docker-python-app/requirements.txt

      - name: 🔐 DockerHub 로그인
        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
       # run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" -p ${{ secrets.DOCKER_PASSWORD }}


      - name: 🐳 Docker 이미지 빌드
        run: docker build -t ${{ secrets.DOCKER_USERNAME }}/my-flask-app:latest ./python/docker-python-app

      - name: 🚀 DockerHub 푸시
        run: docker push ${{ secrets.DOCKER_USERNAME }}/my-flask-app:latest

코드차이

run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

✔️
• 비밀번호를 표준 입력(stdin) 으로 넘기기 때문에
쉘 히스토리, 로그 등에 노출될 가능성이 낮음
• Docker 공식 문서에서 보안상 권장하는 방식

run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" -p ${{ secrets.DOCKER_PASSWORD }}

• -p 인자는 쉘 환경에서 명령어 히스토리에 남을 수 있음
• GitHub Actions에서는 비밀번호가 로그에 잠깐 노출될 수 있음 (보안상 매우 위험)

자동 Build & Push

코드를 수정하고 이미지를 생성할 때마다 자동으로 DockerHub 에 Push 하도록 설정

Docker accountcenter - Personal access tokens - Generate new token

이름 설정 - Optional (Read , Write , Delete)
새로고침이나 창을 나가면 사라지니 주의

해당 레파지토리 - Setting - Secrests and variables - Actions - New repository secret

ci.yml 에 정리된 환경변수를 Name에 작성
Secret 은 Docker 페이지에서 복사

Github Action 에서 확인

profile
이봐... 해보기는 했어?

0개의 댓글