AWS EC2에서 Docker로 배포 실습

0

TIL

목록 보기
191/195

Docker는 다른 환경으로 바뀌더라도 설치 및 실행이 쉬운 이식성 이라는 장점 때문에 배포에서도 많이 사용된다.


AWS에서 전에 만들었던 인스턴스에 연결해서 들어간다.

명령어를 이용해 Docker를 다운로드하고 잘 설치가 되었는지 명령어로 확인해본다.

sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker ubuntu && \
newgrp docker && \
sudo curl -L "https://github.com/docker/compose/releases/download/2.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker -v
docker compose version


Docker에서 이미지를 저장 및 다운로드받을 때 사용되는 DockerHub의 역할을
AWS에서도 동일하게 하는 녀석이 있는데 그것이 ECR이다.

왜 Dockerhub 말고 ECR을 사용하는거임?

ECR을 사용하면 다른 AWS Resource와의 연동이 편하고, AWS 내에서 한 번에 관리가 가능하다.
(DockerHub로 사용해도 문제 없다.)


AWS CLI 설치

우선 내 컴퓨터의 터미널에 cli를 설치하고

# x86_64일 경우(uname -m 쳐보면 알려줌)
arch -arm64 brew install awscli

EC2의 ubuntu에 아래 명령어들을 차례로 입력한다.

sudo apt install unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version # 잘 출력된다면 정상 설치된 상태


IAM 생성

ECR에 접근하기 위한 권한을 얻기 위해 AWS에 검색에서 IAM으로 들어간다.

좌측 탭 목록에 액세스 관리-사용자들어가서 사용자 생성을 누르고 사용자 이름을 설정한 뒤 다음

권한 설정에서
직접 정책 연결을 선택하고 AmazonEC2ContainerRegistryFullAccess 선택 후 다음

검토 및 생성은 별다른 설정 없이 사용자 생성을 누른다.

이제 만들어진 사용자를 선택해서 들어가서 보안 자격 증명탭을 누르면 아래에 액세스 키에서 액세스 키 만들기로 들어간다.

AWS 외부에서 실행되는 애플리케이션 선택, 다음, 액세스 키 만들기로 완료하면

발급된 액세스 키비밀 액세스 키를 노출되지 않도록 잘 저장해둔다.


터미널과 EC2 둘 모두

aws configure

입력하면 액세스 키, 비밀 액세스 키, 지역(ap-northeast-2)을 입력해주면 된다.


ECR 설정

들어가서 리포지토리 생성

리포지토리 이름을 설정해주는데
하나의 리포지토리에 하나의 이미지를 관리한다.

아래 생성버튼을 누르면 완료


직접 이미지를 저장하고 다운로드 받아보자

WebStorm으로 프로젝트를 열고 연습용 Dockerfile을 만든다.

FROM openjdk:17-jdk

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]

이제 push를 해야하는데 방법은 ECR에 나와있다.

리포지토리를 선택해서 들어가면 오른쪽 위에 푸시 명령 보기라는 버튼이 있다.

여기서 1번부터 4번까지 복사해서 터미널에 입력해준다.(ECR에 접근 권한 확인)(IAM key를 발급받았기 때문에 가능하다.)

ECR 이미지를 새로고침해보면

이처럼 방금 push한 이미지가 저장되어있다.


다운로드 해보기 위해 만들어준 이미지를 삭제하고

docker image rm ~

docker pull [URI]

입력하면 마찬가지로 다운로드 된다.


Spring Boot 프로젝트를 배포해보자

간단한 스프링부트 프로젝트를 만들고 실행한다.

// AppController

@RestController
public class AppController {
    @GetMapping("/")
    public String home() {
        return "Docker, World!";
    }
}
# Dockerfile

FROM openjdk:17-jdk

COPY build/libs/*SNAPSHOT.jar app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]

프로젝트를 간단하게 만들고

# 프로젝트를 빌드
./gradlew clean build

빌드 후 ECR 이미지의 push 명령어 4단계를 입력한다.

+ 이 때 주의할 점!!

내 노트북 환경은 m1이고, EC2는 아니므로 두 컴퓨터는 CPU 아키텍처 환경이 다른 상태이다.
그러므로 두번 째 명령어인
docker build -t my-web-server .
를 수정해서 작성해야 한다.
docker build --platform linux/amd64 -t my-web-server .

이미지를 새로고침해보면

잘 올라와져있다.

이제 인스턴스에 이미지를 pull 받아야되므로 EC2에서 아까와 마찬가지로

push했을 때 사용했던 1번 명령어로 로그인작업을 해주고

이미지를 ECR에서 가져온다음

docker image pull [URI]

컨테이너를 실행시켜준다.

docker run -d -p 8080:8080 622896211203.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-server


Docker Compose로 배포하기

EC2에 compose.yml 파일을 만들 경로와 파일을 생성해준다.

mkdir my-server
vi compose.yml

(위에 파일 내용을 입력하고 esc를 누른 후 :wq를 입력하면 저장 후 파일 편집이 종료된다.)

docker compose up -d --build


프로젝트에 수정사항이 있다면 이미지 Push부터 다시 진행한 후

docker compose pull

해서 docker compose에 있는 이미지들을 최신으로 업데이트 시켜주고 다시 run 시킨다.

0개의 댓글