일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자동
- Kafka
- 젠킨스
- 머신러닝
- 설정
- vue
- 자바
- EMR
- Docker
- Jenkins
- ec2
- redash
- 레디스
- Zeppelin
- 간단
- SpringBoot
- hive
- login
- 로그인
- 클러스터
- spring
- 예제
- aws
- fastcampus
- java
- Cluster
- gradle
- Mac
- Redis
- config
- Today
- Total
코알못
[Docker] Docker 빌드를 위한 Jenkins 활용 - 준비 본문
이번 실습은 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
끝!
'ETC' 카테고리의 다른 글
[Lambda] 라이브러리 버전 변경 (0) | 2023.03.16 |
---|---|
[Docker] Docker 빌드를 위한 Jenkins 활용 - 도커 이미지 빌드 (0) | 2023.03.15 |
[Docker] Docker Compose 란? (0) | 2022.12.09 |
[Docker] 도커 이미지 경량화 전략 / 디버깅 (0) | 2022.11.27 |
[Docker] 도커 허브를 통한 이미지 관리 (0) | 2022.11.25 |