오늘은 Docker를 이용해서,

NodeJS, NGINX를 설치하고 서버를 실행하는 방법을 정리해 보도록 하겠습니다.

이 글에서는 NGINX나 Docker의 기초에 대해서는 다루지 않고 있는데요.

Docker에 관한 글은 아래 글을 참조해 주시구요.

>> Docker와 DockerHub를 이용한 배포 와 실행 # NodeJS Dockerfile

 

NGINX에 관한 글은 아래 글을 참조해 주세요.

>> NGINX에 대한 정리 #Upstream #Reverse Proxy #Proxy_pass

 

1. Docker Compose

이 글에서는, NodeJS컨테이너를 실행한 후에,  NGINX컨테이너를 실행해 보려고 하는데요.

만약 NodeJS컨테이너 실행을 한 후에, NGINX컨테이너를 실행을 한다고 생각해 보겠습니다.

일일히 터미널에서 컨테이너를 실행하는 커맨드를 적고,

포트를 매핑하는 일들을 해 주어야 할 텐데요.

이것들을 정해진 순서에 맞추어 한번에 진행할 수 있도록 해주는 툴이 바로 Docker Compose 입니다.

쉽게 생각해서 여러개의 Docker Container를 실행시키는 툴인것 이지요.

 

Docker Compose는 YAML파일을 이용하는데요.

이것이 무엇인지 간단히 보고 가도록 하겠습니다.

 

2. yaml 파일

YAML은 Ain't Markup Language를 줄여놓은 것 인데요.

마크업 언어가 아니라는 뜻 입니다.

공식페이지의 설명에도, 인간 친화적인 data serialization표준이라고 나와있네요.

 

아무래도 같은 serialization을 해주는 json과 비교해 보면 쉽게 이해할 수 있을 것 같습니다.

같은 정보를 전달하는데 훨씬 보기도 편하고 좋네요.

yaml파일은 시작할 때, "---"으로 시작하다는 것이 특징이구요.

아래 이미지에서 볼 수 있는 것처럼, 주석 사용도 가능합니다.

array는 "-" 으로 표현해주고, null값은 아무것도 적어주지 않는 것도 특징입니다.

같은 json파일에 비해서, 훨씬 가독성이 높아서, 인간 친화적이라고 하는 말이 맞는 것 같습니다.

 

 

 

아직 잘 감이 오지 않으시면, 웹에서 json to yaml을 검색하시면,

변환해주는 많은 사이트가 있으므로 이를 활용하시면 감을 잡는데 도움이 많이 되실 것 같습니다.

 

3. Docker Compose 설치

Mac이나 Windows버전의 Docker 앱을 설치하셨다면,

Docker Compose는 이미 설치가 되어 있어서 걱정을 할 필요가 없습니다.

다만, Linux의 경우는 아래와 같이, 바이너리를 다운받아서, 설치를 해 주어야 합니다.

 

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

 

그 다음으로 binary에 실행권한을 아래와 같이 주어야 하구요.

sudo chmod +x /usr/local/bin/docker-compose

 

다 되었으면, 아래 명령어로 정상적으로 설치된 것을 확인해 줍니다.

docker-compose --version

 

아래와 같이 설치된 것을 확인할 수 있습니다.

 

 

4. Docker Compose 사용하는 방법

Docker Compose를 작성하는 방법에 대해서 간단히 알아보면 다음과 같은 과정을 거치게 되는데요.

A. 각 앱들의 Docker file작성

각 앱들의 Docker file을 먼저 다 작성해서 가지고 있어야 합니다.

 

B. docker-compose.yaml 작성

컨테이너들을 이미지로 빌드해서 실행할 수 있도록 작성해 줍니다.

어떤 포트를 매칭 시킬 것인지 등도 이전에는 Dockerfile에서 작성했다면,

이제는 이런 것들도, docker-compose에서 한번에 할 수 있습니다.

 

C. docker-compose up 실행

docker-compose up명령어를 실행해서, 모든 앱들이 yaml에 정의된대로 docker에서 실행되도록 합니다.

 

그럼 하나씩 보도록 하겠습니다.

먼저 각앱들의 Docker파일을 만들어 보도록 하지요.

 

5. NGINX Docker파일 만들고 Build하기

5-1. nginx.conf 파일 생성

nginx.conf는 아래와 같이 간단하게 proxy 서버를 생성해 주었습니다.

중요한 것은 upstream의 server에 반드시,

docker-compose에서 사용하는 컨테이너 이름이 들어가야 한다는 사실입니다.

나중에 container이름을 docker-compose파일에서 설정할 때,

이 부분도 맞추어서 수정해 주어야 합니다.

 

 

5-2. NGINX Dockerfile 작성

참고로 COPY디렉토리는 nginx의 설치 방법에 따라서 달라질 수 있는데요.

일반적으로 많이 사용하는 apt-get을 이용할 경우 /etc/nginx 디렉토리에 설치되므로,

아래와 같이 해 주었습니다.

마지막 줄에서, nginx를 실행할 때, daemon off옵션을 붙여서 foreground에서 실행될 수 있도록 해 줍니다.

docker위에서 컨테이너 안의 서버가 실행되게 하도록 하게 위해 필요한 옵션입니다.

 

 

 

