본문 바로가기

develop/server

[Docker] 폐쇄망에서 프로젝트 구축하기

목차

  1. 개요
  2. React(dist) 프로젝트 배포하기
  3. Spring boot 프로젝트 배포하기

개요

외부에서 작업된 프론트(react)와 백엔드(spring boot)를 내부망 pc에 배포 작업이 필요함.

 

상황

  • 로컬pc에서는 외부망과 내부망(폐쇄망) pc에 둘다 접근이 가능.
  • 내부망pc에 harbor(이미지 저장소), postgresql(DB), gitlab(코드 버전 관리 및 CICD) 등의 기존 설치된 프로그램 사용.
  • 외부망과 연결되면서 리눅스 사용을 위해 VM 설치.
  • 외부에서 작업된 최종 소스코드(react, spring boot)는 로컬pc로 전달받음.

 

환경

  • 로컬pc : 윈도우 10
  • 내부망pc(폐쇄망) : Rocky-8.7-x86_64-minimal.iso
  • VM : Rocky-8.7-x86_64-minimal.iso

 

배포 프로세스

  1. vmware 설치 및 리눅스 서버 구성, docker 설치로 환경 구성
  2. 로컬의 프론트(react) 폐쇄망 배포
    1. vm에서 이미지 저장소에 nginx 저장
    2. 폐쇄망에 nginx 이미지 저장
    3. 로컬pc에서 빌드 파일 생성 및 폐쇄망으로 이동
    4. 폐쇄망에서 빌드파일 nginx로 실행
  3. 로컬의 백엔드(spring) 폐쇄망 배포
    1. 로컬에서 빌드파일 생성 및 vm이동
    2. vm에서 빌드파일 도커 이미지화 및 이미지 저장소에 저장
    3. 폐쇄망에서 spring파일 실행

필요 프로그램 및 패키지 설치

VM, 도커 및 리눅스 설치

도커 등의 프로그램 사용시 cmd보다 리눅스 명령어가 익숙하기 때문에 VM 설치


React(dist) 프로젝트 배포하기

(1) vm에서 이미지 저장소에 nginx 저장

React를 위한 웹서버 구축을 위해 nginx가 필요합니다.

폐쇄망에서 nginx를 사용하기 위해 docker에서 제공하는 nginx 이미지가 필요하기 때문에 외부 접근이 가능한 vm에서 이미지를 이미지 저장소인 harbor에 저장시킵니다.

 

(1.1) nginx 이미지 받기

1.1.1. (vm) docker pull nginx
1.1.2. (vm) 다운로드 받은 docker image 확인

(1.2) 이미지 저장소에 nginx 이미지 올리기

 

개인 이미지 저장소는 폐쇄망 서버에 설치되어있는 harbor를 사용합니다.

다른 개인 저장소는 모르겠지만, harbor에 이미지를 제어하려면 push하려는 이미지 명을 ip:port/저장소 경로/이미지 이름으로 맞게 먼저 변경해야합니다.

예를 들어, nginx:1.29 이미지를 harbor의 nextti라는 프로젝트 경로에 올리려고 한다면, 10.10.5.66:444/nextti/nginx로 변경해주어야 합니다.

이미지 태그 변경 명령어는 docker tag [타겟 이미지 명:태그] [변경할 이름:태그] 입니다.

변경한 이미지를 그대로 push하면 이미지 명에 있는 ip와 경로를 따라 개인 저장소에 저장이 되게 됩니다.

1.2.1. (vm) docker login
1.2.2. (vm) docker tag명을 이미지 저장소에 맞게 수정
1.2.3. (vm) docker push
1.2.4. (vm) harbor에 저장된 이미지

(2) 폐쇄망에 nginx 이미지 저장

이미지 저장소에 저장시킨 nginx이미지를 폐쇄망에서 땡겨온 후, 도커를 통해 nginx 컨테이너를 생성해줍니다.

2.1.1. (폐쇄망) docker login

 

2.1.2. (폐쇄망) 이미지 저장소에서 docker pull
2.1.3. (폐쇄망) docker image 확인

(3) 로컬pc에서 React(dist) 빌드 파일 생성 및 폐쇄망으로 이동

(3.1) 빌드 파일 생성 및 폐쇄망으로 이동

React프로젝트의 루트 경로로 가서 yarn run build 명령어를 실행시 빌드 파일인 dist파일이 생성됩니다.

