Container/Docker

[Docker] Docker Image 개념 및 Dockerfile 작성법

pepe_ 2024. 1. 8. 18:05

1. Dockerfile 개념

1-1. Docker Image란?

  • Docker 플랫폼에서 실행되는 컨테이너의 실행 환경과 애플리케이션을 포함하는 파일 시스템 스냅샷이다.
  • Docker Image는 도커 컨테이너를 실행하는 데 필요한 모든 것을 포함하고 있어, 애플리케이션이 어디에서든 동일한 환경에서 실행될 수 있도록 도와준다.
  • 도커 이미지는 여러 레이어로 구성되어 있다. 각 레이어는 파일 시스템 변경사항이나 패키지 설치 등과 같은 작업을 나타낸다. 이 레이어들은 서로 의존성을 가지며, 기존의 레이어를 수정하지 않고 새로운 레이어를 추가함으로써 이미지를 업데이트할 수 있게 해준다.

1-2. Docker Image 생성 과정

  • Dockerfile 작성 → Docker 클라이언트 → Docker 서버 → Docker 이미지 생성
    • Dockerfile : Docker Image를 만들기 위한 설정 파일이다. 도커 컨테이너의 행동에 대한 설정들을 정의한다.
    • Docker 클라이언트: Dockerfile에 입력된 정보들이 Docker 클라이언트에 전달된다.
    • Docker 서버: Docker 클라이언트에 전달된 작업들이 진행되는 곳이다.

2. Docker Image 생성 및 Azure Container Registry로 Image Push

2-1. Python을 사용하여 Sample Code 작성

1) Ubuntu VM 생성

  • Azure에서 Ubuntu Server 20.04 LTS 이미지로 VM을 생성한다.

2) Python 3용 pip 설치

  • pip: Python 패키지 관리자로, Python 패키지를 설치, 업그레이드, 제거하는 데 사용한다.
sudo apt update
sudo apt install python3-pip
pip3 --version

 

3) Flask 설치

  • Flask: 파이썬 기반 웹 프레임워크 중 하나이다.
pip3 install flask
python3 -m flask --version

 

4) Sample Code 작성

# app.py

from flask import Flask, render_template

app = Flask(__name__)

# 블로그 글 목록
posts = [
    {'title': 'page01', 'content': '안녕하세요!', 'image': 'https://cdn.pixabay.com/photo/2021/10/07/15/12/wine-6688901_1280.jpg'},
    {'title': 'page02', 'content': '반갑습니다.', 'image': 'https://cdn.pixabay.com/photo/2017/01/04/21/00/fireworks-1953253_1280.jpg'}
]

# 블로그 메인 페이지
@app.route('/')
def home():
    return render_template('index.html', posts=posts)

# 글 상세 페이지
@app.route('/post/<int:post_id>')
def post(post_id):
    post = posts[post_id - 1]
    return render_template('post.html', post=post)

# 소개 페이지
# 기본 app.run()의 경우 127.0.0.1로 실행되어 로컬에서의 접속만 가능. 외부 접속 하려면 코드를 app.run(host='0.0.0.0')로 수정 필요
@app.route('/about')
def about():
    return render_template('about.html')

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

 

# templates/index.html

<!-- templates/index.html -->

<!DOCTYPE html>
<html>
<head>
    <title>블로그</title>
    <style>
        /* 이미지와 텍스트를 감싸는 스타일 */
        .post-container {
            display: flex;
            flex-direction: column;
            align-items: center;
            text-align: center;
            margin-bottom: 20px;
        }

        /* 이미지 스타일 */
        .post-image {
            width: 300px; /* 이미지 폭 조절 */
            height: 400px; /* 이미지 높이 조절 */
            object-fit: cover; /* 이미지 비율 유지하면서 채우기 */
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <h1>sample</h1>
    {% for post in posts %}
        <div class="post-container">
            <img class="post-image" src="{{ post['image'] }}" alt="포스트 이미지">
            <p>{{ post['title'] }}</p>
            <a href="{{ url_for('post', post_id=loop.index) }}">Click</a>
        </div>
    {% endfor %}
</body>
</html>

 

# templates/post.html

<!DOCTYPE html>
<html>
<head>
    <title>{{ post['title'] }}</title>
</head>
<body>
    <h1>{{ post['title'] }}</h1>
    <p>{{ post['content'] }}</p>
</body>
</html>

 

5) 코드 실행

