[AWS] EC2, Docker 를 활용해서 Spring boot, My SQL 사용하기

강민승·2023년 10월 2일
0

AWS

목록 보기
1/1

EC2에 접속

먼저 Amazon EC2 인스턴스에 접속하기 위해 .pem 키 파일을 이용하여 SSH로 연결합니다.

$ ssh -i "path-to-your-pem-file.pem" ubuntu@your-ec2-ip-address

path-to-your-pem-file.pem: EC2 인스턴스를 생성할 때 다운로드한 PEM 키의 경로.
your-ec2-ip-address: EC2 Dashboard에서 확인할 수 있는 인스턴스의 IP 주소.
Docker 설치 및 설정

저장소 업데이트:

$ sudo apt update

필요한 패키지들 설치:

$ sudo apt install apt-transport-https ca-certificates curl software-properties-common

이 패키지들은 Docker를 설치하기 위해 필요한 패키지들입니다.

Docker의 공식 GPG 키를 추가:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

이 키는 Docker 패키지의 신뢰성을 확인하기 위해 사용됩니다.

Docker 저장소를 시스템에 추가:

$sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

Template

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

$(lsb_release -cs): 현재 Ubuntu 버전에 맞춰 저장소를 추가합니다.

Docker 설치:

$sudo apt update
$apt-cache policy docker-ce
$sudo apt install docker-ce
$sudo systemctl status docker

이제 Docker가 시스템에 설치되었습니다!

Docker를 이용한 MySQL 설정

권한문제

이 전에 만약 pull 할 때 Got permission denied issue in linux 오류가 난다면?

이런 경우 docker group에 해당 유저를 추가해주어야합니다. 내가 한 방법으로 알려드리겠습니다.

# 1. 보통은 docker group이 생겼을테지만, 만약 없으면 생성해준다.
$ sudo groupadd docker

# 2. docker group에 해당 유저를 추가
$ sudo usermod -aG docker $USER

# 3. 로그아웃 후 다시 로그인하거나 다음 명령어를 실행시켜야 적용이 된다.
$ newgrp docker

그럼 다시 pull을 받으면 된다.

MySQL 이미지를 Docker Hub에서 다운로드:

$ sudo docker pull mysql

# 또는 특정 버전을 원한다면:
$ sudo docker pull mysql:5.6

MySQL 컨테이너 실행:

$ sudo docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=`your-password` -d -p 3306:3306 mysql

여기서 your-password는 MySQL의 root 사용자 암호로 설정됩니다.

MySQL에 접속:

$ sudo docker exec -it mysql-container bash

$ mysql -u root -p
#-password 입력

암호를 입력하면 MySQL 프롬프트에 접속됩니다.
Spring Boot 애플리케이션 Dockerize

MySQL 연결:

mysql> create user test1@'%' identified by '1234';

mysql> grant all privileges on *.* to test1@'%';

mysql> flush privileges;

mysql> exit;

Spring boot

문제발생 상황 : 로컬에서 도커 이미지를 빌드했을때는 문제가 없었다 🧐
분명 로컬에서 생성한 도커 이미지를 실행시켰을 때는 정상적으로 실행되었습니다. 따라서 클라우드 서버에서도 pull 받은 도커 이미지를 빌드하고 실행시켰을 때 문제가 당연히 없을 것이라 생각했습니다.

그러나 docker run 을 했을때 아래와 같은 호환성 에러 메시지를 발견했고, 정상적으로 서버가 실헹되지 않았습니다.

WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested standard_init_linux.go:228: exec user process caused: exec format error

Docker Image의 빌드 호환성 문제 : linux amd64/v8, linux amd64
에러 메시지를 읽어보니 호환성 문제였습니다. 현재 제가 쓰고있는 맥북이 Apple M1칩인데, 도커가 해당 이미지를 빌드할때 생성된 빌드 플랫폼이 ec2서버와 m1 맥북간의 호환성이 안맞는 문제였습니다.

해결방법: 도커 이미지를 다시 build 하다
핵심부터 말씀드리자면 Docker Image 를 빌드할 때 아래 문장을 신경써서 플랫폼을 맞춰주면 됩니다.

--platform linux/amd64

로컬에서 빌드한 이미지가 linux/arm64/v8 이므로, 이를 linux/amd64 플랫폼 형태의 이미지로 새롭게 빌드해야 합니다.

docker build --platform linux/amd64 -t prac/prac .

위와 같이 로컬에서 다시 도커 이미지를 빌드해서, 클라우드 서버와 호환성을 맞춰주시면 돱니다. 즉, linux/amd64 로 빌드하고 클라우드 서버에 다시 run 시킨다면 문제없이 정상 실행됩니다.

또한 당연할 말이지만, 로컬에서 방금 호환성 문제를 해결하기 위해 만든 이미지를 run 시킨다면 정상 실행되지 않을겁니다. 클라우드 서버에 맞춰서 도커 이미지를 빌드한 것이기 때문에, 로컬의 m1 칩 환경에서는 실행되지 않는것이 정상입니다.

Docker file, root package에 둬야한다!

### dockerfile

FROM adoptopenjdk/openjdk11
LABEL authors="Min"
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Docker Hub에 로그인:

$ docker login -u your-dockerhub-username

자신의 Docker Hub 계정으로 로그인합니다.

Docker 이미지를 빌드:

# 기본 커맨드
# docker build -t [dockerHub ID]/[이미지명]:[태그명] [DockerFile위치]

# 태그 지정X 시 :latest 지정됨
$docker build -t [dockerHub ID]/[이미지명] .

your-dockerhub-id: Docker Hub의 사용자 이름
image-name: 원하는 이미지 이름
tag-name: 버전 또는 태그명 (예: latest)

# Docker Image 목록 확인
$docker images

# Docker Hub Push 
#docker push [DockerHub ID]/[image 파일명]

# Docker Pull + 컨테이너화(실행)

# 커맨드 기본 골조
# -p 8080:8080: 로컬 시스템의 8080 포트와 컨테이너의 8080 포트를 매핑합니다.
# docker run -d -p [로컬 port]:[도커 port] [dockerHub ID]/[이미지명]

$sudo docker run -d -p 8080:8080 a1rt/dockerPractice

# Docker 실행중인 컨터이너 확인
$sudo docker ps

# Docker 정지된 컨테이너 확인(실행중인것도 출력)
$sudo docker ps -a

# Docker Hub에 이미지 푸시:
$ docker push your-dockerhub-id/image-name:tag-name
profile
Step by Step goes a long way. 꾸준하게 성장하는 개발자 강민승입니다.

0개의 댓글