해당 파일을 바로 보내버리면 오래걸려서 zip파일로 변경해서 넘겨줍니다.

압축해제 관련 명령어는 여기를 참고하세요.

그런 다음 압축 해제시 dist파일이 가지고 있던 내부 파일들을 확인할 수 있습니다.

3.1.1. (로컬) 빌드 파일(dist)
3.1.2. (로컬) dist파일 압축
3.1.3. (폐쇄망) dist.zip 압축해제

(4) 폐쇄망에서 빌드파일 nginx로 실행

프론트의 실행 소스(dist)와 웹 서버 이미지(nginx) 준비가 모두 완료되었습니다.

nginx 이미지를 통해 컨테이너 생성을 수행합니다.

docker run -d -name mobile_react -p 23001:80 -v /data/dist:/usr/share/nginx/html 10.10.5.66:444/nextti/nginx
  • docker run
    새로운 컨테이너를 생성하는 명령어
  • -d
    컨테이너를 deatched모드로 실행하겠다는 명령어 옵션, 미사용시 컨테이너에서 빠져나올때 컨테이너가 중단됨
  • -name mobile_react2
    컨테이너 명 설정 명령어 옵션
  • -p 23001:80
    컨테이너 포워딩 명령어 옵션
    nginx의 기본 리스닝 port는 80. 외부에서 오는 23001 port 요청을 nginx에서는 80포트로 매핑시키겠다는 의미
  • -v /data/dist:/usr/share/nginx/html
    호스트 디렉터리 ↔ 컨테이너 디렉터리 마운트 명령어 옵션
    nginx의 기본 웹 루트(/usr/share/nginx/html)을 호스트의 dist폴더로 대체, nginx에게 요청시 dist안의 react 빌드 결과물이 실행
  • 10.10.5.66:444/nextti/nginx
    컨테이너 생성의 타겟 이미지 명

4.1. (폐쇄망) nginx와 dist 웹 서버 컨테이너 생성 및 결과
4.1. (로컬) 폐쇄망에서 배포된 react 화면


로컬의 백엔드(spring) 폐쇄망 배포

5. 로컬에서 빌드파일 생성 및 vm이동

(5.1) 빌드 파일(jar) 생성

api서브 모듈만 웹서버로 띄우면 되기 때문에 gradle 화면에서 api모듈만 bootJar를 통해 jar를 생성해줍니다.

5.1.1. (로컬) bootJar파일 빌드 버튼
5.1.2. (로컬) 생성된 jar파일

 

또는 프로젝트 루트 경로에서 빌드 명령어를 작성하는 방법도 있습니다.

5.1.3. (로컬) 수동 빌드 명령어

 

(5.2) jar파일 vm으로 이동

vm에서 도커 이미지화를 시켜주기 위해 로컬에서 생성한 jar파일을 vm으로 이동시켜줍니다.

scp [전송할 파일 경로 및 이름] [계정]@[타겟 ip]:[타겟 경로]

5.2.1. (로컬) jar파일 vm으로 이동 명령어
5.2.2. (vm) 이동된 jar파일

6. vm에서 빌드파일 도커 이미지화 및 이미지 저장소에 저장

(6.1) jar파일 도커 이미지화

소스 코드를 도커 파일로 변경하기 위해서는 Dockerfile이라는 파일을 이용합니다.

Dockerfile내부에는 jdk를 이용해서 api-0.0.1-SNAPSHOT.jar 파일을 dev환경으로 이미지를 만들겠다는 내용이 들어있습니다.

(vm) Dockerfile 내용

docker build -t [생성할 이미지 명]:[태그] . 명령어를 통해 Dockerfile을 실행하고 그 결과로 생성된 이미지를 확인할 수 있습니다.

-t 옵션은 빌드된 이미지에 이름과 태그 설정을 지원해주는 옵션입니다.

(명령어 맨 뒤에 . 을 추가하지 않으면 에러가 발생합니다.)

6.1.1. jar파일 도커 이미지화

 

(6.2) 이미지 이름 변경 및 이미지 저장소에 저장

vm에 생성된 jar 이미지를 이미지 저장소 형식에 맞게 docker tag [타겟 이미지 명] [변경할 이미지 명]을 사용해서 변경 후 이미지 저장소에 push합니다.

6.2.1. (vm) harbor 형식에 맞도록 이미지 명 변경
6.2.2. (vm) harbor로 이미지 push
6.2.3. (로컬) 이미지 저장 완료

