Dockerfile을 작성하고 실행하는 방법과 이미지 빌드를 할 때, 빌드 캐시를 활용하여 빌드 최적화 하는 방법입니다.
Dockerfile 작성 및 실행
1. PHP 애플리케이션 Docker 환경 설정
$ mkdir phpapp
$ cd phpapp
2. Dockerfile 생성 및 작성
vi 편집기를 사용하여 Dockerfile을 작성합니다.
$ vi Dockerfile
Dockerfile
FROM ubuntu:14.04
MAINTAINER "adam <itstudy@kakao.com>"
LABEL title "IaC PHP application"
RUN apt-get update && apt-get -y install apache2 php5 git curl ssh wget
#Apache2 Environment Variable
ENV APACHE2_RUN_USER www-data APACHE2_RUN_USER www-data APACHE2_LOG_DIR /var/log/apache2 APACHE2_WEB_DIR /var/www/html APACHE2_PID_FILE /var/run/apache2/apache2.pid
#basic web page
RUN echo 'Hello Docker Application' > /var/www/html/index.html
#PHP 파일
RUN echo '<?php phpinfo(); ?>' > /var/www/html/index.php
EXPOSE 80
WORKDIR /var/www/html
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
3. Docker 이미지 빌드
$ docker build -t myphpapp:1.0 .
4. Docker 컨테이너 실행
$ docker run -dit -p 8101:80 --name phpapp1 myphpapp:1.0
이미지 빌드 과정
Docker 이미지 빌드는 사용자와의 대화식 작업이 아니라 자동화된 방식으로 이루어집니다. 이는 빌드 도중 어떠한 프롬프트 없이 필요한 작업이 자동으로 수행된다는 것을 의미합니다. 그래서, 만약 apt-get으로 패키지를 설치해야 하는 경우, 반드시 apt-get update 명령을 먼저 실행해줘야 하며, -y 옵션을 추가해 사용자가 수동으로 확인을 입력하지 않아도 설치가 자동으로 진행되도록 설정해야 합니다.
Docker 이미지를 빌드할 때는 현재 디렉토리의 모든 파일과 디렉토리의 콘텐츠가 Docker 데몬에 빌드 컨텍스트로 전달됩니다. 하지만 때로는 빌드에 불필요한 파일들이 포함되는 것을 피하고 싶을 때가 있습니다. 예를 들어, 로그 파일, 노드 모듈 등 큰 파일들은 빌드할 때 제외하고 싶을 수 있습니다. 이때는 .dockerignore 파일을 사용하여 특정 파일이나 디렉토리를 명시적으로 제외할 수 있습니다.
Python 개발 환경을 위한 Docker 이미지 설정 과정입니다.
1. 프로젝트 디렉토리 생성
먼저, 프로젝트 디렉토리를 만들고 Dockerfile을 생성합니다.
$ mkdir python_lab
$ cd python_lab
2. Dockerfile 작성
$ nano Dockerfile
Dockerfile
FROM ubuntu:18.04
RUN apt-get install python
3. Docker 이미지 빌드 및 실행
docker build -t mypyapp:1.0 .
이미지 빌드: 실패(apt-get update를 하지 않아서 발생하는 문제)
실패 원인은 패키지 목록을 최신 상태로 업데이트하지 않아서 필요한 패키지를 찾지 못하여 이미지 빌드 실패가 발생했습니다. 이를 해결하기 위해 apt-get update 명령어를 도커파일에 추가해줍니다.
이미지 빌드: 실패(대화식으로 작업하도록 해서 실패)
패키지를 설치할 때 대화식 프롬프트가 발생하면서 이미지 빌드가 실패했습니다. apt-get install 명령이 실행되면 사용자의 입력을 기다리는 대화식 프롬프트가 나타나기 때문에 자동으로 설치가 완료되지 않아 빌드가 중단된 것입니다. 이를 해결하기 위해, -y 옵션을 추가하여 패키지를 설치할 때 자동으로 설치가 진행되도록 설정합니다.
이미지 빌드: 실패(ubuntu:18.04 베이스 이미지가 더 이상 특정 패키지 인덱스 파일을 정상적으로 다운로드하지 못함)
apt-get update 명령이 실패하면서 이미지 빌드가 중단되어 apt-get update 과정에서 일부 인덱스 파일을 다운로드하는 데 실패했습니다. ubuntu: 18.04는 더 이상 일부 저장소 URL을 지원하지 않거나 네트워크 문제로 인해 인덱스 파일을 가져오는 데 실패할 수 있어서 (오래된 리눅스 배포판에서는 이러한 문제가 자주 발생하며, 저장소 URL이 변경되었거나 지원되지 않는 경우가 많음)
ubuntu:14.04 베이스 이미지로 변경하였습니다.
베이스 이미지를 ubuntu:18.04에서 ubuntu:14.04로 변경하여 빌드를 다시 시도
패키지 설치가 제대로 진행되었으며, 이미지 빌드에 성공했습니다.
이미지 빌드 캐시 활용
Docker는 동일한 명령이 반복되는 경우 빌드 캐시를 사용해 빌드 속도를 향상시킵니다. 이를 통해 이미 실행된 명령의 결과를 재사용할 수 있습니다.
Dockerfile
nginx, curl, vim을 설치하고, 기본 웹 페이지를 /var/www/html/index.html에 생성하는 설정 작성해줍니다.
FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx curl vim
RUN echo 'Docker Container Application.' > /var/www/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
첫 번째 이미지 빌드
$ docker build -f Dockerfile -t webapp:1.0 .
첫 번째 빌드는 캐시가 없기 때문에 모든 명령어가 순차적으로 실행됩니다. 이 과정에서 시간이 꽤 소요된 것을 확인할 수 있습니다.
두 번째 이미지 빌드 (캐시 사용)
$ docker build -f Dockerfile -t webapp:2.0 .
두 번째 빌드에서는 동일한 Dockerfile을 사용했기 때문에 Docker가 이전 빌드의 중간 결과를 캐시로 사용합니다. 이미 처리된 명령어에 대해 캐시를 활용해 빌드 시간을 크게 단축할 수 있습니다.
두 번째 빌드를 실행하면, 동일한 명령이 적용된 부분에서 cached라는 메시지가 보입니다. Docker는 이전 빌드의 중간 이미지를 캐시로 사용해 빌드 속도를 최적화합니다. 이를 “빌드 캐시”라고 하며, 동일한 명령어들이 연속된 부분까지 캐시가 적용됩니다.
빌드 캐시는 Docker가 이전 빌드에서 처리된 명령어와 동일한 명령어가 다시 실행될 때, 해당 명령의 결과를 캐시에서 불러와 재사용하는 방식으로 작동합니다. 이 캐시는 빌드 속도를 향상시키고, 반복적인 작업을 줄여줍니다.
특히 동일한 명령어가 연속된 부분까지 캐시를 사용합니다. 예를 들어, 패키지 설치 명령(apt-get install) 이후에 파일을 생성하는 명령(echo)이 있다면, 두 명령이 모두 동일할 때만 캐시가 활용됩니다.
'BackEnd > DEVOPS' 카테고리의 다른 글
[AWS] AWS ECS와 ECR을 활용한 CI/CD 구현 (1) | 2024.11.18 |
---|---|
[ArgoCD] ArgoCD 설치 (1) | 2024.11.15 |
[Kubernetes] Master Node, Worker Node 연결 (0) | 2024.11.15 |
[Kubernetes] Spring Boot 애플리케이션 배포: CNI, SDN, NodePort 서비스 설정 (1) | 2024.10.29 |
[Kubernetes] 쿠버네티스 클러스터 구성 및 관리 (0) | 2024.10.29 |