일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 마이크로서비스디자인패턴
- Java 22
- DB
- Runtime Area
- pair programming
- 스프링으로하는마이크로서비스구축
- ATDD
- testdrivendevelopment
- G1GC
- 부모객체
- 자식객체
- Spring/JAVA 서적
- 트랜잭션 격리 수준
- 클린코드
- java
- 도커
- RESAPI
- 미니미프로젝트
- TDD
- docker
- M:N
- Self Descript Message
- GC
- Execution Engine
- 완벽이해
- Solid
- hateoas
- Be
- ComponentScan
- KPT
- Today
- Total
Programming Summary
[2023-05-22] Docker를 활용한 서버 이미지 빌드 및 AWS에 배포 본문
프론트엔드와 협력 작업을 위해 내가 만든 서버를 프론트엔드가 접근 가능하도록 해주어야 했다. 내가 생각해낸 해법은 두가지였다.
1) 포트포워딩을 통해 내 컴퓨터로 연결 가능하도록 만들기
2) 클라우드에 서버 올리기
1) 포트포워딩을 통해 내 컴퓨터로 연결하기
sk 공유기를 사용하고 있는 나는 192.168.45.1을 통해 sk 브로드밴드에 접속할 수 있었다.
초기 설정은 id : admin, pw: (Router MAC주소 뒷자리 6자리)_admin이었다.
이를 통해 접속한 후 내부 포트 8080, 외부 포트 8001번은 열어 주어 포트포워딩을 해주었다.
하지만 접속이 되지 않았다. 방화벽의 인바운드 규칙을 변경해주었고, 포트포워딩을 해주었는데도 접속이 되지 않았다. 이유는 IPTV 모뎀 때문이었다. 외부 포트로 접속하여도 모뎀에 걸려 내 서버까지 도달하지 않는 것이었다. 모뎀 역시 id: admin, pw: (모뎀 MAC주소 뒷자리 6자리)_admin이었지만, 모뎀의 MAC 주소를 찾아내지 못해(아마 라우터를 분해해야 나올 것 같다) AWS에 올리는 방안으로 진행하기로 하였다.
2) 클라우드에 서버 올리기
AWS에 가입하고 EC2 인스턴스를 활용하여 인스턴스를 받아 실행시켰다. 그러나 이번엔 SSH가 문제였다. 무슨 일인지 SSH Client를 통한 인스턴스 접근이 되지 않았다.
connect to host ec2-(ip):ap-northeast-2.compute.amazonaws.com port 22: Connection timed out
해당 오류가 지속적으로 발생하였고, -vvv를 통해 로그를 확인해보니,
debug3: Failed to open file:C:/Users/shinheeeul/.ssh/config error:2
debug3: Failed to open file:C:/ProgramData/ssh/ssh_config error:2
config 파일을 찾지 못한다는 것이었다. 결국 이 에러는 해결하지 못하고 인스턴스를 AWS에서 실행시킬 수 밖에 없었다.
SSH를 통해 원격 접근이 불가능해지기도 하였고, 이번 기회를 통해 docker를 활용하여 서버를 컨테이너화 시키고 이를 AWS에 보내기로 하였다.
지난번에 docker를 설치하기도 하였으니, intellij의 docker 플러그인을 활용하기로 하였다.
2-1) jar 파일 생성하기
gradle에서 Tasks/application/build의 bootJar를 통해 jar 파일을 생성해주었다. 해당 파일은 build/libs 파일에 생성이 되었다.
2-2) Dockerfile 생성하기
같은 위치에 Dockerfile을 생성해주었다.
FROM openjdk:17
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
그리고 Dockerfile에 다음과 같이 입력해주었다. spring에서 17버전의 jdk를 사용하고 있어 openjdk를 17버전으로 설정해주었다.
2-3) 이미지 파일 생성하기(빌드)
그리고 프로젝트 터미널 창을 해당 위치까지 옮겨준 후,
docker build -t [dockerhub ID/Repository Name] .
을 통해 프로젝트를 빌드해주었고, 이미지 파일을 생성하였다.
docker images
docker images를 통해 해당 docker가 제대로 추가된 것을 볼 수 있다.
docker run -p 8080:8080 [도커 허브 ID/이미지 이름]
위 명령어를 통해 이미지 파일을 실행해볼 수 있으나, 현재 내 프로젝트는 h2 DB가 연결되지 않은 상태로 에러가 발생한다. 이는 관해서는 밑에서 서술하기로 하고 해당 이미지 파일을 먼저 AWS 인스턴스로 보내주자.
2-4) 이미지 파일 push하기
docker push [dockerhub ID/Repository Name]
위 명령어를 통해 dockerhub에 만든 이미지 파일을 등록 시켜주었다. 이 과정에서 docker Desktop에 로그인 해주지 않으면 "denied : requested access to the resource is denied" 에러를 발생시키니 docker에 로그인 해주고 해당 아이디를 입력해주도록 하자.
2-5) 이미지 파일 pull하기
이후 amazon ec2로 돌아가
sudo yum install docker -y
docker를 ec2에 설치해주었다.
sudo service docker start
이후 도커를 실행해주고
sudo usermod -aG docker ec2-user
인스턴스가 실행되면 바로 docker를 사용할 수 있도록 등록해주었다.
docker pull [dockerhub ID/Repository Name]
그 후, 내가 push한 서버 이미지 파일을 pull을 통해 받아왔다.
sudo yum install java-17-amazon-corretto-devel.x86_64
이미지 파일을 실행시킨 jdk가 없다고 나오길래 인스턴스에서도 jdk 17버전을 설치해주었다.
2-6) docker-compose를 통해 h2와 spring boot 이미지파일 연결해주기
** 이전에 h2 이미지 파일을 설치해주고, JDBC URL과 연결을 해주어야 할 수도 있다.
sudo curl -L "https://github.com/docker/compose/releases/download/v2.18.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
다음 링크를 통해 먼저 docker-compose를 설치해준다.
최신 버전 확인 링크 : https://github.com/docker/compose/releases
sudo chmod +x /usr/local/bin/docker-compose
docker-compose 권한 설정해주고
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
심볼릭 링크를 설정해주었다.
docker-compose -v
위 명령어를 통해 docker-compose가 잘 설치되었는지 확인해주자.
vi docker-compose.yml
그 후 docker-compose.yml 파일을 만들어주고
version: "3"
services:
db:
container_name: h2
image: oscarfonts/h2:latest
ports:
- 1521:1521
- 8081:81
environment:
H2_OPTIONS: -ifNotExists
volumes:
- ./h2/:/opt/h2-data
restart: always
redis:
container_name: redis-local
image: redis:alpine
ports:
- 6379:6379
volumes:
- ./data/:/data
app:
container_name: test_app
image: [dockerhub id]/[repository name]
ports:
- 8080:8080
environment:
SPRING_DATASOURCE_URL: jdbc:h2:tcp://h2:1521/flash
SPRING_DATASOURCE_USERNAME: sa
SPRING_DATASOURCE_PASSWORD:
depends_on:
- db
- redis
다음과 같이 생성해주었다.
app은 컴퓨터에서 image 파일을 받아왔으니 build할 필요없이 image 파일을 넣어주었고 redis와 h2 db 이미지 파일을 다운 받아 해당 컨테이너들에 의존하도록 설정해주었다.
docker-compose up -d
이제 docker-compose의 up을 통해 실행시켜주고 -d를 사용하여 백그라운드에서 작동하도록 만들어주자.
이제 잘 작동되는지 확인해보자.
docker ps 명령어를 통해 해당 docker들이 전부 실행되는 것을 볼 수 있고
포스트맨과 public ip를 이용해서도 서버에 접근 가능한 모습을 확인할 수 있다.
해당 작업을 통해 docker를 활용하여 spring 프로젝트를 컨테이너화 시켜 이미지 파일을 제작하고 aws에 올리는 법을 배울 수 있었다. 후에 다른 프로젝트를 진행할 때도 지금 포스트를 참조해서 진행하도록 하자
다음 링크들을 참조하여 진행하였다.
Spring Boot + Docker : https://aodtns.tistory.com/115
h2 이미지 파일 다운 : https://velog.io/@seungju0000/docker%EC%99%80-h2-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0
h2 + Spring Boot + Docker : https://velog.io/@seungju0000/docker-compose%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-spring-boot-h2-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0feat.redis
Docker Compose 설치 : https://soyoung-new-challenge.tistory.com/73
'2022-23 Final Project' 카테고리의 다른 글
[2023-06-01] EC2에서 Jupyter 노트북에 websocket 서버 만들기 (0) | 2023.06.05 |
---|---|
[2023-04-02] Spring Security 적용 실패 (0) | 2023.04.02 |
[2023-04-02] ipynb파일과 spring java파일 소통하기 (0) | 2023.04.02 |
[2023-03-17] JPA Buddy 오류 해결 (0) | 2023.03.17 |
[2023-03-17] ModelAttribute npe 해결 (0) | 2023.03.17 |