7. 폐쇄망에서 spring파일 실행

(7.1) 이미지 저장소에서 이미지 받기

실행시키고자 하는 jar이미지를 이미지 저장소 형식에 맞도록 받아옵니다.

docker pull [ip:port]/[저장소 경로]/[이미지 명:태그]

7.1.1. (폐쇄망) jar이미지 받기

 

(7.2) jar이미지 컨테이너 실행

api서버(jar 이미지)의 준비가 모두 완료되었습니다.

 

만약 동일한 컨테이너 명으로 이미 실행되고 있다면 해당 컨테이너 명으로 컨테이너를 중지 및 삭제를 수행한 후 진행해 주세요.

컨테이너 중지 : docker stop [컨테이너 명]

컨테이너 삭제 : docker rm [컨테이너 삭제]

docker run -d --name mobile_framework_api -p 19090:19090 10.10.5.66:444/nextti/mobile_framework_api:0.2
  • docker run
    컨테이너 생성 및 실행 명령어
  • -d
    컨테이너를 deatched모드로 실행하겠다는 명령어 옵션, 미사용시 컨테이너에서 빠져나올때 컨테이너가 중단됨
  • --name mobile_framework_api
    컨테이너 명 설정 명령어
  • -p 19090:19090
    포트 포워딩 명령어 옵션
    api서버로 19090 포트로 요청이 올때 내부 19090포트로 요청을 매핑
  • 10.10.5.66:444/nextti/mobile_framework_api:0.2
    실행시킬 이미지 명

 

컨테이너의 로그와 웹 서비스와 api서버간의 통신으로 로그인까지 성공했습니다.

(폐쇄망) jar 컨테이너 로그
(로컬) 로그인으로 메인화면 접근 성공


참고

https://brownbears.tistory.com/161

 

[Linux] tar, gz, zip 압축 및 압축 해제

압축하기tar 압축$ tar -cvf [파일명.tar] [폴더명] # abc라는 폴더를 aaa.tar로 압축 예시 $ tar -cvf aaa.tar abctar.gz 압축$ tar -zcvf [파일명.tar.gz] [폴더명] # abc라는 폴더를 aaa.tar.gz로 압축 예시 $ tar -zcvf aaa.tar.

brownbears.tistory.com

http://brio-sw.tistory.com/46

 

ERROR: "docker buildx build" requires exactly 1 argument.

도커에서 이미지를 빌드 할려하니까 ERROR: "docker buildx build" requires exactly 1 argument. See 'docker buildx build --help'. Usage: docker buildx build [OPTIONS] PATH | URL | - Start a build 위와 같은 에러가 발생했다 docker build

brio-sw.tistory.com

https://hongl.tistory.com/117#google_vignette

 

Docker container 실행 - docker run (1)

지난 포스트의 다양한 도커 이미지 커맨드를 통해 이미지를 생성했으면 컨테이너를 생성할 수 있습니다. 도커 이미지는 docker에서 서버 기능을 작동시키기 위해 필요한 디렉토리 및 파일들로서

hongl.tistory.com

https://devconq.tistory.com/8#google_vignette

 

[springboot] 스프링부트 jar 빌드 & 서버에 배포 및 실행하기

오늘은 지난번에 스프링부트로 생성했던 프로젝트를 빌드해서 오라클클라우드 인스턴스에 만든 우분투 서버에 배포하고 실행해보자 내가 만든 프로젝트는 gradle을 이용한 프로젝트이고 빌드

devconq.tistory.com

build시 오류 참고

https://zoetechlog.tistory.com/170

 

[Gradle] 내부망(폐쇄망, 오프라인)에서 Springboot gradle 빌드

상황종종 오프라인 환경(==망분리, 폐쇄망, 내부망, 인트라넷)에서 gradle 프로젝트를 빌드해야 하는 경우가 있다.하지만 Dependency를 받아오지 못하여 빌드에 실패하면 어떻게 처리할 수 있을까?이

zoetechlog.tistory.com

https://im-codding.tistory.com/89#google_vignette

 

[ spring ] 최초 폐쇄망(내부망) 순수 gradle 환경 세팅

폐쇄망(offline network) 환경에서 Gradle을 사용하는 경우, 외부 인터넷 연결 없이도 Gradle 빌드할 수 있도록 설정이 필요하다. Gradle은 기본적으로 필요한 의존성 라이브러리를 인터넷에서 다운로드한

im-codding.tistory.com