[EC2] 인스턴스에 spring boot + docker 배포 (미완성)
🚨 시작하기 전에!! 완벽하지 않은 게시글입니다.
개인 기록용이니 따라하실 분들은 다른 글을 참고하세요🥲
환경은 아래와 같다
- AWS EC2 ubuntu 20.04
- Spring Boot + JAVA 11
배포 방법에는 아래 두가지가 있다.
- jar 파일을 빌드하여 EC2 복사 후 실행
- EC2 에서 프로젝트 git clone 후 실행
이 글에서는 2번으로 진행한다.
ec2 인스턴스에 접속한 상태로 시작한다.
1.EC2 인스턴스에 설치
1) Git
기본적으로 설치되어있다면 생략해도 된다.
sudo apt update
sudo apt install git
2) Docker 관련
Docker
# 패키지 업데이트
sudo apt-get update -y
# 기존에 있던 도커 삭제
sudo apt-get remove docker docker-engine docker.io -y
# 도커 설치
sudo apt-get install docker.io -y
# docker 서비스 실행
sudo service docker start
# /var/run/docker.sock 파일의 권한을 666으로 변경하여 그룹 내 다른 사용자도 접근 가능하게 변경
sudo chmod 666 /var/run/docker.sock
# ubuntu 유저를 docker 그룹에 추가
sudo usermod -a -G docker ubuntu
Docker Compose
# 도커 컴포즈 설치
sudo curl \
-L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
# 실행 권한 적용
sudo chmod +x /usr/local/bin/docker-compose
sudo apt install docker-compose // 도커 컴포즈 설치
설치 확인
# 도커 버전 확인
docker version
# 도커 컴포즈 버전 확인
docker-compose version
2. git clone
으로 SpringBoot 프로젝트 가져오기
나는 develop 브랜치에서 가져올거기 때문에 아래 명령을 실행했다.
git clone -b [브랜치 이름] --single-branch [깃헙 주소]
예시: git clone -b develop --single-branch https://github.com/...
3. docker-compose를 통한 도커 이미지 생성
1) .env
생성
.env
등 .gitignore
에 등록해둔 환경변수 파일을 따로 생성해준다.
2) 빌드
docker-compose up --build
4. SpringBoot 빌드
1) 프로젝트 폴더로 이동
cd [프로젝트 폴더명]
2) JDK 설치
sudo apt-get install openjdk-11-jdk
3) Gradle 빌드
./gradlew build -x test //🌟 -x test: 테스트 실행 X
4) 생성된 .jar
파일 확인
cd build/libs
ll
======================================================================================================
도커컴포즈 말고 docker run
으로 컨테이너 생성…
4. Docker mysql, redis 설치
1) mysql container 생성
먼저, EC2 보안 그룹에 3306 포트를 추가해주어야한다!
$ docker pull mysql:8 // mysql 이미지 pull
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=[비밀번호] --name [컨테이너 이름] -v /docker-data/mysql:/var/lib/mysql mysql:8 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci // mysql 컨테이너 구동
// 나는 아래와 같이 입력했다 (예시)
// $ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=testpasswd --name mysql-db -v /docker-data/mysql:/var/lib/mysql mysql:8 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
$ sudo docker logs [컨테이너 이름] // 정상 구동 여부 확인
$ docker exec -it mysql-db /bin/bash
bash-4.4# mysql -u root -p // bash를 이용한 접속
$ docker inspect [container ID] // IPAddress 확인 (172.17.0.2)
$ sudo apt-get install mysql-client // mysql-client 설치
$ mysql -u root -p --host 172.17.0.2 --port 3306 // EC2에서 mysql 컨테이너 접속
/////// docker run --name mysql-db -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql:8 (일단 이거는 무시하고 위에껄로)
EC2 인스턴스에서 mysql에 접속한 뒤에 유저를 생성한 뒤 권한을 부여한다.
mysql> use mysql; // mysql db 사용
mysql> select host, user from user; // user 조회
mysql> create user 'mj'@'%' identified by '비밀번호'; // 계정 생성
mysql> GRANT ALL PRIVILEGES ON *.* TO 'mj'@'%'; // 권한 부여
mysql> flush privileges; // 메모리에 반영
mysql> show grants for 'mj'@'%'; // 권한 확인
생성한 유저로 접속하여 테이블을 생성한다.
$ docker exec -it mysql-db /bin/bash
bash-4.4# mysql -u mj -p
mysql> create database naem;
mysql> show databases;
2) redis container 생성
마찬가지로, EC2 보안 그룹에 6379 포트를 추가해주어야한다!
$ docker pull redis:alpine // redis 이미지 pull
$ docker network create redis-net // redis-cli도 구동하여 연결을 위해서 2개의 컨테이너를 실행하기 위해 docker network 구성
$ docker network ls // 네트워크 확인
$ docker run --name [컨테이너 이름] -p 6379:6379 --network [네트워크 이름] -v /docker-data/redis -d redis:alpine redis-server --appendonly yes // redis 컨테이너 구동
// 나는 아래와 같이 입력했다 (예시)
// $ docker run --name redis-db -p 6379:6379 --network redis-net -v /docker-data/redis -d redis:alpine redis-server --appendonly yes
$ sudo apt-get install redis-tools // redis-cli 설치
$ docker exec -it redis-db redis-cli // redis-cli를 통해 redis-db 접근
//////// $ docker run -it --network redis-net --rm redis:alpine redis-cli -h redis-db // redis-cli로 redis server에 접속 ( -rm 속성은 해당 컨테이너가 이미 있으면 삭제하고 실행)
//////// $ redis-cli -h [EC2 IP] -p 6379 -a password // 이거는 우선 아니고 위에꺼로 하기....
+) 알아두면 좋은 도커 명령어
$ docker ps -a // 컨테이너 확인
$ docker rm [컨테이너 ID] // 컨테이너 삭제
$ docker images // 이미지 확인
$ docker rmi [이미지 ID] // 이미지 삭제
5. Docker Hub 이용
1) Dockerfile
FROM openjdk:11
ARG JAR_FILE=build/libs/server-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
2) gradle 빌드
$ ./gradlew build -x test //🌟 -x test: 테스트 실행 X
이런식으로 생성된다.
3) Docker Hub
Docker Hub
https://hub.docker.com/
레포지토리 생성
- 회원가입 및 로그인
- Repositories > Create Repository 로 들어가서 도커 레포지토리를 생성
- Repository 이름과 Public으로 설정하고 Create 를 클릭
Docker Build -> 이미지 생성
// gradle
$ docker build --build-arg DEPENDENCY=build/dependency -t [도커허브 ID]/[Repository 이름] --platform linux/amd64 .
// 나는 아래와 같이 입력했다 (예시)
// $ docker build --build-arg DEPENDENCY=build/dependency -t ln8847/naem --platform linux/amd64 .
// maven
$ docker build -t [도커허브 ID]/[Repository 이름] --platform linux/amd64 .
만약 이런 오류가 난다면??
.dockerignore
.dockerignore
파일에 volume
디렉터리를 추가한다.
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### volume ###
**/docker-data
이제 에러가 발생하지 않는다!
Docker Image Push
위에서 생성한 docker image 파일을 Docker Hub에 push를 해준다.
$ docker login
$ docker push ln8847/naem
푸시 전
푸시 후
5. AWS EC2
AWS EC2 인스턴스를 생성하고, 도커를 설치한 후 애플리케이션을 배포해보도록 하자!
# 도커 설치
sudo yum install docker // 이거는 이미 함....
# 도커 실행
sudo systemctl start docker // 이것도 위에서 함....
# 도커 허브에 존재하는 이미지 파일 pull
$ sudo docker pull ln8847/naem
# 도커 이미지를 통해 스프링 부트 애플리케이션 배포
$ sudo docker run --name naem-application -p 8080:8080 ln8847/naem
Ref.
- https://velog.io/@haeny01/AWS-EC2-X-Docker-Spring-Boot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%98%AC%EB%A6%AC%EA%B8%B0
- https://wooogy-egg.tistory.com/55 - 도커 컴포즈 설치
- https://zzang9ha.tistory.com/360 - Spring Boot + Docker + AWS EC2 배포하기(MacOS M1)🌟
- https://fenderist.tistory.com/412 - redis
💛 개인 공부 기록용 블로그입니다. 👻