(Kubernetes & Docker) Docker 빌드에 Jenkins 사용 – 준비


이 연습에서는 Jenkins를 사용하여 Docker 빌드를 계속합니다.

Docker 빌드를 실습하기 전에 Docker 빌드에 대해 알아봅시다!

빌드 방법은 다음과 같이 두 부분으로 나뉩니다.

  • 전체 빌드: 각 빌드에서 전체 코드로 빌드
  • 증분 빌드: 변경된 코드 대상만 격리하여 빌드

도커 빌드의 경우 변경된 부분에 대해서만 증분 빌드가 이루어지므로 풀 빌드 방식보다 빠르고 리소스 소모가 적습니다.

증분 빌드 원리는 Docker 레이어의 개념을 알면 이해할 수 있습니다 자세한 내용은 “(Kubernetes & Docker) Image Creation/Loading”을 참조하십시오.

간단히 말해서 다음과 같습니다.

1) Docker 빌드는 각 RUN, ADD, COPY 명령에 대해 읽기 전용 Docker 이미지 계층을 생성합니다.

2) Docker-Run을 통해 캐시됨 도커 이미지 레이어를 기반으로 읽기 전용 컨테이너 레이어를 생성합니다. (컨테이너 수준에서 커밋 명령을 사용하지 않는 한 변경 사항은 컨테이너에 저장되고 컨테이너가 제거되면 사라집니다.)

3-1) 컨테이너에 변경 사항이 있을 경우 docker commit을 통해 변경 사항을 저장할 수 있으며, 기존 이미지는 유지되고 해당 변경 사항과 관련된 레이어가 추가로 생성됩니다.

3-1) Docker Build를 실행할 때 Dockerfile에 변경 사항이 있으면 변경된 명령으로 Docker가 시작됩니다. 이미지 레이어가 다시 생성됩니다. (커맨드에서 변경해서 다시 만든거라 자주 변경되는 부분은 아래에 넣어두시면 좋습니다.)

이제 Dockerfile에서 사용되는 명령을 살펴보겠습니다!

명령 기능
OUT OF 컨테이너 기본 이미지 레이블(예: jenkins, redis, nginx 등)
달리다 실행할 명령(주로 라이브러리가 캐시되어 설치될 때 사용됨)
CMD 실행 명령 (캐시되지 않으며 컨테이너 생성 시 변경될 수 있음)
docker run(컨테이너 이름)(command)을 입력하면 Dockerfile에 정의된 CMD 이외의 명령어가 실행됩니다.
진입 지점 실행 명령 (캐시되지 않음, 변경 불가능, 컨테이너 생성 시 반드시 먼저 하세요)
(도커 실행 명령어 입력 시 무조건 실행되며 동적으로 변경할 수 없습니다.)
상표 라벨 설정
폭로하다 컨테이너 포트 마크
아르그 Dockerfile에서만 사용 가능한 환경 변수
주당 순 이익 Dockerfile, 컨테이너에서 사용 가능한 모든 환경 변수
추가 파일 복사(압축된 파일의 경우 압축 해제, 컨테이너에 URL 형식으로 다운로드 가능)
복사 파일 복사(단순 파일 복사)
용량 특정 호스트 경로를 컨테이너 볼륨으로 마운트
사용자 사용자 권한으로 동작하도록 컨테이너 사용자 정의
작업장 컨테이너에서 명령을 호출하기 위한 디렉토리

이제 빌드 명령어를 배워봅시다!

$ docker build -t (생성할 이미지명) (빌드할 코드 경로)

Dockerfile에 옵션을 지정하지 않으면 Dockerfile 파일명을 조회하지만 파일명이 변경된 경우 다음 옵션으로 지정할 수 있습니다.

$ docker build -t (생성할 이미지명) -f (dockerfile 파일명) (빌드할 코드 경로)

이제 다음과 같이 연습하고 준비하자!

# 실험실 준비

– EC2 VM 인스턴스 생성(Ubuntu)

– 자바 11 설치

– 도커 설치

EC2 인스턴스는 우분투를 이용해서 만들었고 어렵지 않으니 그 부분은 건너뛰고 자바와 도커를 설치하자!

첫 번째 업데이트 apt, 우분투 패키지 관리 도구.

$ sudo apt update

apt를 통해 자바를 다운로드합니다.

$ sudo apt install -y default-jdk

정상적으로 설치되었는지 확인하면 11버전이 정상적으로 설치된 것입니다.

$ java -version
openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)

이제 도커를 설치하자!

아래와 같이 apt를 통해 쉽게 설치할 수 있습니다.

$ sudo apt install -y docker.io

아래와 같이 Docker가 정상적으로 설치되었는지 확인하고 정상적으로 활성화된 것을 확인할 수 있습니다.

$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-03-13 10:38:29 UTC; 10s ago
TriggeredBy: ● docker.socket

테스트를 위해 docker 프로세스를 검사하기 위해 명령을 호출하면 권한이 거부됨으로 반환됩니다.

$ docker ps -a
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?all=1": dial unix /var/run/docker.sock: connect: permission denied

도커는 sudo 권한으로 설치되었기 때문에 루트는 실행 권한과

일반 사용자에게 Docker 실행 권한을 부여하려면 다음과 같이 docker.sock 권한을 변경합니다.

$ ls -all /var/run/docker.sock
srw-rw---- 1 root docker 0 Mar 13 10:38 /var/run/docker.sock
$ sudo chmod 666 /var/run/docker.sock
$ ls -all /var/run/docker.sock
srw-rw-rw- 1 root docker 0 Mar 13 10:38 /var/run/docker.sock

정상적으로 적용되었는지 테스트해보면 검색이 잘 되는 것을 확인할 수 있습니다.

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

끝!