본문 바로가기
CI | CD

[AWS + Docker] EC2 환경에서 docker-compose 사용하기

by ♡˖GYURI˖♡ 2024. 7. 13.
728x90
EC2 환경에서 docker-compose.yml을 통해 Docker container들을 띄우고 싶었는데, 검색해보니 대부분 EC2 환경에서 Spring boot 프로젝트의 git repository를 clone한 후 실행시키는 방법을 사용하였다.
하지만 우리 팀은 보안상 아이디나 비밀번호가 들어간 docker-compose.yml과 같은 파일을 git repository에 올리지 않기로 결정하였다. 
그래서 고안한 방법이 'EC2 환경에 로컬의 docker-compose.yml 파일을 올리고, Docker Hub에 미리 올려둔 이미지를 활용해서 Docker container들을 띄우자!'였다.

 

 

 

Dockerfile

FROM openjdk:17-oracle

CMD ["./gradlew", "clean", "build"]

VOLUME /tmp

ARG JAR_FILE=build/libs/*.jar

COPY ${JAR_FILE} app.jar

EXPOSE 8080

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

 

 

 

docker-compose.yml

version: '3.8'

services:
  app:
    image: 도커허브아이디/auto_enter_view
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mariadb://db:3306/project
      SPRING_DATA_REDIS_HOST: redis
    depends_on:
      - db
      - redis
    restart: on-failure
    networks:
      - app-network

  db:
    image: mariadb:10.11.8
    ports:
      - "3306:3306"
    environment:
      MARIADB_ROOT_PASSWORD: 비밀번호
      MARIADB_DATABASE: DB명
    networks:
      - app-network

  redis:
    image: redis
    ports:
      - "6379:6379"
    networks:
      - app-network

networks:
  app-network:

 

주의 : Redis를 연결해주기 위해 environment에 'SPRING_DATA_REDIS_HOST: redis' 추가
추가해주지 않았을 경우 Redis 관련 에러들이 정말 여러가지로 생김...

 

 

 

1. Local에서 Dockerfile을 이용해 이미지 생성하기

docker build -t auto_enter_view .

 

 

2. Docker Hub에 이미지 푸시

로그인

docker login

 

Docker 이미지 태그 지정

docker image ls
docker tag auto_enter_view 도커허브아이디/auto_enter_view:latest

 

Docker 이미지 푸시

docker push 도커허브아이디/auto_enter_view:latest

 

 

3. EC2 인스턴스 실행

 

 

4. EC2 인스턴스에 SSH로 접속

chmod 400 AutoEnterViewKey.pem
ssh -i "AutoEnterViewKey.pem" ubuntu@ec2-XX-XXX-XXX-XX.ap-northeast-2.compute.amazonaws.com

 

 

5. bash 창에서 docker-compose 설치하기

설치 명령어

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

 

권한 변경

sudo chmod +x /usr/local/bin/docker-compose

 

설치 확인

docker-compose --version

 

설치 확인 시 아래와 같은 출력이 나오면 설치가 완료된 것이다.

docker-compose version 1.29.2, build 5becea4c

 

 

6. bash 창에서 Docker Hub 로그인

docker login

 

 

7. EC2 서버에 로컬의 docker-compose.yml 파일 올리기

scp -i 키페어.pem ~/파일경로/.../docker-compose.yml ubuntu@IP:~/받을서버경로

 

 

 

8. bash 창에서 docker-compose up

docker-compose up

 

 

 

트러블 슈팅 - MariaDB 관련

ERROR: for ubuntu_db_1  Cannot start service db: driver failed programming external connectivity 
on endpoint ubuntu_db_1 (d45663c3f5bb275686694e3a5cd1de5ad3ecf2b8bbbd4e75871a4c8c3620d00e): failed 
to bind port 0.0.0.0:3306/tcp:

 

3306 포트가 이미 사용 중이라는 에러로 추정된다.

생각해보니 이전에 실습하면서 EC2 서버에 MariaDB가 자동으로 실행되도록 설정해두어서 생기는 에러같다.

 

 

해결 방법 첫번째

1. 포트를 사용 중인 프로세스 확인

sudo lsof -i :3306

 

2. 해당 프로세스 종료

sudo kill -9 <PID>

 

이렇게 해두면 일단은 돌아가지만 다시 서버를 띄우면 자동으로 MariaDB가 돌아갈 것이라는 문제점이 남는다.

 

 

해결 방법 두번째

1. MariaDB 서비스 중지

sudo systemctl stop mariadb

 

2. MariaDB 서비스 중지 확인

sudo systemctl status mariadb

 

3. MariaDB 서비스 자동 시작 비활성화

sudo systemctl disable mariadb

 

4. 변경 사항 확인

sudo systemctl is-enabled mariadb

 

 

 

추가 : Docker 컨테이너로 띄운 MariaDB 내의 데이터 확인하기!

1. MariaDB 컨테이너 접속

docker exec -it 마리아디비컨테이너명 bash

 

컨테이너명은 'docker ps'라는 명령어로 확인할 수 있다.

 

2. MariaDB 클라이언트 실행

mysql -u root -p

 

3. 데이터베이스 확인