반응형

개념 정리

Docker 란?

  • Docker : 컨테이너 기반의 오픈소스 가상화 플랫폼

Container 란?

  • 컨테이너는 독립된 가상 공간에서 프로세스가 동작하는 기술
  • 하나의 서버에 여러개의 컨테이너를 띄울 수 있음
  • 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순화 할 수 있음
  • 컨테이너마다 다른 프로그램, 다른 버전을 적용할 수 있으며 각자 독립적으로 실행할 수도, 서로 연동해서 사용할 수도 있음
  • VM(Virtual Machine)과 비슷한 개념이지만, VM은 각각에 OS를 올려서 사용해야 하고 자원을 할당해서 사용하는 반면, 컨테이너 기반 가상화 방식은 Host OS와 Docker 엔진 위에서 바로 동작하기 때문에 성능이 좋고 필요한 만큼의 자원만 사용해서 사용함

(왼쪽 : VM, 오른쪽 : Docker)

Docker Image 란?

  • 도커 이미지에는 실행 가능한 어플리케이션 소스 코드 뿐만 아니라 실행에 필요한 모든 툴, 파일, 라이브러리 및 설정값 등이 포함
  • 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 바뀌거나 삭제되더라도 이미지는 변하지 않고 그대로 남아 있음
  • Git으로 저장된 내용들이 Github에 올려지는 것과 같이, Docker Image는 Docker Hub에 업로드 되어서 공유되고 다운 받을 수도 있음

Docker File 이란?

  • Docker에서 이미지를 생성하기 위한 용도로 작성하는 파일
  • 생성할 이미지에 대한 정보들을 기술해 놓은 파일이라고 생각하면 됨 => Docker File을 읽으면 해당 이미지가 어떻게 구성되었는지 알 수 있음

Docker 설치

  1. EC2 인스턴스 생성 및 접속
  2. 관리자 권한 부여
sudo su -
  1. Docker 설치 및 관련 스크립트 입력
  • 전체 복붙 후 엔터
# 업데이트
sudo apt-get update -y

# HTTP 패키지 설치
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common -y

# gpg 키 및 저장소 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository --yes \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# Docker 엔진 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
  1. 설치 확인
docker -v
  • 아래와 같이 도커 버전이 출력되면 잘 설치된 것임

프로젝트 배포

  • Spring (gradle) 프로젝트를 Docker을 통해 서버에 배포
  • 아래의 프로젝트를 배포하는 예제
    • 보안을 위해 application.yml에 DB 정보 및 암호를 입력하지 않음 -> 환경변수를 통해 DB 정보를 넣어줄 예정

https://github.com/Changbum97/CI-CD-Practice

 

GitHub - Changbum97/CI-CD-Practice

Contribute to Changbum97/CI-CD-Practice development by creating an account on GitHub.

github.com

  1. IntelliJ에서 우측 탭에 있는 'Gradle' 클릭

  1. Tasks -> build -> assemble 을 클릭하면 아래와 같이 Build가 완료됨

  1. 빌드가 완료되면 프로젝트의 build/libs 경로에 jar 파일이 생성됨

  • 생성된 jar 파일 : CI-CD-Practice-0.0.1-SNAPSHOT.jar
  1. 프로젝트의 root 경로에 Dockerfile 생성

  1. 아래의 코드를 Dockerfile에 붙여넣음
  • 이 때, <생성된 jar 파일명> 부분에는 위에서 생성된 jar 파일의 이름을 넣어주면 됨
  • 또, 주의해야할 점은 해당 Dockerfile은 Java 11 버전에 맞게 설정되어 있음 -> 만약 버전이 다르다면 openjdk:11.0-slim 이 부분을 버전에 맞게 수정해야 함
FROM gradle:7.4-jdk11-alpine as builder
WORKDIR /build

# 그래들 파일이 변경되었을 때만 새롭게 의존패키지 다운로드 받게함.
COPY build.gradle settings.gradle /build/
RUN gradle build -x test --parallel --continue > /dev/null 2>&1 || true

