소개
이 튜토리얼에서는 Dockerfile 을 사용하여 Docker 이미지를 구축하는 과정을 안내합니다. Docker 이미지의 기본 사항, Docker 이미지를 생성하고 관리하는 단계, 그리고 효과적으로 배포하는 방법을 다룰 것입니다. Docker 에 처음 접하든 컨테이너화 워크플로우를 개선하고자 하든, 이 문서는 Docker 이미지를 구축하고 작업하는 데 필요한 지식과 기술을 제공할 것입니다.
Docker 이미지 이해
Docker 이미지란 무엇인가요?
Docker 이미지는 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 경량의 독립 실행형 실행 패키지입니다. 코드, 런타임, 시스템 도구, 라이브러리 및 설정이 포함됩니다. 이미지는 Docker 의 빌드 구성 요소이며, Docker 컨테이너를 생성하는 데 사용됩니다.
Docker 이미지 계층
Docker 이미지는 일련의 계층으로 구성됩니다. 각 계층은 이미지의 Dockerfile 의 명령을 나타냅니다. 이러한 계층은 최종 이미지를 형성하도록 서로 위에 쌓입니다. 이미지가 업데이트되면 변경된 계층만 다시 빌드되므로 프로세스가 더 효율적입니다.
graph TD
A[베이스 이미지] --> B[계층 1]
B --> C[계층 2]
C --> D[계층 3]
D --> E[최종 이미지]
Docker 이미지 접근
Docker 이미지는 다양한 소스에서 접근할 수 있습니다.
- Docker Hub: 사용자와 파트너가 컨테이너화된 애플리케이션을 구축하고 공유할 수 있는 공식적인 공용 레지스트리입니다.
- 프라이빗 레지스트리: 조직은 자체 프라이빗 Docker 레지스트리를 설정하여 자체 사용자 정의 이미지를 저장하고 관리할 수 있습니다.
- Dockerfile 에서 빌드: 사용자는 Dockerfile 을 작성하고
docker build명령을 사용하여 자체 Docker 이미지를 만들 수 있습니다.
Docker 이미지의 장점
- 일관성: Docker 이미지는 환경에 관계없이 애플리케이션이 동일한 방식으로 실행되도록 보장합니다.
- 확장성: Docker 이미지는 요구 사항의 변화에 따라 쉽게 확장하거나 축소할 수 있습니다.
- 효율성: Docker 이미지는 경량이며 빠르게 배포할 수 있으므로 애플리케이션의 전반적인 효율성을 향상시킵니다.
- 이식성: Docker 이미지는 모든 Docker 지원 플랫폼에서 쉽게 공유 및 배포할 수 있으므로 이식성이 높습니다.
Dockerfile 을 사용한 Docker 이미지 구축
Dockerfile 이란 무엇인가요?
Dockerfile 은 사용자가 Docker 이미지를 조립하기 위해 명령줄에서 호출할 수 있는 모든 명령을 포함하는 텍스트 문서입니다. Dockerfile 은 Docker 이미지를 생성하는 데 필요한 단계를 정의하기 위해 특정 구문을 사용합니다.
Dockerfile 구문
Dockerfile 은 일반적으로 다음과 같은 명령을 포함합니다.
FROM: 빌드에 사용할 기본 이미지를 지정합니다.COPY: 호스트에서 컨테이너 파일 시스템으로 파일 또는 디렉터리를 복사합니다.RUN: 컨테이너에서 명령을 실행합니다.CMD: 컨테이너가 시작될 때 실행할 기본 명령을 지정합니다.EXPOSE: 컨테이너가 런타임에 지정된 네트워크 포트에서 수신을 시작한다는 것을 Docker 에 알립니다.ENV: 환경 변수를 설정합니다.
다음은 예시 Dockerfile 입니다.
FROM ubuntu:22.04
COPY . /app
WORKDIR /app
RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip3 install -r requirements.txt
EXPOSE 8080
CMD ["python3", "app.py"]
Docker 이미지 구축
Dockerfile 에서 Docker 이미지를 구축하려면 docker build 명령을 사용할 수 있습니다.
docker build -t my-app .
이 명령은 현재 디렉터리의 Dockerfile 을 사용하여 태그 my-app이 있는 Docker 이미지를 구축합니다.
Dockerfile 최적화
Dockerfile 을 최적화하려면 다음을 수행할 수 있습니다.
- 여러 명령을 하나의
RUN명령으로 결합하여 계층 수를 최소화합니다. - 더 작은 기본 이미지를 사용하여 전체 이미지 크기를 줄입니다.
- Dockerfile 에서 초기 단계에 종속성을 설치하여 캐시를 활용합니다.
- 빌드 및 런타임 환경을 분리하기 위해 다단계 빌드를 사용합니다.
Docker 이미지 관리 및 배포
Docker 이미지 저장 및 공유
Docker 이미지는 다양한 방법으로 저장 및 공유할 수 있습니다.
- Docker Hub: Docker Hub 는 Docker 이미지의 공식적인 공용 레지스트리입니다. 이미지를 Docker Hub 에 푸시하여 다른 사용자와 공유할 수 있습니다.
- 프라이빗 레지스트리: 조직의 사용자 정의 이미지를 저장하고 관리하기 위해 자체 프라이빗 Docker 레지스트리를 설정할 수 있습니다.
- 로컬 저장소: Docker 이미지는 호스트 머신에 로컬로 저장할 수도 있지만, 주로 개발 및 테스트 목적으로 사용됩니다.
Docker 컨테이너 배포
Docker 이미지가 있으면 docker run 명령을 사용하여 컨테이너로 배포할 수 있습니다.
docker run -d -p 8080:8080 --name my-app my-app
이 명령은 my-app 이미지에서 새 컨테이너를 시작하고, 호스트의 포트 8080 을 컨테이너의 포트 8080 으로 매핑하며, 컨테이너의 이름을 my-app으로 지정합니다.
Docker 컨테이너 관리
다양한 명령을 사용하여 Docker 컨테이너를 관리할 수 있습니다.
docker ps: 모든 실행 중인 컨테이너를 나열합니다.docker stop <container_id>: 실행 중인 컨테이너를 중지합니다.docker start <container_id>: 중지된 컨테이너를 시작합니다.docker logs <container_id>: 컨테이너의 로그를 확인합니다.docker exec -it <container_id> /bin/bash: 실행 중인 컨테이너 내부의 쉘을 엽니다.
Docker 컨테이너 확장
Docker 는 컨테이너의 여러 인스턴스를 실행하여 애플리케이션을 쉽게 확장할 수 있도록 지원합니다. Docker Swarm 이나 Kubernetes 와 같은 도구를 사용하여 대규모 컨테이너 배포를 조정하고 관리할 수 있습니다.
graph TD
A[Docker 호스트] --> B(컨테이너 1)
A[Docker 호스트] --> C(컨테이너 2)
A[Docker 호스트] --> D(컨테이너 3)
지속적인 통합 및 배포
Docker 이미지는 지속적인 통합 (CI) 및 지속적인 배포 (CD) 파이프라인에 쉽게 통합될 수 있습니다. Jenkins, GitLab CI 또는 GitHub Actions 와 같은 도구를 사용하여 Docker 이미지를 자동으로 빌드, 테스트 및 배포할 수 있습니다.
요약
이 튜토리얼을 마치면 Docker 이미지에 대한 확실한 이해와 Dockerfile 에서 직접 Docker 이미지를 구축하는 능력을 갖추게 됩니다. 이미지 관리 및 배포 방법을 배우면서 컨테이너화 프로세스를 간소화하고 개발 및 배포 워크플로우에서 Docker 의 잠재력을 최대한 활용할 수 있습니다.



