Programming/Docker

docker compose를 이용해서 한 번에 서버 구축하기 (1) Nuxt.js

stein 2021. 9. 8. 13:26

 docker는 linux의 컨테이너를 만들고 사용할 수 있도록 하는 컨테이너화 기술이다. 각각의 컨테이너는 기본 환경위에 개별 환경을 구축할 수 있다(이해가 힘들다면 가상머신을 생각해도 큰 무리는 없다. 하지만 두 개는 분명히 다르다! https://www.redhat.com/ko/topics/containers/whats-a-linux-container). 따라서 docker를 이용해서 환경을 구축한다면, 사용 환경에 상관없이 늘 동일한 기능을 하는 서비스를 기동할 수 있다.

 이러한 장점을 이용해서 최종적으로. [git clone]과  [docker-compose up] 2가지 명령어만으로 https 인증까지 완료되는 Nginx-[Nuxtjs, Django-PostgreSQL] docker를 만들어보자. 

 

(※주의! 본 게시글은 필자의 삽질과정이 모두 기록되어 있습니다. 본 시리즈의 앞 부분은 눈으로 흐름만 읽으시고, 코드는 후반 게시글을 참고하시기 바랍니다.)


Nuxt.js

우선 백엔드 서비스에 비해 독립적인 Nuxt.js를 docker로 만들어 보기로 했고, 아래의 포스트를 발견했다.

nuxt.js docker를 만드는 포스트: https://velog.io/@evanjin/Nuxt-docker-image%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0-iqjrrx8zx6

 

Nuxt docker image로 만들기

이번에는 nuxt를 도커 이미지를 만들어서 다음 프로젝트에서 사용하는 기본 뼈대가 되거나 aws 등의 클라우드에 도커 이미지를 올리는 등에 쓰일 수 있도록 이미지를 만들어 보도록 하겠습니다.

velog.io

포스트를 그대로 따라가면 아주 정상적으로 작동한다. 하지만 도커 환경이 사라지면 npm install한 내역이 모두 날아가고, 작업 폴더가 docker 컨테이너 내부에 갇혀있어서 내가 원하는 상황과 다르다고 판단했다. 아래는 필자가 생각한 사항들이다.

 

※ docker-compose란? docker 이미지를 build 하거나 run 할 때, command 창에 입력해야 하는 것을 docker-compose.yml로 미리 만들어 둘 수 있는 툴(결국 docker만을 사용할 때와 기능적인 차이는 없다. 편의성의 차이다.). 다중 컨테이너를 컨트롤 하기 위해서 사용한다. docker-compose는 따로 찾아보시길!

 

  1. docker file만을 이용해서 환경을 구축하는 것은 너무 무겁다(실 배포가 아닌 이상)
  2. nuxt의 경우는 사실상 node환경과 해당 git만 가지고 있으면 npm을 통해서 전부 설치가 가능하다.
  3. 따라서 외부에 git으로 clone후 directory 구조를 고정한 뒤, docker-compose 파일로 나머지 세팅을 잡는 방향으로 진행
  4. compose에는 volume, ports, envirionment, command을 설정한다
  5. 힘들었던 사항들
    1. [environment: HOST=0.0.0.0으로 localhost→0.0.0.0으로 변경된다. package.json으로 안해도 된다니..! 애초에 node가 환경변수를 확인하는 코드가 있는 걸로 추정된다.
    2. command는 '-'으로 각각 치는 방식이 아니라, bash를 실행해서 명령어를 전달하는 식으로 사용해야한다. (-c 는 어떤 옵션인지 아직 잘 모르겠다) https://stackoverflow.com/questions/30063907/using-docker-compose-how-to-execute-multiple-commands

 

        nuxt:
                image: node:14.17
                volumes:
                        - /home/ubuntu/경로:/home/경로
                        #ports:
                        # - 8889:3000
                        #   expose:
                        # - 3000
                expose:
                        - 3000
                environment:
                        - HOST=0.0.0.0
                command: bash -c '
                        cd /home/경로
                        && npm i
                        && npm run start'

 

몰랐던 사항

  1. docker container는 내부에 프로세스가 돌지 않으면 그대로 끝나버린다.
    1. 따라서 tty: true옵션을 주면 attach 되면서 계속 붙어 있는듯. https://stackoverflow.com/questions/42593396/docker-compose-up-is-starting-the-container-and-immediately-stopping-them
    2. 나는 command에 bin/bash를 입력해서 살렸다(bin/bash없이 tty만 줘도 되는듯)