5-3. Docker Image Build

이제 아래 명령어로 Docker image를 빌드해 줍니다.

docker build -t nginxtest:sun .

 

5.  NodeJS Dockerfile생성과 ImageBuild

위에서 했던 것가 비슷하게, nodejs의 Dockerfile을 만들어 줍니다.

이 부분은 아래 글에서 했던 Dockerfile생성 과정과 Dockerhub를 이용한 이미지빌드를 비슷하게 사용하므로, 아래 글을 참조해 주세요.

>> Docker와 DockerHub를 사용해 배포하는 방법에 대해서 정리해 봅니다 #NodeJS

 

다만 왜, 위에서는 이미지를 직접 build하고 NodeJS는 Docker-hub를 사용하느냐는 의문이 드실 텐데요.

이유는 Dockerhub가 무료계정에서는 private한 repository를 하나만 제공해주고 있기 때문입니다.

여유가 되시는 분은 둘다 github계정과 연동된 docker-hub에 올려서,

Docker-hub에서 빌드받은 이미지를 사용하는 것이 훨씬 효율적 일 것 같습니다.

6. Docker-compose 만들기

이제 드디어 docker-compose를 만들어 줍니다.

여기서는 yaml을 사용하는데요.

다만 위에서 정리한 yaml과는 다르게, 첫줄에 "---"를 붙여주지는 않습니다.

 

먼저 전체 docker-compose.yaml을 보고 하나씩 정리해 보도록 하겠습니다.

 

 

6-1. version

파일에서 볼 수 있듯이, 첫줄에서 버전을 적어 주도록 하였는데요.

이것은 커스텀하게 임으로 적는 저희 문서의 버전이 아니라,

마치 html에서 http의 버전을 적는것처럼, docker-compose의 버전을 적는 것 입니다.

현재는 Version 3이 가장 최신 버전입니다.

version: '3'

 

버전과 관련해서는 아래 공식문서를 참조할 수 있습니다.

>> https://docs.docker.com/compose/compose-file/compose-versioning/

 

6-2. services

여기가 바로 실행하고자 하는 각각의 컨테이너들을 적는 곳 인데요.

여기서 services는 컨테이너들을 가르킵니다.

위에서는 nodejs와 nginx라고 정의한 컨테이너를 두개 사용하였습니다.

 

6-3. container_name과 image

말그대로 container_name과 image이름을 정의하는 곳 입니다.

container_name은 custom한 컨테이너 이름을 사용하기 위해서 사용하구요.

image에는 docker image의 이름과 태그를 적어주면 됩니다.

nginx:
    container_name: nginx
    image: "nginxtest:sun"

주의할 점은, container_name옵션은 swarm mode에서는 무시되어 진다고 합니다.

전 않쓰지만 혹시 swarm을 쓰시면 이 옵션을 사용함에 있어서 주의가 필요하다고 하는군요.

 

6-4. ports

docker run 명령어를 사용할 때 "-p" 옵션을 사용하여서,

inbound port와 컨테이너의 port를 매칭시켜주었었는데요.

여기서 그것을 해주면 됩니다.

다만 특이한 점은, yaml의 array형태로 value를 넣어주기 때문에,

앞에 "-"을 붙여준다는 사실입니다.

 

nginx:
    container_name: nginx
    image: "nginxtest:sun"
    ports:
      - "80:80"

 

 

7. Docker-compose 명령어

이제 Docker-compose의 명령어를 통해 실행을 할 수 있는데요.

먼저 이미지를 빌드하고 실행하는 명령어부터 알아보겠습니다.

 

7-1. up

up명령어로 docker-compose.yaml 에 정의된대로 docker-compose를 실행시킬 수 있는데요.

"-d" 옵션을 넣어주면, docker run -d로 실행했던 것처럼,  서비스를 백그라운드에서 실행시킬 수 있습니다.

docker-compose up

 

모든 것이 정상적으로 설정되었다면,

"docker-compose up -d"로 백그라운드로 실행시킨 후에,

"curl localhost -I"로 response를 정상적으로 볼 수 있겠습니다.

 

7-2. start & stop

이미 컨테이너가 생성되었을 때 사용하면 되는데요.

시작할 때는 start, 멈출때는 stop을 해 주면 됩니다.

 

7-3. down

컨테이너와 network등을 제거합니다.

이글에서 다루지는 않았지만, volume을 정의해서,

디렉토리에 데이터를 따로 mount하였을 경우,

"--volume" 을 추가해서 볼륨까지 삭제하도록 할 수 있습니다.

docker-compose down

 

7-4. logs

docker-compose의 로그를 볼 수 있습니다.

뒤에 인자로 서비스명을 추가하면, 해당 서비스에 대한 로그를 볼 수 있습니다.

docker-compose logs

 

8. Docker-compose 사용관련 팁

docker-compose의 yaml파일 작성시 공식 레퍼런스 링크는 아래와 같습니다.

>> https://docs.docker.com/compose/compose-file/

 

docker-compose의 기본적인 부분들을 이용하여,

NodeJS와 NGINX의 두개의 컨테이너를 생성하게 하도록 해 보았는데요.

추후 더 좋은 내용들에 대해서는 이 글을 통해 업데이트 하도록 하겠습니다.

 

728x90

+ Recent posts