| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 페이징
- @ComponentScan
- 컨테이너
- redis
- dockerhub
- JdbcTemplate
- Routing Key
- JPQL
- MSA
- 서블릿 컨테이너
- Spring Container
- 쿠버네티스
- Spring Data JPA
- 스프링 부트
- Spring
- AWS
- kafka
- DI
- docker compose
- @Transactional
- Dead Letter Queue
- Web
- DLQ
- docker
- JPA
- JWT
- 지연 로딩
- CORS
- mybatis
- securitycontextholderfilter
- Today
- Total
look-forest
AWS EC2에서 Docker를 활용해 배포해보기 본문
1. Ubuntu에서 Docker, Docker Compose 설치하기
EC2에서 Docker Compose를 활용하기 위해선, 먼저 Docker와 Docker Compose를 설치해야 한다.
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 버전 확인
$ docker compose version # Docker Compose 버전 확인
2. AWS ECR(Elastic Container Registry) 활용하기
AWS ECR 이란?
이미지를 저장 및 다운받을 수 있는 저장소 역할하는 것은 Dockerhub 뿐 아니라, AWS ECR도 있다.
AWS ECR을 사용하면 다른 AWS Resource와의 연동이 편하고, AWS 내에서 한 번에 관리할 수 있기에 편하다는 장점이 있다.
AWS ECR을 왜 배우는가?
훨씬 간단하게 프로젝트를 배포하고 실행시키기 위해서이다.

Docker를 사용하지 않았는 위 방식은 프로젝트 코드 전체를 EC2로 이동시켜야 하며, 프로젝트 코드를 실행시킬 런타임 환경(Node, JDK 등)도 설치되어 있어야만 실행이 된다.

Docker의 가장 큰 장점은 이식성이다. Docker만 깔려있으면 어디에서든 내가 원하는 프로젝트를 실행시킬 수 있다는 게 장점이다. 프로젝트에서 필요한 코드에 대해서만 Docker 이미지로 빌드해, EC2에서는 그 이미지만 다운받아서 실행시키는 게 훨씬 심플하다.
[실습] AWS ECR(Elastic Container Registry) 사용해보기
1. AWS CLI 설치
로컬 PC와 EC2에 각각 설치한다.
2. IAM 생성하기
1) IAM에서 사용자 생성하기
권한 설정 시, 직접 정책 연결> AmazonEC2ContainerRegistryFullAccess 권한 부여.
2) Access Key 발급받기
3) AWS CLI로 액세스 키 등록하
3. AWS ECR(Elastic Container Registry) 셋팅하기
Docker 이미지를 저장할 수 있는 저장소를 만든다.(프라이빗)
일반적으로 하나의 리포지토리에는 한 종류의 이미지만 저장하고 관리한다.
4. 이미지 빌드해서 AWS ECR에 Push, Pull 해보기
1) Dockerfile 작성하기
FROM openjdk:21-jdk
COPY build/libs/*SNAPSHOT.jar app.jar
EXPOSE 80
ENTRYPOINT ["java", "-jar", "/app.jar"]
CMD ["--spring.profiles.active=dev"]
2) 이미지 빌드 및 push 하기
AWS ECR에 들어가서 ‘푸시 명령 보기’ 버튼을 누르면, 어떻게 이미지를 Push하면 되는 지 친절하게 설명이 나와있다.
3) EC2에서 이미지 Pull 받고 컨테이너 띄우기
$ docker image rm -f [Container ID] # 기존 갖고있던 이미지 지우기
$ docker pull 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server
$ docker image ls
$ docker run -d -p 8080:8080 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server
※ 서버 실행 시 오류 발생할 경우

이 에러의 원인은 CPU 아키텍처 환경이 다르다는 뜻이다. 조금 더 자세히 설명하자면, 이미지 빌드는 M1과 같은 ARM 기반의 환경에서 진행하고, 이미지 실행은 ARM 기반의 환경이 아닌 곳에서 할 때 위와 같은 에러가 발생한다.
# AWS EC2의 CPU 아키텍처 확인하는 방법
$ lscpu
위 에러를 해결하기 위해서는 이미지를 실행시키고자 하는 CPU 아키텍처에 맞춰서 이미지를 빌드해야 한다. 로컬 환경에서 아래와 같이 다시 빌드한 뒤 AWS ECR로 Push하자.
$ ./gradlew clean build
$ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com
$ docker build --platform linux/amd64 -t instagram-server .
$ docker tag instagram-server:latest 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest
$ docker push 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest
4. Docker Compose로 배포하기
Docker Compose의 장점 중 하나는 복잡한 명령어로 실행시키던 걸 간소화 시킬 수 있다는 점이 있다. 따라서 Docker CLI 말고 Docker Compose를 활용해서 배포해보자.
1) 폴더 만들기
2) AWS EC2에 compose.yml 만들기
services:
dev-capturecat-server:
image: 911634252644.dkr.ecr.ap-northeast-2.amazonaws.com/이미지
command: ["--spring.profiles.active=dev"]
volumes:
- type: bind
source: /etc/secrets
target: /etc/secrets
read_only: true
ports:
- 80:80
depends_on:
dev-capturecat-db:
condition: service_healthy
dev-capturecat-cache-server:
condition: service_healthy
dev-capturecat-db:
image: postgres
environment:
POSTGRES_DB: DB NAME
POSTGRES_USER: 아이디
POSTGRES_PASSWORD: 패스워드
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE:
volumes:
- /home/ubuntu/capturecat/database/docker-postgresql/postgresql_data:/var/lib/postgresql/data
ports:
- 5432:5432
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB} -h 127.0.0.1 -p 5432"]
interval: 5s
retries: 10
dev-capturecat-cache-server:
image: redis
ports:
- 6379:6379
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
retries: 10
3) 실행시켜보기
$ docker compose up --build -d
4) 새로운 기능이 업데이트된 경우, AWS EC2에 업데이트 된 내용 반영하기
$ docker compose pull # compose.yml에 작성된 이미지를 다운로드 또는 업데이트 할 때 사용
$ docker compose up --build -d
참고 자료 & 이미지 출처
비전공자도 이해할 수 있는 Docker 입문·실전
'Infra > Docker' 카테고리의 다른 글
| Docker Compose를 활용해 컨테이너 관리하기 (1) | 2025.08.15 |
|---|---|
| Dockerfile 활용해 이미지 직접 만들기 (0) | 2025.08.15 |
| 도커 볼륨을 활용해 데이터 유실 방지하기 (2) | 2025.08.15 |
| 현업에서 자주 사용하는 Docker CLI 익히기 (4) | 2025.08.15 |
| Docker 기본 개념 (3) | 2025.08.14 |