본문 바로가기

개발/vuejs

docker + vue + nginx 셋팅 및 배포

저희 회사는 원래 아래와 같이 사용하고 있었습니다.

 

하지만 2개의 사이드 프로젝트가 진행 되면서  하나의 서버에 3개 proejct가 올려야 하는 상황이 되었습니다. 

 

그래서 아래와 같이 docker를 사용하여 구성을 변경하게 되었습니다 . 

 

 

기존에는 방식과 차이점은

 

기존 방식 

1. vue build 해서 dist 파일 생성

2. 웹서버에 dist 파일 업로드

 

변경 후 방식

1. vue 를 dockerize 한 후 docker server 에 push

2. 웹서버에서 도커 실행 

 

이렇게 변경 되었습니다.

 

 

웹 서버는 nginx 를 사용했는데  SPA 앱들은 화면을 새로고침 할 때  해당 페이지를 못찾는 문제가 발생하더라고요. 이문제를 해결하기 위해서 여러가지방법 중 가장 설정이 간단한 nginx 를 사용하였습니다. 

nginx default.conf 중 location /  부분을 아래오 같이 변경해주면 됩니다

try_files 부분을 변경해주는것인데  요청한 uri 부분이 nginx 에서 설정한 root 폴더 내에 없는경우 index.html 보여주도록하는 부분입니다. 이부분은 다음에 한번 자세하게 공부해봐야할것같아요 

 

다시 본론으로 돌아와서  제 vue proejct 1번은 는 아래와같은 디렉토리 구조로 되어있습니다.

 

일부로 nginx 라는 폴더를 만들고 해당 폴더에 위에서 설명한  default.conf 파일을 넣어두엇습니다.,

 

아래는 Dockerfile 내용입니다. 이 파일의 내역서에따라 도커 이미지가 생성됩니다

 

도커 이미지 생성 명령어는  ( 각 dockerfile이있는 경로로 이동해서 진행해야함 )

>docker build -f Dockerfile -t xxxxxxxxxx:5000/project1:latest .

>docker build -f Dockerfile -t xxxxxxxxxx:5000/project2:latest .

>docker build -f Dockerfile -t xxxxxxxxxx:5000/project3:latest .

 

아래 내용을   간단하게 설명하자만

1. alpine에 nodejs를 설치하고 

2. app 디렉토리를 만듭니다

3. 그리고 package*.json 파일을 app으로 복사한후 

4. npm install 을 설치합니다

5. 그리구 dockerignore에서 등록한 리스트를 제외한 모든 파일을 /app으로 복사하고

6. vue 프로젝트를 build 합니다  => build 하면 dist 파일 생성됨

7. nginx 를 설치하고 

8. 기존의 default.conf 를 삭제한 후 

9.  /app 디렉토리에 옮겨둔 default.conf를   /etc/nignx/conf.d/default.conf 로 옮김

10. nginx 설치시 root경로 ( /usr/share/nginx/html/) 밑에 파일을 삭제하고 

11. 6 번에서 build 하여 생성된 dist 파일을 nginx root 경로로 이동시킴

 

 

이렇게 생성된 도커 이미지를 push 해주고 서버에서 실행만하면됩니다. 이런식으로 3개의 프로젝트를 docker image로 만들어면 됩니다

저는 project1 은 5001 , proejct2는 5002 , project3는 5003 포트로 연결하여 각 도커 이미지의 nginx 80 포트와 연결시켜줄 예정입니다 

 

ex)

docker run -d --name proejct1-p 5001:80 --restart always xxxxxxxxxx:5000/project1:latest

docker run -d --name proejct2-p 5002:80 --restart always xxxxxxxxxx:5000/project2:latest

docker run -d --name proejct3-p 5003:80 --restart always xxxxxxxxxx:5000/project3:latest

 

그리고 실제로 http://ip:5001 로 접근해보면 해당 프로젝트가 열리는 것을 알 수 있습니다 .