4 분 소요


🚨 시작하기 전에!! 완벽하지 않은 게시글입니다. 
개인 기록용이니 따라하실 분들은 다른 글을 참고하세요🥲

환경은 아래와 같다

  • AWS EC2 ubuntu 20.04
  • Spring Boot + JAVA 11

배포 방법에는 아래 두가지가 있다.

  1. jar 파일을 빌드하여 EC2 복사 후 실행
  2. 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

스크린샷 2022-07-21 오전 12 18 35

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

스크린샷 2022-07-21 오후 4 32 41
이런식으로 생성된다.

3) Docker Hub

Docker Hub
https://hub.docker.com/

레포지토리 생성

  1. 회원가입 및 로그인
  2. Repositories > Create Repository 로 들어가서 도커 레포지토리를 생성
  3. 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 .

만약 이런 오류가 난다면??

스크린샷 2022-07-21 오후 1 22 29

.dockerignore

.dockerignore 파일에 volume 디렉터리를 추가한다.

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### volume ###
**/docker-data

스크린샷 2022-07-21 오후 1 26 20
이제 에러가 발생하지 않는다!

Docker Image Push

위에서 생성한 docker image 파일을 Docker Hub에 push를 해준다.

$ docker login
$ docker push ln8847/naem

스크린샷 2022-07-21 오후 1 29 02

스크린샷 2022-07-21 오후 1 32 00

푸시 전

스크린샷 2022-07-21 오후 1 31 19

푸시 후

스크린샷 2022-07-21 오후 1 33 03

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.



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기

태그: ,

카테고리:

업데이트: