DevOps/Docker

[Docker] Springboot 도커 배포해보기 | 도커 이미지 장점 (Docker hub,Docker API)

Hannana. 2024. 3. 17. 03:55
반응형

 

도커 이미지란?
WHAT is the Docker Image?

도커 이미지는 파일 시스템의 변경사항만을 포함하는 여러 개의 읽기 전용 레이어로 구성됨.
이미지를 업데이트할 때 전체 이미지를 다시 다운로드할 필요 없이 변경된 부분만 업데이트할 수 있다!
이미지 빌드 과정에서 이미 빌드된 레이어는 로컬에 캐시되어 다음 빌드 시 재사용되며, 
중복 다운로드 방지 & 조금씩 변경하면서 빌드를 반복할 때 특히 유용하다.

 

 


도커 서비스의 가장 작은 단위라고 생각하면 될 듯하다. 

오늘은 도커의 개념과 장점은 간단하게 훑고

실제 스프링부트 프로젝트 배포를 실습해보자.

도커가 리눅스 혹은 각자 환경에 설치된 것을 기본 베이스로 한다.


 

도커에 권한부터 추가해야 한다.  (권한 추가이므로 관리자 모드 sudo)

usermod -aG docker $USER //$USER == 현재 접속중인 사용자
usermod -aG docker users//users == 사용자명

 

 

 

 

 

1. 스프링부트 빌드 파일 생성하기

 

방법1) intellij > 우측 Gradle > build > bootjar > ctrl + shift + F10 (run app..)

 

 

방법2) 터미널에서 프로젝트 루트 디렉토리 접근 > ./gradlew build

 

 

 

 

빌드 완료된 모습

 

 

 

2. 도커 이미지 생성(빌드)하기

 

1) 디렉토리 생성

접근이 편한 ~/ 홈 디렉토리에 docker 이미지를 담을 폴더를 만들어준다.

 

 

 

2)  jar 파일을 해당 도커 폴더로 옮기기

cp /tmp/{프로젝트 폴더}/build/libs/{생성한 빌드 파일 0.0.1-SNAPSHOT.jar} ./

 

 

3) 도커 파일 작성하기

 

▷ 도커 파일(Docker File) 이란?

도커 파일(Dockerfile)은 도커 이미지를 빌드하기 위한 스크립트 파일이다.
도커 이미지를 자동으로 빌드하기 위한 자동화된 방법을 제공하고,
애플리케이션에 필요한 환경 설정 등을 담아 쉽게 배포하고 실행할 수 있도록 도와준다.

도커 파일은 각 명령어가 순차적으로 실행되며,
일련의 명령어들을 사용하여 도커 이미지를 빌드하고, 컨테이너를 실행할 수 있다. 

 

 

▶ 도커 파일 작성 예시 : 

FROM 이미지를 생성할 때 사용할 기본 이미지

RUN 셸 스크립트를 실행하거나 패키지를 설치하는 등의 작업을 수행

ARG 변수 선언 예)build_file={빌드 파일}.0.1-SNAPSHOT.jar

COPY 빌드 파일을 복사 예)${build_file} springboot.jar 
혹은 ADD 현재 위치의 파일을 특정 이름으로 이미지에 적재
//둘 다 호스트 파일 시스템의 파일이나 디렉터리를 도커 이미지 내부로 복사하는 명령

ENTRYPOINT 이미지가 컨테이너화 되며 실행될 명령을 입력 예)["java","-jar","/spring.jar"]

########실제 작성 예시##################

//FROM python:버전

//WORKDIR /test

//COPY requirements.txt .

//RUN pip install --no-cache-dir -r requirements.txt

//COPY . .

//CMD ["python", "app.py"]

 

 

 

-도커이미지 생성시 사용 될 기본이미지를 다운로드해야한다.

:   jar를 실행하기 위해 jdk가 설치된 이미지를 찾아서 다운로드하기

docker search jdk

 

 

-Docker 이미지를 빌드

docker build -t <이미지명:태그> <Dockerfile 경로>

#######실제 예시#######
//docker build -t Example:1.0 .

 

 

  • Example = 이미지명
  • 1.0 = 태그
  • . . = 디렉토리

이미지명과 태그는 원하는대로 지정할 수 있고, 필요에 따라 다른 이름을 사용 가능하다.

이미지명의 기본 형태는 다음과 같다.

{이미지명}:{tag}

 

 

 

-Docker 이미지 목록 확인

docker images

 

 

3. 도커 컨테이너 실행


이미지 빌드 -> 해당 이미지를 실행 -> 도커 컨테이너를 생성

※ 여기서 컨테이너(Container)는 이미지의 인스턴스라고 볼 수 있으며,

실행하고자 하는 applicaion은 컨테이너 위에서 실행된다.

 

 


-Docker 컨테이너를 실행

docker run {옵션} {호스트 포트}:{컨테이너 포트} {이미지명:태그}

#######실제 예시#######
//docker run -d -p 8080:5000 Example:1.0


//호스트의 포트 8080과 컨테이너의 포트 5000을 매핑

 

도커 컨테이너에 올린 Example 애플리케이션은 호스트의 8080 포트에 접근할 수 있다.

 

 

컨테이너 run 시 사용할 수 있는 옵션은 다음과 같다.

-d detached mode (backgroud)
-p 호스트와 컨테이너의 포트를 연결 (포워딩)
-v 호스트와 컨테이너의 디렉토리를 연결 (마운트)
-e 컨테이너 내에서 사용할 환경변수 설정
–name 컨테이너 이름 설정
–rm 프로세스 종료시 컨테이너 자동 제거
–link 컨테이너 연결 [컨테이너명:별칭]

 

 

 

 

