본문 바로가기
Python/Flask

[Day 11] Docker 설치, 사용자 등록 및 사용법

by 깨준 2024. 7. 27.

0. What is Docker

Docker는 컨테이너 기술을 활용하여 애플리케이션을 격리된 환경에서 실행할 수 있게 해주는 플랫폼입니다. 이 기술은 애플리케이션과 그 종속성을 함께 패키징하여 어디서든 일관되게 실행될 수 있도록 합니다. Docker는 개발자와 운영팀 모두에게 많은 이점을 제공합니다.

 

Docker의 주요 개념과 구성 요소

0.1.1 이미지 (Image)

  • Docker 이미지는 애플리케이션과 그 실행 환경을 포함하는 불변의 파일 시스템 스냅샷입니다.
  • 이미지는 계층화되어 있으며, 각 계층은 파일 시스템 변경사항을 포함합니다.
  • 이미지는 Docker Hub와 같은 레지스트리에서 관리됩니다.

0.1.2 컨테이너 (Container)

  • 컨테이너는 이미지를 기반으로 생성된 실행 가능한 인스턴스입니다.
  • 컨테이너는 격리된 환경에서 실행되며, 애플리케이션을 독립적으로 실행할 수 있습니다.
  • 컨테이너는 빠르게 시작되고 종료될 수 있습니다.

0.1.3 레지스트리 (Registry)

  • 레지스트리는 Docker 이미지를 저장하고 배포하는 서버입니다.
  • Docker Hub는 가장 널리 사용되는 공개 레지스트리입니다.
  • 기업은 자체 프라이빗 레지스트리를 운영할 수도 있습니다.

0.1.4 Docker 엔진 (Docker Engine)

  • Docker 엔진은 Docker 컨테이너를 실행하고 관리하는 기본 소프트웨어입니다.
  • Docker 엔진은 Docker 데몬(Docker daemon)이라고도 불리며, 클라이언트와 상호작용하여 컨테이너를 빌드, 실행, 배포합니다.

Docker의 장점

0.2.1 이식성 (Portability)

  • Docker 이미지를 사용하면 개발 환경과 운영 환경에서 동일한 설정으로 애플리케이션을 실행할 수 있습니다.
  • "한 번 빌드, 어디서든 실행"이 가능해집니다.

0.2.2 효율성 (Efficiency)

  • 컨테이너는 가상 머신보다 가볍고, 리소스를 효율적으로 사용합니다.
  • 컨테이너는 빠르게 시작되고 종료될 수 있습니다.

0.2.3 격리 (Isolation)

  • 각 컨테이너는 독립된 환경에서 실행되므로, 다른 컨테이너와의 충돌을 방지합니다.
  • 애플리케이션의 종속성을 컨테이너 내에 포함시켜 버전 충돌 문제를 해결합니다.

0.2.4 확장성 (Scalability)

  • 컨테이너를 쉽게 스케일 아웃(Scale Out)하여 애플리케이션의 확장성을 보장합니다.
  • 오케스트레이션 도구(예: Kubernetes)와 함께 사용하여 대규모 컨테이너 클러스터를 관리할 수 있습니다.

Docker의 활용 사례

0.3.1 개발 및 테스트 환경 설정

  • 개발자들이 동일한 개발 환경을 구축하고 공유할 수 있습니다.
  • 테스트 환경을 신속하게 구성하고, 다양한 테스트 시나리오를 쉽게 실행할 수 있습니다.

0.3.2 마이크로서비스 아키텍처

  • 각 서비스가 독립적으로 컨테이너화되어, 독립적인 배포와 확장이 가능합니다.
  • 마이크로서비스 간의 의존성을 관리하고, 서비스 간의 충돌을 방지할 수 있습니다.

0.3.3 CI(Continuous Integration)/CD(Continuous Delivery/Deployment) 파이프라인

  • 빌드, 테스트, 배포 과정을 자동화하여 소프트웨어 개발 속도를 향상시킵니다.
  • 컨테이너를 이용해 일관된 빌드 환경을 제공하여, 빌드 실패를 줄입니다.

0.3.4 클라우드 환경에서의 애플리케이션 배포

  • 클라우드 제공업체의 컨테이너 서비스를 이용해 손쉽게 애플리케이션을 배포하고 관리할 수 있습니다.
  • 클라우드 간의 이식성을 보장하여 벤더 종속성을 줄입니다.

1. Docker 설치

1.1 시스템 업데이트

먼저, 패키지 목록을 업데이트합니다.

sudo apt update

 

1.2 필수 패키지 설치

Docker를 설치하기 전에 필요한 패키지를 설치합니다.

