소개
이 튜토리얼에서는 Dockerfile 을 사용하여 사용자 정의 Docker 이미지를 생성하고, Docker 애플리케이션을 배포 및 관리하는 방법을 안내합니다. 사용자 정의 Dockerfile 로부터 Docker 이미지를 빌드하는 명령어를 배우면 컨테이너화 워크플로우를 간소화하고 애플리케이션을 더 효율적으로 배포할 수 있습니다.
Docker 컨테이너 소개
Docker 는 개발자가 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 지원하는 인기 있는 오픈소스 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 코드, 런타임, 시스템 도구 및 라이브러리 등 모든 것을 포함하는 경량의 독립 실행형 실행 가능한 소프트웨어 패키지입니다.
Docker 란 무엇인가요?
Docker 는 컨테이너를 사용하여 애플리케이션을 생성, 배포 및 실행하는 작업을 더욱 쉽게 만드는 도구입니다. 컨테이너를 통해 개발자는 라이브러리 및 기타 종속성과 같은 애플리케이션에 필요한 모든 부분을 패키징하여 하나의 패키지로 배포할 수 있습니다.
Docker 컨테이너의 장점
- 이식성: Docker 컨테이너는 개발자의 로컬 머신에서 프로덕션 서버까지 모든 환경에서 일관되게 실행될 수 있습니다. 이는 기본 인프라에 관계없이 애플리케이션이 동일한 방식으로 동작한다는 것을 보장합니다.
- 확장성: Docker 는 필요에 따라 컨테이너를 추가 또는 제거하여 애플리케이션을 쉽게 확장하거나 축소할 수 있습니다.
- 효율성: Docker 컨테이너는 경량이며 호스트 운영 체제를 공유하기 때문에 기존 가상 머신보다 더 효율적입니다.
- 일관성: Docker 는 개발 환경에서 프로덕션 환경까지 애플리케이션이 동일한 방식으로 실행되도록 보장하여 "내 컴퓨터에서는 작동하는데" 문제를 해결합니다.
Docker 아키텍처
Docker 는 Docker 클라이언트가 Docker 데몬과 통신하는 클라이언트 - 서버 아키텍처를 사용합니다. Docker 데몬은 Docker 컨테이너를 구축, 실행 및 배포하는 역할을 합니다.
graph LD
subgraph Docker Architecture
client[Docker Client]
daemon[Docker Daemon]
client -- API --> daemon
daemon -- Images --> registry[Docker Registry]
end
Docker 컨테이너와 가상 머신
컨테이너와 가상 머신 (VM) 모두 격리된 환경에서 애플리케이션을 실행하는 목적을 가지고 있지만, 몇 가지 중요한 차이점이 있습니다.
| 특징 | Docker 컨테이너 | 가상 머신 |
|---|---|---|
| 격리 | 컨테이너는 호스트 운영 체제 커널을 공유하여 더 경량의 격리를 제공합니다. | VM 은 자체 완전한 운영 체제를 가지고 있어 더 강력한 격리를 제공합니다. |
| 리소스 사용량 | 컨테이너는 호스트의 리소스를 공유하고 전체 운영 체제를 실행할 필요가 없기 때문에 더 효율적입니다. | VM 은 각 VM 이 자체 운영 체제를 가지고 있기 때문에 더 많은 리소스가 필요합니다. |
| 시작 시간 | 컨테이너는 전체 운영 체제를 부팅할 필요가 없기 때문에 몇 초 만에 시작할 수 있습니다. | VM 은 전체 운영 체제를 부팅해야 하기 때문에 몇 분이 걸릴 수 있습니다. |
Docker 시작하기
Docker 를 시작하려면 시스템에 Docker 엔진을 설치해야 합니다. 공식 Docker 웹사이트 (https://www.docker.com/get-started) 에서 Docker 를 다운로드하여 설치할 수 있습니다. 설치 후 Docker 를 사용하여 애플리케이션을 구축, 배포 및 실행할 수 있습니다.
사용자 정의 Docker 이미지 생성
사용자 정의 Docker 이미지 생성은 기존 베이스 이미지를 기반으로 새로운 이미지를 구축하고, 애플리케이션 코드, 종속성 및 구성과 같은 사용자 지정 사항을 추가하는 프로세스입니다.
Dockerfile
Dockerfile 은 Docker 이미지를 구축하는 데 필요한 모든 지침을 포함하는 텍스트 파일입니다. 베이스 이미지, 빌드 프로세스 중 실행될 단계 및 이미지의 최종 구성을 지정합니다.
다음은 Dockerfile 의 예입니다.
## 공식 Ubuntu 22.04 베이스 이미지 사용
FROM ubuntu:22.04
## 패키지 인덱스 업데이트 및 필요한 패키지 설치
RUN apt-get update && apt-get install -y \
git \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
## 작업 디렉토리 설정
WORKDIR /app
## 애플리케이션 코드 복사
COPY . /app
## Python 종속성 설치
RUN pip3 install --no-cache-dir -r requirements.txt
## 애플리케이션이 실행될 포트 노출
EXPOSE 8080
## 애플리케이션 실행 명령 설정
CMD ["python3", "app.py"]
사용자 정의 이미지 구축
Dockerfile 을 사용하여 사용자 정의 Docker 이미지를 구축하려면 다음 단계를 따르세요.
프로젝트 디렉토리에 Dockerfile 을 만듭니다.
터미널을 열고 프로젝트 디렉토리로 이동합니다.
다음 명령을 실행하여 이미지를 구축합니다.
docker build -t my-custom-image .이 명령은 Dockerfile 의 지침을 사용하여 "my-custom-image"라는 이름의 새 Docker 이미지를 구축합니다.
레지스트리에 이미지 푸시
사용자 정의 Docker 이미지를 구축한 후 Docker Hub 또는 개인 레지스트리와 같은 Docker 레지스트리에 푸시하여 다른 시스템에서 공유 및 배포할 수 있습니다.
Docker 레지스트리에 로그인합니다.
docker login레지스트리의 URL 과 사용자 이름으로 이미지를 태그합니다.
docker tag my-custom-image username/my-custom-image:latest레지스트리에 이미지를 푸시합니다.
docker push username/my-custom-image:latest
이제 사용자 정의 Docker 이미지가 레지스트리에 사용 가능하며 다른 개발자 또는 프로덕션 환경에서 풀링 및 사용할 수 있습니다.
Docker 애플리케이션 배포 및 관리
사용자 정의 Docker 이미지를 생성한 후에는 Docker 기반 애플리케이션을 배포 및 관리할 수 있습니다. 이 섹션에서는 Docker 애플리케이션 배포 및 관리에 관련된 주요 개념과 단계를 다룹니다.
Docker 컨테이너 배포
Docker 컨테이너를 배포하려면 docker run 명령어를 사용할 수 있습니다. 이 명령어는 지정된 이미지를 기반으로 새 컨테이너를 시작하고 포트 매핑, 환경 변수 및 볼륨 마운트와 같은 다양한 옵션을 구성할 수 있습니다.
"my-custom-image" 이미지를 기반으로 컨테이너를 실행하는 예는 다음과 같습니다.
docker run -d -p 8080:8080 -e DB_HOST=192.168.1.100 -v /data:/app/data my-custom-image
이 명령은 다음을 수행합니다.
- 컨테이너를 분리 모드 (
-d) 로 실행 - 컨테이너 포트 8080 을 호스트 포트 8080 으로 매핑 (
-p 8080:8080) - 환경 변수
DB_HOST를 값192.168.1.100으로 설정 (-e DB_HOST=192.168.1.100) - 호스트 디렉토리
/data를 컨테이너의/app/data디렉토리로 마운트 (-v /data:/app/data) - "my-custom-image" 이미지를 사용하여 컨테이너를 시작
Docker 컨테이너 관리
Docker 는 실행 중인 컨테이너를 관리하기 위한 여러 명령어를 제공합니다.
docker ps: 모든 실행 중인 컨테이너 목록docker stop <container_id>: 실행 중인 컨테이너 중지docker start <container_id>: 중지된 컨테이너 시작docker logs <container_id>: 컨테이너 로그 보기docker exec -it <container_id> /bin/bash: 실행 중인 컨테이너의 쉘에 접근
Docker Compose
Docker Compose 는 여러 컨테이너 Docker 애플리케이션을 정의하고 관리할 수 있는 도구입니다. 애플리케이션의 서비스, 네트워크 및 볼륨을 구성하기 위해 YAML 파일을 사용합니다.
다음은 docker-compose.yml 파일의 예입니다.
version: "3"
services:
web:
build: .
ports:
- "8080:8080"
environment:
- DB_HOST=database
depends_on:
- database
database:
image: mysql:5.7
environment:
- MYSQL_DATABASE=myapp
- MYSQL_ROOT_PASSWORD=secret
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
이 Compose 파일은 웹 서비스와 데이터베이스 서비스 두 가지 서비스를 정의합니다. 웹 서비스는 현재 디렉토리에서 구축되고, 데이터베이스 서비스는 공식 MySQL 5.7 이미지를 사용합니다. 서비스는 네트워크를 통해 연결되고, 데이터베이스 서비스의 데이터는 지정된 볼륨에 영구적으로 저장됩니다.
이 애플리케이션을 배포하려면 docker-compose.yml 파일과 같은 디렉토리에서 docker-compose up -d를 실행할 수 있습니다.
Docker 애플리케이션 확장
Docker 는 컨테이너를 추가 또는 제거하여 애플리케이션을 쉽게 확장할 수 있도록 지원합니다. Docker Compose 를 사용하여 서비스를 확장할 수 있습니다.
docker-compose up -d --scale web=3
이 명령은 "web" 서비스의 인스턴스를 3 개 시작합니다.
모니터링 및 로깅
Docker 는 컨테이너를 모니터링하고 로깅하기 위한 내장 도구를 제공합니다. 실시간 리소스 사용량을 보려면 docker stats 명령어를 사용하고, 컨테이너의 로그에 접근하려면 docker logs 명령어를 사용할 수 있습니다.
또한 Prometheus, Grafana 및 Elasticsearch 와 같은 외부 모니터링 및 로깅 도구와 Docker 애플리케이션을 통합하여 더욱 고급적인 통찰력과 기능을 얻을 수 있습니다.
요약
이 튜토리얼에서는 Dockerfile 을 사용하여 사용자 정의 Docker 이미지를 생성하고, Docker 애플리케이션을 배포 및 관리하는 방법을 배웠습니다. 이제 사용자 정의 Dockerfile 에서 Docker 이미지를 빌드하는 명령어를 알게 되었으므로, 컨테이너화 프로세스를 간소화하고 애플리케이션을 더 효과적으로 배포할 수 있습니다.



