티스토리 뷰
이번 글에서는 도커를 활용해 스프링서버를 배포하는 과정을 설명하겠습니다.
저희가 서버 1대를배포하거나, 서버의 환경설정이 간단하다면, 일반적으로 EC2에서 파일을받아 빌드하면되겠지만,
만약 여러대의 서버를 배포해야한다던가, 서버배포하기전에 환경설정작업이 매우 복잡하다면, 이렇게 일반적으로 빌드하게 될때 매우 복잡해집니다.
따라서, 도커는 가상환경의 장점을 통해 빠른 서버 배포와 환경설정이 가능하게 해줍니다.
배포 과정
먼저, 도커를 이용해 배포하는 과정을 간략하게 설명 드리겠습니다.
- Dockerfile 생성
- Dockerfile 기반으로 도커이미지 생성
- 도커 이미지를 도커허브로 Push
- EC2에서 도커허브에서 도커 이미지 Pull 받기
- 도커이미지 기반으로 컨테이너 생성 후 실행 (도커 컴포즈로 대체가능)
전체적인 배포과정은 위와 같으며 차례대로 진행해보겠습니다.
Dockerfile 생성
먼저 도커 이미지를 생성하기 위해 도커이미지를 만들 레시피인 Dockerfile을 생성합니다.
스프링 기준으로 Dockerfile의 코드는 다음과 같습니다.
FROM openjdk:11
//jdk 11버전 기반의 이미지로 Docker파일 생성
ARG JAR_FILE=build/libs/hello-spring-0.0.1-SNAPSHOT.jar
//JAR_FILE 변수선언 (스프링 .jar파일)
COPY ${JAR_FILE} app.jar
//로컬 시스템에서 Docker 이미지로 복사 (app.jar 이름으로 복사됨)
ENTRYPOINT ["java","-jar","/app.jar"]
//java -jar /app.jar 명령을 통해 스프링 jar 파일 실행
이렇게 Dockerfile은 도커 이미지를 빌드하기위한 명령어들의 집합을 담고 있으며,
기본 이미지를 기반으로 본인의 서버 코드를 추가하여 새로운 도커 이미지를 생성할 수 있도록 도와주는 파일입니다.
즉, 여기서는 openjdk:11 이미지를 기반으로하며, 스프링 소스 코드와 필요한 패키지들을 추가 설치하여 이미지를 생성할 수 있게합니다.
도커 이미지 생성
이제 위에서 생성한 Dockerfile을 빌드하여 도커 이미지를 생성하는 단계입니다.
이제 Dockerfile이 있는 위치로 가서, Docker build 명령어를 수행하면 되며, 명령어 문법은 다음과 같습니다.
docker build -t [사용자이름]/[이미지이름]:[태그이름] [도커파일위치]
(태그이름은 생략가능 -> latest 기본값)
사실 그냥 build할때, 사용자가 원하는 [이미지 이름]만 입력하셔도 됩니다.
다만 추후에, 도커 허브로 push를 해야할때 위와 같이 [사용자이름]/[이미지이름]:[태그이름] 구조를 가져야합니다.
따라서, 미리 이미지를 만들어 둘 때, 이름을 위와같이 설정하는게 도커허브 push할 때 편리합니다.
아래는 도커이미지 빌드 예시입니다. 이미지 이름은 [사용자이름]/[이미지이름]:[태그이름] 구조를 띄고 있으며,
도커 파일과 같은 디렉토리에 있으므로, 도커파일의 위치는 . 으로 설정했습니다.
도커 이미지를 도커허브로 Push
이제 로컬에서 생성한 도커 이미지를 도커 허브란 저장소에 push하여 저장하는 단계입니다.
로컬에 존재하는 이미지를 ec2로 전송하기 위해선, 도커 허브에 이미지를 저장해야하고, ec2에선 도커허브에서 pull을 하여 해당 이미지를 받아올 수 있습니다.
먼저 전에 만든 이미지를 바탕으로 도커 허브에 push하는 명령어는 다음과 같습니다.
docker push [사용자이름]/[이미지이름]:[태그이름]
(태그이름은 생략가능 -> latest 기본값)
전에 만들어둔 이미지 이름을 같은 구조로 만들었기때문에 똑같이하면 되고, 태그이름은 이미지 빌드때와 똑같이 생략가능합니다.
이렇게 명령어를 입력하면 도커 허브로 push되어, 본인의 도커 허브저장소에 아래와 같이 새 repository가 생성되고 안에 이미지가 업데이트 됩니다.
EC2에서 도커 Pull 받기
이제 도커허브에 저장된 이미지를 ec2에서 pull 받아, 이미지를 가져오는 단계입니다.
이렇게해서 로컬에서 만든 이미지를 ec2에서 scp없이 이미지를 가져올 수 있게되고, 해당 이미지를 기반으로
ec2에서 활용이 가능합니다.
도커 허브 pull하는 명령어는 다음과 같습니다.
docker pull [유저아이디]/[리포지토리 이름]:[태그]
(태그이름은 생략가능 -> latest 기본값)
push했을때 문법과 동일하며, 이 문법으로 도커 허브에 있는 이미지를 가져올 수 있습니다.
이런식으로 이미지를 pull해서 받아올 수 있습니다.
도커 컨테이너 실행
이제 받아온 이미지를 기반으로 도커 컨테이너를 실행하는 단계입니다. 도커 컨테이너를 실행하는 방법은 다음과 같이 총 두가지의 방법이 있습니다.
- 도커 run 활용한 컨테이너 실행 (단일 컨테이너 실행)
- 도커 컴포즈를 활용한 컨테이너 실행 (단일 or 다수의 컨테이너 실행)
먼저 두가지 방식 다, 컨테이너 실행이 가능한데, 첫번째 방법은 생성해야할 컨테이너가 많지않을 때 주로 사용되는 방식이고, 두번째 방식은 생성해야할 컨테이너가 여러개일 때, 주로 사용되는방식입니다.
저는 생성할 컨테이너가 한개이지만, 두가지 방식다 한번 알아보도록하겠습니다.
우선 도커 run의 문법은 다음과 같습니다.
docker run -p [호스트 포트번호]:[도커 포트번호] --name [도커 컨테이너 이름] [도커 이미지이름]
위와 같은 명령어를 통해 1개의 단일 컨테이너를 만들 수 있습니다.
-p 옵션 같은경우는 포트포워딩이 필요할 때만 사용하면됩니다.
도커는 자체적으로 특수한 네트워크를 가지기 때문에 서버를 배포할땐 무조건 호스트 포트번호와 포트포워딩을 진행해야합니다.
도커 네트워크에 관한 내용은 아래의 글에서 확인하실 수 있습니다.
따라서, 아래와 같이 CLI 도커 명령어를 통해 컨테이너 생성이 가능합니다.
그 다음으로는 도커 컴포즈를 활용해 컨테이너 생성하는 법 입니다.
우선 docker-compose.yml 이라는 파일을 만들어야 합니다. 해당 파일의 위치는 아까 만든 dockerfile의 위치와 동일한 위치에 생성해 주시면 됩니다.
도커 컴포즈 문법이 따로 있는데 이건 너무길어서 생략하도록 하겠습니다.
저희는 컨테이너 환경이 복잡하진않아 1개만 생성하면되어서 도커 컴포즈 문법이 짧습니다.
도커 컴포즈의 코드는 다음과 같습니다.
위와 같이 도커 컴포즈 코드를 입력하고, 도커 컴포즈 파일이 있는 디렉토리에서 docker-compose up 명령어를 실행하면 도커 컴포즈의 코드에 기반하여 도커 컨테이너들을 한꺼번에 생성합니다.
docker-compose up 문법은 아래와 같습니다.
docker-compose up -d (-d는 백그라운드실행 옵션임)
위와 같이 도커 컴포즈 파일이 있는 디렉토리에서 docker-compose up을 하면 도커에서 도커 컴포즈 코드를 보고 자동으로 도커 컨테이너들을 실행합니다.
이런식으로 docker를 활용하여 ec2에 스프링을 배포하는 작업을 진행 할 수 있습니다.
'클라우드' 카테고리의 다른 글
SSH, SCP 명령어 정리 (0) | 2024.03.02 |
---|---|
다중 EC2 CI/CD구현 (Feat.도커 활용) (2) | 2023.12.30 |
로드밸런서를 활용한 Scale-Out (수평확장) (0) | 2023.12.28 |
EC2 도메인 연결 및 HTTPS 적용하기 (2) | 2023.12.27 |
AWS RDS (Feat. 스프링 연결) (0) | 2023.12.26 |
- Total
- Today
- Yesterday
- sql
- 데이터베이스
- 서버
- 메세지큐
- 인공지능
- 쿼리
- 배포
- 깃
- 소프트웨어공학
- 깃허브
- 컴퓨터구조
- 네트워크
- 도커
- 파인튜닝
- 컨테이너
- 테이블
- nat
- 웹소켓
- 문법
- 스프링
- 자동화
- 포트포워딩
- 데이터
- 보안
- JPA
- 클라우드
- IP주소
- DB
- 프로토콜
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |