이 연습에서는 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
끝!