python3 app.py


6) 사이트 접속 테스트

<vm public ip>:5000

2-2. Container Image 생성

1) Dockerfile 작성

# Dockerfile

FROM python:3.8-slim

COPY . /app

RUN pip3 install flask 

WORKDIR /app

CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]

 

FROM python:3.8-slim

  • 베이스 이미지 선택
    • Docker 이미지는 기존에 만들어진 다른 이미지를 기반으로 만들어진다.
    • 베이스 이미지는 FROM 명령어를 사용하여 지정된다.

COPY . /app

  • 현재 디렉토리의 파일을 이미지로 복사
    • 필요한 파일을 이미지로 복사한다.
    • COPY 명령어를 사용한다.

RUN pip3 install flask 

  • 의존성 설치
    • 애플리케이션에 필요한 의존성을 설치한다.
    • 언어나 프레임워크에 따라 알맞은 의존성 파일을 설치한다.

WORKDIR /app

  • 작업 디렉토리 설정
    • 작업 디렉토리는 이미지 내에서 작업할 디렉토리를 설정한다.
    • WORKDIR 명령어를 사용한다.

CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]

  • 실행 명령어 정의
    • 컨테이너가 시작될 때 실행되는 명령어를 정의한다.
    • CMD 또는 ENTRYPOINT 명령어를 사용한다.

 

2) Docker Build

# 작성된 Dockerfile로 컨테이너 이미지 생성
docker build -t flask-server:v1 .

# 컨테이너 이미지 조회
docker image ls

# 생성한 컨테이너 이미지 실행 및 테스트
docker run -p 8080:5000/tcp -d flask-server:v1

# 컨테이너 조회
docker ps

# 사이트 접속 후 이미지 상태 확인
http://localhost:8080/

# 컨테이너 중지
docker stop <컨테이너 이름 혹은 아이디>

  • Dockerfile에 정의한 내용 및 순서에 맞춰서 이미지가 빌드된다.

3) Azure Container Registry로 Image Push

  • Docker Hub
    • 일반적으로 도커 이미지는 Docker Hub와 같은 이미지 저장소에 저장되어 공유된다.
    • Docker Hub는 도커 커뮤니티에서 사용되는 공식 이미지 저장소로, 다양한 공개 이미지를 제공하고 개발자들이 자신의 이미지를 업로드하고 공유할 수 있는 플랫폼이다.
  • Azure Container Registry (ACR)
    • Azure에서 제공되는 도커 이미지 저장소이다.
    • ACR은 Azure 클라우드 플랫폼과 긴밀하게 통합되어 있다. 이는 Azure 서비스들과의 시너지를 높이고, Azure 리소스 관리 및 보안 모델을 활용할 수 있도록 한다.
# 기존에 생성한 이미지에 새로운 Tag 달기
# docker tag [기존 이미지 이름] [ACR 이름.azurecr.io/원하는 이미지 이름:버전]
docker tag flask-server:v1 <acr_name>.azurecr.io/<registry_name>:v1

# Azure Container Registry로 Push
docker push <acr_name>.azurecr.io/<registry_name>:v1

 


 

참고

 

빠른 시작 - 포털에서 레지스트리 만들기 - Azure Container Registry

Azure Portal을 사용하여 프라이빗 Azure 컨테이너 레지스트리를 만드는 방법을 빠르게 알아봅니다.

learn.microsoft.com