sudo apt install apt-transport-https ca-certificates curl software-properties-common

 

1.3 Docker GPG 키 추가

Docker 패키지의 GPG 키를 시스템에 추가합니다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

 

1.4 Docker 저장소 추가

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

 

1.5 패키지 목록 업데이트

sudo apt update

 

1.6 Docker 설치

sudo apt install docker-ce

 

1.7 Docker 서비스 시작 및 확인

Docker 서비스가 정상적으로 실행되고 있는지 확인합니다.

sudo systemctl status docker

 

2. 사용자 등록

2.1 Docker Hub 웹사이트로 이동

웹 브라우저를 열고 Docker Hub(https://hub.docker.com/) 웹사이트로 이동합니다.

 

2.2 계정 생성 우측 상단의 "Sign Up" 버튼을 클릭합니다.

사용자 이름, 이메일 주소, 비밀번호를 입력하고 "Sign Up"을 클릭합니다.

이메일 인증을 완료하면 Docker Hub 계정이 생성됩니다.

 

3. Docker CLI에서 Docker Hub에 로그인

 

3.1 Docker 로그인 명령어 실행

터미널을 열고 다음 명령어를 실행합니다.

docker login

 

3.2 Docker Hub 사용자 이름 입력

프롬프트에 따라 Docker Hub 사용자 이름을 입력합니다.

Username: [your-username]

 

3.3 Docker Hub 비밀번호 입력

프롬프트에 따라 Docker Hub 비밀번호를 입력합니다. 비밀번호는 입력 시 화면에 표시되지 않습니다.

Password:

 

3.4 로그인 확인

로그인에 성공하면 다음과 같은 메시지가 표시됩니다.

Login Succeeded

 

4. Docker 사용

1. 파이썬 애플리케이션 작성 : app.py와 requirements.txt 파일 생성

mkdir my_flask_app
cd my_flask_app

 

1.1. app.py 파일 생성

app.py 파일에 Flask 애플리케이션 코드를 작성합니다.

# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

 

1.2. requirements.txt 파일 생성

Flask를 설치하기 위해 리눅스 콘솔에서 아래와 같이 입력하여 requirements.txt 파일을 생성한다.

echo "flask" > requirements.txt

 

2. Dockerfile 작성

프로젝트 루트 디렉토리에 Dockerfile 을 생성합니다.

# Dockerfile
# 베이스 이미지로 Python 3.8 사용
FROM python:3.8-slim-buster

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

# 종속성 파일을 작업 디렉토리로 복사
COPY requirements.txt requirements.txt

# 종속성 설치
RUN pip install -r requirements.txt

# 애플리케이션 파일을 작업 디렉토리로 복사
COPY app.py app.py

# 애플리케이션 실행
CMD ["python", "app.py"]

 

 

3. Docker 이미지 빌드

Dockerfile이 있는 디렉토리에서 Docker 이미지를 빌드합니다.

sudo docker build -t my_flask_app .

 

 

4.Docker 컨테이너 실행

빌드된 이미지를 사용하여 컨테이너를 실행합니다.

sudo docker run -d -p 5000:5000 my_flask_app
sudo docker run -d -p [호스트포트]:[컨테이너포트] my_flask_app

 

이제 웹 브라우저를 열고 http://yourVM_IP:5000에 접속하면 "Hello, World!" 메시지를 볼 수 있습니다.

 

5.Docker Hub에 이미지 푸시 (선택 사항)

Docker 이미지를 Docker Hub에 푸시하려면 Docker Hub에 로그인하고, 이미지를 태그한 후 푸시합니다.

 

5.1. Docker Hub에 로그인

docker login

 

5.2. 이미지 태그

이미지를 Docker Hub 리포지토리로 태그합니다. 예를 들어, 사용자 이름이 yourusername이고 리포지토리 이름이 my_flask_app이라면:

docker tag my_flask_app yourusername/my_flask_app

 

5.3. 이미지 푸시

이미지를 Docker Hub에 푸시합니다.

docker push yourusername/my_flask_app

 

5.4 도커 허브에 이미지를 푸시하는 이유

 

5.4.1 이유

  • 공유 및 협업: 팀원들과 이미지를 쉽게 공유하여 동일한 개발 및 운영 환경을 유지할 수 있습니다.
  • 배포 자동화: CI/CD 파이프라인에서 이미지를 활용하여 자동화된 배포를 가능하게 합니다.
  • 중앙 저장소 역할: 이미지를 중앙에서 관리하고 저장하여 언제든지 접근 가능하게 합니다.
  • 클라우드 호환성: 다양한 클라우드 플랫폼에서 이미지를 손쉽게 사용할 수 있습니다.

5.4.2 장점

  1. 접근성: 언제 어디서나 이미지를 다운로드할 수 있어 협업이 용이합니다.
  2. 자동화: CI/CD 파이프라인과 연동하여 자동 빌드, 테스트, 배포가 가능합니다.
  3. 확장성: 클라우드 환경에서 쉽게 확장 및 배포할 수 있습니다.
  4. 중앙 관리: 중앙에서 이미지를 관리하고 버전 관리를 통해 안정성을 유지할 수 있습니다.
  5. 백업 및 복구: 이미지를 안전하게 저장하여 손실 시 쉽게 복구할 수 있습니다.

5.4.3 단점

  1. 보안 문제: 이미지를 공개로 설정하면 누구나 접근할 수 있어 보안 이슈가 발생할 수 있습니다. 프라이빗 리포지토리를 사용하면 비용이 발생할 수 있습니다.
  2. 비용: 프라이빗 리포지토리나 대량의 이미지 저장을 위해 추가 비용이 발생할 수 있습니다.
  3. 의존성: Docker Hub 서비스에 의존하게 되어 서비스 장애 시 영향을 받을 수 있습니다.
  4. 속도 제한: 무료 계정의 경우 다운로드 속도나 사용량에 제한이 있을 수 있습니다.

6.Docker 실행 중단

 

6.1 실행중인 Docker 컨테이너 목록 확인

sudo docker ps

 

6.2 특정 컨테이너 중단

sudo docker stop <컨테이너_ID>

 

실습

Docker를 이용하여 아래 디렉토리를 실행 시키기!

 

디렉토리

/var/lab0726/site2
├── app.py
├── Dockerfile
├── requirements.txt
├── templates
│   └── index.html
└── static
    └── images
        └── backgound.jpg

 

위 1~3번까지는 동일

 

1. requirements.txt 파일 생성

echo "flask" > requirements.txt

 

2. Dockerfile 생성 및 작성

touch Dockerfile # Dockerfile 생성
nano Dockerfile # 편집기 사용
# 베이스 이미지로 Python 3.8 사용
FROM python:3.8-slim-buster

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

# 종속성 파일을 작업 디렉토리로 복사
COPY requirements.txt requirements.txt

# 종속성 설치
RUN pip install --no-cache-dir -r requirements.txt

# 애플리케이션 파일과 정적 파일을 작업 디렉토리로 복사
COPY app.py app.py 
COPY templates /app/templates # 추가
COPY static /app/static # 추가

# 애플리케이션 실행
CMD ["python", "app.py"]

 

3. Docker 이미지 빌드

Dockerfile이 있는 디렉토리에서 Docker 이미지를 빌드합니다.

sudo docker build -t app .

 

4. Docker 컨테이너 실행

빌드된 이미지를 사용하여 컨테이너를 실행합니다.

sudo docker run -d -p 5001:5001 app

끝!

 

※ 추가로 필요한 코드 (오류 해결을 위해)

 

● 컨테이너 중지

sudo docker stop <컨테이너_ID> 

sudo docker stop $(sudo docker ps -q) # 모두 중지

 

● 컨테이너 제거

sudo docker rm <컨테이너_ID>

sudo docker rm $(sudo docker ps -a -q) # 모두 제거

 

  컨테이너 상태 확인

sudo docker ps #실행중인 컨테이너 확인
sudo docker ps -a # 모든 컨테이너 확인(중지 포함)

 

  컨테이너 로그 확인

sudo docker logs <컨테이너_ID>

오늘은 Docker에 대해 배웠다. 간단하게 Docker는 실행하기 위한 필요한 라이브러리를 보내주는 역할을 하는것 같다. 처음에는 Docker를 사용하여 코드와 라이브러리를 배포하는 과정을 단순히 따라 해보는 것이 쉬웠다. 하지만, 실제로 VMS을 Docker를 이용해 실행해보니 여러 가지 오류에 직면했다. 이 과정에서 Dockerfile의 역할과 중요성을 이해하게 되었으며, 특히 Dockerfile의 디렉토리 및 파일 복사 방법에 대한 중요성을 깨닫게 되었다. 종속성 파일을 올바르게 설정하는 과정에서도 많은 것을 배웠다. 필요한 모듈을 명확히 명시한 requirements.txt 파일을 작성하고, Dockerfile에서 이를 참조하는 방법을 익힘으로써, 애플리케이션을 컨테이너 환경에서도 원활히 실행할 수 있게 되었다. Docker를 통해 얻은 경험은 배포 자동화와 효율적인 환경 관리를 가능하게 하며, 이로써 더 안정적이고 일관된 개발 및 운영 환경을 구축할 수 있게 되었다.