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