Node.js and Docker 공부 기록

둥그냥·2020년 10월 22일
1

공부 기록

목록 보기
1/10

많이는 들어봤는데 정확히 뭔지는 잘 몰랐다. 이번 기회에 알아보았다.


Node.js란


자바스크립트 엔진 ‘V8’ 위에서 동작하는 이벤트 처리 I/O 프레임워크다.
서버 환경에서 자바스크립트로 애플리케이션을 작성할 수 있게 돕는다.
자바스크립트를 컴파일 해주는 엔진으로 빌드 된 「자바스크립트가 구동중인 환경」

즉 브라우저가 아닌 내 컴퓨터에서 자바스크립트를 사용할 수 있게 해주는 것

javascript는 브라우저에 내장되어 있는 언어이다.

Node.js 는 개발자가 javascript를 브라우저가 아닌 컴퓨터에서도 사용할 수 있도록 한 것이다.

만약 내 컴퓨터에 node.js가 깔려있고 
자바스크립트로 돌아가는 http-server도 설치가 되어있다면
터미널에서 http-server -p 8080 ./public 명령어를 통해 
웹서버를 실행할 수 있음 ( (내가 테스트한 프론트앤드 디렉토리에서) )

만약 node.js가 깔려있지 않으면 http-server 명령어는 당연하고 기본적인 자바스크립트 명령어조차 실행되지 않음


Docker 도커


docker hub

개발할 때 필요한 거의 모든 환경들을 ‘이미지’란 형태로 찾을 수 있음. 
node도 공식 이미지가 올라와 있음

도커의 이미지란?

리눅스 컴퓨터의 특정 상태를 캡쳐해서 박제해 놓은 것

즉 node 이미지란!

리눅스에 Node.js가 설치된 상태를 그대로 급속냉동해 클라우드에 올려놓은 것이다.

터미널에서 docker run -it node를 하면 실행을 위해 도커가 컴퓨터에서 node이미지를 찾는다. 없으면 도커허브에서 이미지를 다운받는다.

만약 오류가 뜨면 도커가 실행이 안된걸 수도 있다. 확인해보자..^^
(걍 도커데스크탑 실행시킴 됨)

명령어 해석

run

run 명령어는 컴퓨터에서 이미지를 찾고, 없으면 허브에서 다운받는다. 그리고 그 이미지를 내 컴퓨터에서 해동해서 컨테이너로 만든다.

이미지를 한 번 받으면 컨테이너는 몇 개든 만들어 낼 수 있다!

이미지는 컨테이너를 찍어내는 소모되지않는 틀/컨테이너 조립키트 라고 볼 수 있다.

-it

컨테이너를 연 다음 그 환경에서 CLI를 사용한단 뜻

그럼 자바스크립트 콘솔을 사용할 수 있게됨~!

(node 이미지는 깨어나자마자 바로 node명령어가 실행되도록 설계되어 있어서 바로 자바스크립트 콘솔 창이 뜬다)

도커-node로 자바스크립트에서 hello world 해봤다

Dockerfile

나만의 이미지를 만들기 위한 설계도
공식 이미지를 개조, 튜닝해서 이미지를 만듦!

frontend의 Dockerfile

# 이 버전의 node 이미지에 덧붙입니다!
FROM node:12.18.4

# 이미지 생성 과정에서 실행할 명령어
RUN npm install -g http-server

# (이미지 내에서) 명령어를 실행할 디렉토리 위치(생성)
WORKDIR /home/node/app

# 컨테이너 실행시 실행할 명령어
# 깨어나자 마자 서버 실행!!
CMD [“http-server”, “-p”, “8080”, “./public”]

# 이미지 생성 명령어 (현 파일과 같은 디렉토리에서)
# docker build -t {이미지명} .

# 컨테이너 생성 & 실행 명령어
# docker run --name {컨테이너명} -v $(pwd):/home/node/app -p 8080:8080 {이미지명}

이제 이미지 만들기!

docker build -t frontend-img .

frontend-img : 이미지명
. : Dockerfile로의 상대경로 (파일명이 Dockerfile이면 따로 명시할 필요가 없다)

docker images로 잘 생성됐는지 확인해볼 수 있다!

만든 이미지를 컨테이너로 run 실행!