-만약 도커 컨테이너가 db 컨테이너라면

다음과 같이 실행할 수 있다. (예시: mysql)

docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  mysql:{버전}

 

 

 

-기존에 있는 도커 컨테이너를 실행하고 싶다면? (실행중인 컨테이너의 파일을 실행하고 싶을 때)

docker exec {컨테이너명} {명령어} 

########실제 예시#########
docker exec mysql mysql -uroot
 

run은 새로 컨테이너를 만들어서 실행하고,

exec는 실행중인 컨테이너에 명령어 내리는 것임. (차이점)

 

도커에 ssh 등 서버 접속하는 방식보다는 원래 기존의 명령어를 적!극! 활용해보자.

 

 

 

 

 

4. 도커 컨테이너 관리

docker ps {도커이름 or id} -a //1)
docker start {도커이름 or id}//2)
docker stop {도커이름 or id}//3)
docker rm {도커이름 or id}//4)
docker rm -v $(docker ps -a -q -f status=exited) //5)

 

1) 컨테이너 전체 리스트 확인 2)3) 시작,중지 4)제거 5)중지된 컨테이너 일괄 삭제

 

※ Docker API로도 관리 가능

>> 대부분의 명령어는 직관적 / 컨테이너의 복잡한 시스템 구성 몰라도 사용 가능 / http기반의 Rest API도 지원 -> 확장성 보장

 

 

 

5. 도커 컨테이너 배포 with 도커 컴포즈 (Docker Compose)

도커 컴포즈(Docker Compose)를 사용하면 여러 개의 컨테이너를 쉽게 관리하고 연결할 수 있다.

 

-관리자 모드로 아래 명령어 실행하여 도커 컴포즈 install (Docker Compose는 CentOS의 공식 저장소에 포함되어 있지 않으므로 직접 다운로드 받아 설치해야 함)

wget -O /usr/local/bin/docker-compose "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)"

 

 

yaml파일을 통해 컨테이너, 네트워크 등 상세 내용을 정의하고 한 번에 여러 컨테이너를 실행할 수 있는 것이 장점이당.

 

예를 들어

웹 애플리케이션과 데이터베이스 컨테이너를 함께 실행하는 .yml 파일이라면,

다음과 같이 yml파일을 작성할 수 있음

#######yaml 파일 예시############

version:{버전} 

services:
  web:
    build: .
    ports:
      - 8080:5000
    depends_on:
      - db
  db:
    image: mysql:{버전}
    environment:
      - MYSQL_USER=
      - MYSQL_PASSWORD=
      

//web 컨테이너 have 의존성 to db 컨테이너

 

 

 

이제 HOW DO I USE THIS?

docker-compose up -d //-d : backgroud 실행

 

 

컴포즈로 여러 컨테이너 한꺼번에 배포 완료~!

 

 

 

 

 

 

※ 참고로, 오케스트레이션 도구인 Kubernetes 등을 활용하면 컨테이너화된 애플리케이션을 자동으로 배포하고 확장할 수 있음

※ 오케스트레이션 도구란?

 

>> 컨테이너화된 애플리케이션을 관리하고 조율하는 데 필수적인 도구이다!
-여러 대의 서버나 클러스터 상에서 컨테이너를 자동으로 배포/확장
-컨테이너 상태를 모니터링하고 필요에 따라 자원을 관리
-대표적인 오케스트레이션 도구로는 쿠버네티스, Docker Swarm, Apache Mesos 등이 있다.
-롤링 업데이트와 롤백 기능을 제공 in uploading with 가용성

 

 

 

 

 

 

 

 

 

 

Q. 도커 컨테이너가 너무 큰데요?

그렇다...도커 이미지의 용량은 엄청 크다.. 이렇게 큰 용량의 이미지를 서버에 저장하고 관리하는 것은 쉽지 않다.

그래서 도커는 Docker hub를 통해 공개 이미지를 무료로 관리해 준다. (Private은 유료)

 

↓ 도커 허브 사이트

 

Docker Hub Container Image Library | App Containerization

Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.

hub.docker.com

 

 

 

>> 도커 허브에 업로드하기

 

-로그인

docker login

 

 

-도커 이미지 파일의 기본 형태 in docker hub

{Registry URL}/{사용자 ID}/{이미지명}:{tag}

//기본값 - {Registry URL} : docker.io
//		- {사용자 ID} : library

 

-원래 것에 이름 지어주기

docker tag {원래 이미지} {새로 지어주는 이름}

######실제 예시########
//docker tag test myid/newname:1
//test 이미지에 계정정보(myid)와 새로운 이름 지어준다.

 

이름표 tag 생각하면 될 듯..

 

 

-도커 허브에 이미지 전송

docker push myid/newname:1

 

 

도커 허브에 이미지가 올라갔다. 로컬이 아닌 서버에 배포까지 완료된 셈이다.

이제 나의 이미지는 언제 어디서나 끌어다가 사용할 수 있다.

private한 컨테이너를 구성하고 싶다면, 

서버를 따로 배포하여 그 위에서 도커 컨테이너를 실행하는 방식이 나을지도..

 

 

 

 

아무튼,

프로젝트 색다르게 배포하기 성공!

확실히 기존의 방식보다는 훨씬 덜 번거로울 것 같다..

그리고 개인적으로 버전 관리의 장점을 확실히 느끼려면

프로젝트 진행 중에 적용하는 편이 좋을 것 같다.

(본인은 프로젝트 끝 자락에 배포와 함께 진행하였음..)

 

 

 

끝.

반응형