# 빌더 이미지에서 애플리케이션 빌드
COPY . /build
RUN gradle build -x test --parallel

# APP
FROM openjdk:11.0-slim
WORKDIR /app

# 빌더 이미지에서 jar 파일만 복사
COPY --from=builder /build/build/libs/<생성된 jar 파일명>.jar .

EXPOSE 8080

# root 대신 nobody 권한으로 실행
USER nobody
ENTRYPOINT [ \                                               
   "java", \                                                
   "-jar", \                                                
   "-Djava.security.egd=file:/dev/./urandom", \              
   "-Dsun.net.inetaddr.ttl=0", \                            
   "<생성된 jar 파일명>.jar" \             
]
  1. Dockerfile까지 생성한 상태에서 git에 push
  2. 터미널로 EC2 인스턴스 접속
  3. 원하는 위치로 이동 후 프로젝트를 clone 받음
  4. cd 명령어를 통해 clone 받은 프로젝트로 이동
  5. 아래의 명령어를 통해 프로젝트 build
docker build -t <프로젝트명> .
  • 이 때, 프로젝트명은 소문자로 바꿔서 써줘야 함
  • ex) 프로젝트명: AbcD -> abcd
  1. 빌드에 성공했는지 확인
docker images -a
  • 위 명령어를 입력했을 때, 아래와 같이 이미지가 추가 되어 있어야 함

  1. 프로젝트 실행
docker run -p 8080:8080 \
-e SPRING_DATASOURCE_URL=jdbc:mysql://<RDS 주소>:<DB 포트번호>/<DB명> \
-e SPRING_DATASOURCE_USERNAME=<DB 마스터 이름> \
-e SPRING_DATASOURCE_PASSWORD=<DB 비밀번호> \
-d <프로젝트명>
  • -p 8080:8080 은 입력 포트와 출력 포트를 의미
    • 만약 프로젝트 포트를 8081로 했다면 -p 8081:8080
    • 만약 접속을 url:8081로 하고 싶다면 -p 8080:8081
  • -e 를 통해 환경변수 설정
    • DB 주소 및 암호를 환경변수로 넣어 줌으로써, 코드에 직접 주소와 비밀번호가 들어가지 않아도 되기때문에 보안이 강화됨
  • -d 데몬으로 실행
    • 데몬으로 실행하면 프로젝트는 실행되는데 실시간으로 로그가 출력되지 않기 때문에 도커에서 다르 작업을 할 수 있음
    • 만약 프로젝트에 에러가 발생해서 로그를 확인하고 싶다면 -d를 빼서 데몬으로 실행하지 않으면 확인 가능함
  1. 확인
  • 실행에 성공하면 아래와 같이 출력됨

  • 또한, 'docker ps' 명령어를 통해 현재 실행중인 컨테이너를 확인할 수 있음

  • 마지막으로 'EC2 인스턴스의 퍼블릭 IPv4 DNS 주소:포트번호' 주소를 통해 접속할 수 있음

프로젝트 배포 중지

  • 현재 서버에 올라간 프로젝트의 배포를 중지하고 싶다면 docker 컨테이너를 삭제하면 됨
  1. 삭제하고자 하는 컨테이너의 CONTAINER ID를 알아냄
# 현재 실행중인 컨테이너 표시
docker ps

  1. 실행중인 컨테이너 중지
# 현재 실행중인 컨테이너 중지 (kill이 더 강제적으로 중지하는 느낌)
docker stop <CONTAINER ID>
docker kill <CONTAINER ID>
  • 중지에 성공했다면 'docker ps' 실행 시 해당 컨테이너가 출력되지 않음
  1. 중지된 컨테이너 확인
# 중지된 컨테이너들까지 표시
docker ps -a

  1. 중지된 컨테이너 삭제
# 중지된 컨테이너 삭제
docker rm <CONTAINER ID>
  • 삭제까지 완료하면 'docker ps -a'를 해도 컨테이너가 출력되지 않음
  1. 전에 프로젝트가 배포되던 URL에 접속해도 아래와 같이 출력됨

반응형

↓ 클릭시 이동

복사했습니다!