docker run --name frontend-con -v $(pwd):/home/node/app -p 8080:8080 frontend-img

—name frontend-con
생성될 컨테이너의 이름 지정

-v
volumn의 약자. 도커에서 볼륨이란 컨테이너와 특정 폴더를 공유하는 걸 의미함.

$(pwd):/home/node/app
지금 위치한 이 폴더(pwd) 안의 내용들이 app 폴더에 들어간단 뜻이다. (그래서 Dockerfile의 WORKDIR을 app으로 설정한 후 CMD로 명령어 실행이 가능했던 것. 연결해놨으니까!!

8080:8080
집의 내선번호를 컨테이너 것과 연결
같은 컨테이너가 여러개라면 당연히 집 포트를 다르게 해줘야함

frontend-img
컨테이너로 실행할 이미지를 지정

database의 Dockerfile

FROM mysql:5.7

# 이미지 환경변수들 세팅
# 실전에서는 비밀번호 등을 이곳에 입력하지 말 것!
# 서버의 환경변수 등을 활용하세요.
ENV MYSQL_USER mysql_user
ENV MYSQL_PASSWORD mysql_password
ENV MYSQL_ROOT_PASSWORD mysql_root_password
ENV MYSQL_DATABASE visitlog

# 도커환경에서 컨테이너 생성시 스크립트를 실행하는 폴더로
# 미리 작성된 스크립트들을 이동
COPY ./scripts/ /docker-entrypoint-initdb.d/

# 이미지 빌드 명령어 (현 파일과 같은 디렉토리에서)
# docker build -t {이미지명} .

# 실행 명령어 (터미널에 로그 찍히는 것 보기)
# docker run --name {컨테이너명} -it -p 3306:3306 {이미지명}

# 실행 명령어 (데몬으로 실행)
# docker run --name {컨테이너명} -p 3306:3306 -d {이미지명}

COPY와 volume의 차이

COPY
RUN처럼 「이미지를 생성하는 과정」에서 해당 이미지 안에 특정 파일을 넣어두는 것
volume
CMD처럼 「컨테이너가 생성되어 실행될 때」 그 내부의 폴더를 외부의 것과 연결하는 것

💡 사용되는 스크립트들은 컨테이너 초기화 과정에 필요한 것!
그러니까 COPY로 미리 넣어두는 것!

종합

컴퓨터에 컨테이너랑 이미지 모두 삭제

docker stop $(docker ps -aq)
docker rm $(docker pas -aq)
docker image prune -a

run -d 옵션

daemon의 줄임말. 백그라운드에서 알아서 컨테이너를 깔고 돌아간다.

돌아가고 있는 컨테이너를 확인

docker ps

컨테이너 로그 확인

docker logs -f 컨테이너명

설계된 시스템 실행

문제점

  • 프론트앤드, 백앤드, 데이터베이스 각각의 이미지를 다운받고
    적절한 명령어로 컨테이너를 실행하는 건 매우 번거로움
  • 각각의 네트워크가 분리되어 있어서 서로 데이터를 주고받지 못함

🔌 요소들을 연결해서 서비스를 간편하게 실행해야 함!

🔔 거시적 설계도인 docker-compose 사용

docker-compose.ymi 파일의 내용

version: '3'
services:
  database:
    # Dockerfile이 있는 위치
    build: ./database
    # 내부에서 개방할 포트 : 외부에서 접근할 포트
    ports:
      - "3306:3306"
  backend:
    build: ./backend
    # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
    volumes:
      - ./backend:/usr/src/app
    ports:
      - "5000:5000"
    # 환경변수 설정
    # flask에서 이 호스트명을 이용해 db컨테이너의 MySQL에 접속함
    environment: 
      - DBHOST=database
  frontend:
    build: ./frontend
    # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
    volumes:
      - ./frontend:/home/node/app
    ports:
      - "8080:8080"

실행

docker-compose.ymi파일이 있는 위치에서
docker-compose up 명령어를 실행한다.

리눅스에서는 Docker와 Docker compose 모두 설치해 줘야 함!


공부한 자료

강의 : 얄코-가장 쉽게 배우는 도커
교본 : 동영상에 나온 깃허브
얄코사이트-도커 명령어 정리

0개의 댓글