코알못

[Docker] Docker 빌드를 위한 Jenkins 활용 - 준비 본문

ETC

[Docker] Docker 빌드를 위한 Jenkins 활용 - 준비

코린이s 2023. 3. 13. 21:27
728x90

이번 실습은 jenkins 를 활용하여 docker 빌드하는 부분을 진행 할 예정이다.

docker 빌드 실습 전에 도커 빌드에 대해서 알아보자!

빌드 방식을 두가지로 나누어 보면 아래와 같다.

  • 전체 빌드 : 매 빌드때 마다 전체 코드를 포함하여 빌드
  • 증분 빌드 : 변경된 코드 대상만 분리하여 빌드

docker 빌드의 경우 증분 빌드로 변경 부분에 대해서만 빌드 하므로 전체 빌드 방식보다 빠르고 리소스를 적게 사용한다.

증분 빌드 원리는 docker layer 에 대한 개념을 알면 이해 할 수 있으며 자세한 내용은 '[Kubernetes & Docker] 이미지 생성/불러오기' 를 참고 하도록 한다.

간단하게 정리하자면 아래와 같다.

1) docker build 를 통해 읽기 전용 docker image layer가 'RUN, ADD, COPY' 명령어 별로 생성된다.

2) docker run 을 통해 캐싱된 docker image layer 기반으로 읽기/쓰기 전용 container layer를 생성한다. (container layer 는 컨테이너에서의 변경 사항이 저장되며 commit 명령어를 쓰지 않으면 컨테이너 제거시 사라진다.)

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

3-1) dockerfile 변경 사항이 있을때 docker build를 진행하면 변경 사항이 있는 명령어부터 docker image layer가 재 생성 된다. (변경 사항 있는 명령어부터 재 생성 되므로, 변경이 자주 일어나는 부분은 하단에 두는것이 좋다.)

이제 dockerfile에서 사용하는 명령어를 알아보자!

명령어 기능
FROM 컨테이너의 Base Image 지정 (예: jenkins, redis, nginx 등)
RUN 실행할 명령어 (캐싱 되므로 라이브러리 설치 할 때 주로 활용됨)
CMD 실행할 명령어 (캐싱 되지 않으며 컨테이너 생성 시점에 변경 될 수 있음)
docker run [컨테이너명] [명령어] 입력시 Dockerfile에 정의된 CMD가 아닌 명령어가 실행됨
ENTRYPOINT 실행할 명령어 (캐싱 되지 않으며 변경 되지 않음, 컨테이너 생성 시점에 무조건 최초 실행됨) 
(docker run 명령어 입력시 무조건 실행 되며 동적으로 변경 불가능)
LABLE Label 설정
EXPOSE 컨테이너 포트 표기
ARG Dockerfile에서만 사용 가능한 환경 변수
ENV Dockerfile, 컨테이너 내 모두 사용 가능한 환경 변수
ADD 파일 복사 (압축 파일의 경우 압축 해제, URL 형식으로 컨테이너에 다운로드 가능)
COPY 파일 복사 (단순 파일 복사)
VOLUME 특정 호스트 경로를 컨테이너 볼륨으로 마운트
USER 컨테이너가 사용자 권한으로 동작 하도록 사용자 지정
WORKDIR 컨테이너 내 명령어를 호출할 디렉토리

이제 빌드 명령어를 알아보자!

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

도커 파일은 옵션을 따로 주지 않으면 Dockerfile 이라는 파일명을 찾지만 파일명을 변경 한다면 아래와 같은 옵션으로 지정 가능하다.

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

이제 실습 준비를 해볼 예정이며 아래와 같이 준비 한다!

# 실습 준비

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

- Java 11 설치

- Docker 설치

EC2 인스턴스는 ubuntu 로 생성 하였으며 어렵지 않기에 이 부분은 넘어가며 java와 docker 를 설치 하도록 한다!

우선 ubuntu 패키지 관리 툴인 apt 를 업데이트 한다.

$ sudo apt update

apt 를 통해 java 를 다운 받는다.

$ 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

도커가 정상적으로 설치 되었는지 아래와 같이 확인하며 정상적으로 active 상태인것을 볼 수 있다. 

$ 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

테스트를 위해 도커 프로세스 확인하는 명령어를 호출해보면 permission denied 로 권한이 없다고 나온다.

$ 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를 설치 하였기에  root 에게 실행 권한이 있으며

일반 유저에게 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

끝!

728x90
Comments