티스토리 뷰
이제 정말 마무리 단계입니다. 더 이상의 프로그램 고도화도 없고, 추후에 해당 어플리케이션을 참조해, 새로운 어플리케이션을 만들지 않는한, 코드는 Maintence( 보존 ) 상태로 둘려합니다. 그럼 왜 마무리 단계라는 말을 했냐면, 일단 기본적으로 Application 배포 과정은 어떻게 보면 제작 단계보다 더 복잡합니다. 여러가지를 신경써야 하죠. 일반적으로 가상화 라는 개념에는 두가지 방식이 있는데 OS Virtualization 과 Container Virtualization이 있습니다.
OS Virtualization 같은 경우 제가 아주 예전에 포스팅한 기억이 있는데, VMWare를 활용해서 Cent OS를 설치한 일이 있습니다. 이게 바로 OS 가상화에요. 해당 방식은 자유도는 높지만, 컴퓨터 안에 컴퓨터를 만드는 느낌이라 시스템 부하도 엄청났죠...
반대로 Contianer Virtualization은 쉽게 말하면 정말 내가 필요한 프로세스만 지정해서 최대한 Host OS가 가진 리소스를 적게사용하는 가상황입니다. 필요한 기능만 있으니 가볍고, 생성속도도 빠르다는게 장점이에요
그리고 Dokcer는 이런 Container Virtualization 에 특화되어 있습니다. 후에 실습할 내용이지만, Docker File이라는 Image를 사용해서 경량화된 Container를 기동 시킵니다. 그리고 OS를 일일히 만들 필요 없이 Docker File을 가지고 여러가지 서비스를 Container화 해서 기동시킬 수 있습니다.
근데 왜..? 이렇게 번거롭게 Container화를 시키는 걸까요?. 그 이유는 돈입니다. 물리적인 서버의 증설은 서비스가 증가함에 따라 필수적으로 따라 올텐데, 해당 비용은 서비스 증가에 따라서 천차만별입니다. 물론 돈이 넘쳐흐른다면, 컴퓨터대수를 늘릴 수 도 있겠지만, Container를 활용해서 효율적으로 비용은 줄이고 비슷한 효과를 낼 수 있다면, 굳이 비용이슈로 골머리를 앓는 것보다 훨씬 나은 대안이에요. 그렇기에 Docker는 하나의 필수적인 Container 도구가 된거에요.
요약
물리적인 서버( 하드웨어 : CPU,DISK,MEMORY 등)을 증설하기엔 비용적인 문제가 너무 많다. 그렇기에 Container를 통해 가상화를 구축해 비용적인 문제를 절감하고, 효율적인 구성을 만들기 위해 Docker를 사용한다.
! Windows Version입니다. Linux나 MacOS라면 다른 페이지로 접속해야합니다.
Windows가 아니라도 Docker 사용시 기본 활용법이 밑에 있으니 Docker 공부 시 활용해주세요!
해당 페이지 접속 후 설치를 진행해줍니다. 저는 모두 Default 설정으로 설치했습니다.
#Docker 로그인 & 환경설정 탭
먼저 도커 Desktop버젼 설치 후 실행한다면 다음과 같은 화면이 출력됩니다.
해당 화면에서 로그인 후 환경설정이 필요한 경우 환경설정을 해주시면 됩니다. 저는 Default값에서 건들지 않을게요.
후에 배포를 진행할때 Public상태로 HUB에 올릴예정이기에 미리 계정생성 후 로그인하시는 걸 추천드립니다.
#Docker Image 생성 및 Public Repository Upload
가장 첫번째로 Dockerfile을 생성하려 합니다.
Dockerfile은 반드시 Dockerfile이라는 이름으로 만들어야 합니다. 확장자도 없어야 합니다.
User-Service를 가장 먼저 Container화 할 예정이기에 해당 위치에 Dockerfile을 생성해줍니다. 해당 위치에 두는 이유는 Jar파일이 해당 프로젝트 내부에 있기 때문이에요.
#Jar file 생성
cmd 에서 다음과 같은 커맨드를 통해서 Build 할 수 있습니다.
// User-Service 폴더로 이동
// cd [userservice 프로젝트폴더]
cd D:/spring_cloud/userservice
// Jar File Compile
mvn clean compile package
이슈노트1
혹은 MVN이 설치가 되어 있지 않다면, Command 자체를 인식을 못하는 경우도 더러 있습니다.
제타 위키에 잘 정리된 글이 있어서 첨부합니다!
이슈노트2
Java Version 이 11이하면, Compile이 되지 않습니다. mvn -version을 통해서 Java Version을 확인해준 뒤, 11보다 낮은 버젼이라면, 설치 후 시스템 환경 변수에서 JAVA_HOME을 변경시켜줘야 정상적으로 업데이트가 됩니다. 업데이트 후 다시 Compile을 하면 정상적으로 동작하는 것을 볼 수 있습니다.
아마 그대로 Compile 시키면 Jar File의 이름이 너무 길어서 당황스러울 텐데, 다음과 같이 pom.xml을 수정을 해 File의 이름길이를 줄일 수 있습니다.
version부분을 1.0으로 바꿔주세요
<groupId>com.example</groupId>
<artifactId>userservice</artifactId>
<version>1.0</version>
<name>userservice</name>
#만약 위에 작업을 진행하지 않으셨다면 생성된 Jar 파일 이름 그대로 아래의 COPY의 경로를 수정해주세요.
COPY 같은 경우 COPY [원본 파일 위치] [복사할 파일 명] 이기 때문입니다.
#Dockerfile 생성
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY target/userservice-1.0.jar UserService.jar
ENTRYPOINT ["java","-jar","UserService.jar"]
위에 작성한 Docker File은 대략적으로 다음과 같은 명령어 입니다.
다음으로 cmd로 해당 Service 위치로 이동해주세요! 그리고 아래의 명령어를 실행!
--tag 뒤에오는 계정이름은 자신의 도커 HUB ID로 지정해주세요.
docker build --tag ggpark0315/user-service:1.0 .
정상적으로 생성되었을 경우 아래와 같이 파란색으로 도배가 됩니다.
만약 정상적으로 생성이 됐다면, docker image ls 를 통해서 생성된 이미지 파일을 확인 할 수 있습니다.
다음으로는 저희가 만든 IMAGE를 실제로 Public Respository 에 PUSH 할려고 합니다.
docker push ggpark0315/user-service:1.0
그럼 위와 같이 Pushed가 완료 되었다는 메시지가 출력됩니다.
만약 Docker 에 로그인이 안되어 있다면, 제대로 확인 할 수 없습니다. 다음과 같이 Login을 할 수 있습니다.
docker login -u [USERID]
Password: [Your Password]
그럼 아래와 같이 Hub에 Image File이 올라가 있는 것을 확인 할 수 있습니다.
다음으로는 Pull을 위해서 Image File을 삭제하려합니다.
docker rmi [생성한 이미지명]
//ex
docker rmi ggpark0315/user-service:1.0
자 이제 PULL을 통해서 해당 파일을 받아보려 합니다.
docker pull [Pull할 이미지 명]
docker pull ggpark0315/user-service:1.0
#Docker run
다음과 같은 커맨드를 입력해줍니다.
docker run ggpark0315/user-service:1.0
성공적으로 실행 시 다음과 같이 Spring Project가 구동 되는 것을 볼 수 있습니다. 그리고 정상적으로 Container가 등록되었는지 확인하기 위해서 docker ps -a 명령어를 입력해줍니다.
다음과 같이 이미지가 출력되시나요? 맨위에 Up으로 된 것만 참조해주세요 ... 나머지는 Container들은 전부 삽질의 부산물들 입니다. UP인 Container가 보인다면 성공입니다! 그리고 Names는 자동으로 지정되는 이름들 입니다.
마치며..
사실 이번 실습은 굉장히 많은 시행착오가 있었습니다. Jar File 생성부터 시작해서, Docker Run 에서 Mainfest 오류가 자꾸 발생하고, Class를 못찾는 문제부터 Dependency 오류까지, 정말 많은 에러가 발생했었습니다. 그래서 삽질도 쉬지않고 했던거 같네요..
아직 익숙치 않은 도구이기도 하고 cmd환경에서 Jar file을 제작하는 것도 미숙해, 어떻게 보면 당연한 결과였을지도 모르겠네요. 그래도 Docker File을 작성하고 Build Push Pull 그리고 Run 까지, 다양한 Docker의 활용방법을 알 수 있어서 좋았습니다.
감사합니다.
'웹 프로그래밍 > MSA 학개론' 카테고리의 다른 글
[MSA & Docker] RabbitMQ Docker환경에서 설치 (0) | 2022.05.09 |
---|---|
[MSA] 애플리케이션 배포 (0) | 2022.05.09 |
[MSA] Micrometer 구현 (0) | 2022.05.04 |
[MSA] Spring Cloud Sleuth + Zipkin 을 이용한 MS의 분산 추적 (0) | 2022.05.04 |
[MSA] Zipkin 개요 & 설치방법 (0) | 2022.05.03 |
- Total
- Today
- Yesterday
- Kafka Connect
- github
- MariaDB
- JWT
- config
- MSA
- 오늘저녁 삼겹살
- kafka
- zipkin
- 운동일기
- 미래의나에게동기부여
- Gateway
- Spring + ELK
- Feign
- Logstash to ElasticSearch
- 운동
- git
- producer
- ACTUATOR
- docker
- UserService
- 루틴기록
- Logstash 활용
- 빅-오
- springcloud
- elasticSearch
- LoadBalancer
- prometheus
- consumer
- rabbitmq
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |