[ Docker ] 따라하며 배우는 도커와 CI환경 - 4

·2023년 6월 26일
0

Day 4

Node.js 앱 만들기

nodejs-docker-app 파일 만들고
vs_code 그냥 실행시켜서 터미널에 npm init 하면 실행이 안됨

이를 해결하기 위해서
nodejs를 설치하고 환경변수도 해보고 다시 열어봤지만 실패

바탕화면 cmd 열어서 study폴더 들어가 nodejs-docker-app폴더 진입 후 code . 으로 실행하니깐 문제 해결

터미널 npm init

Press ^C at any time to quit.
package name: (nodejs-docker-app)
version: (1.0.0)
description:
entry point: (index.js) server.js
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to C:\Users\bax\Study\nodejs-docker-app\package.json:

{
  "name": "nodejs-docker-app",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this OK? (yes)

package.json 만드는 과정
만들어진 package.json

{
  "name": "nodejs-docker-app",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

여기에 dependencies 추가

{
  "name": "nodejs-docker-app",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "express":"4.17.1"
  },
  "author": "",
  "license": "ISC"
}

이후
server.js 파일 생성 후 다음 내용 코딩

const express = require('express');

const PORT = 8080;

// APP
const app = express();
app.get('/', (req,res) => {
    res.send("Hello World")
});

app.listen(PORT);

Dockerfile 작성하기

Dockerfile 생성 후

FROM node:10

RUN npm install

CMD ["node", "server.js"]

저 부분에서 FROM 부분을 alpine으로 바꾸고 실행하면
RUN npm install에서 에러가 난다

그리고 다시 FROM을 node:10으로 바꾸고 실행하면
package.json이 없다는 에러가 나온다고 한다

근데 나는 윈도우 환경인가 뭐때문인지는 모르겠지만
alpine으로 실행해서 에러가 나온건 같지만
다시 node:10으로 바꾸고 docker build ./ 했는데
에러가 발생하지 않고 잘 실행되었다

왜그런지는 잘 모르겠다.

Package.json 파일이 없다고 나오는 이유

dockerimage 일단 한번 다 지워보고 강의따라서 다시 시도해보니깐

강의 내용대로 에러가 걸리는 곳에서 걸렸다.
대신 한가지 시행착오가 있었는데 vscode 실행하고 경로가 내가 원하는 파일에 잘 있는지 확인하자 파일에 들어가지 않고 docker build 하니깐 계속 디렉토리 오류가나서 무슨 이유인가 싶었다.

에러가 나는 이유

node 베이스 이미지 -> 임시 컨테이너 만들 때
파일 스냅샷 임시 컨테이너에 넣고 npm install 하려고 할 때
에러가 나는데
package.json이 임시 컨테이너 밖에 있기 때문에 에러가 난다
server.js도 밖에 있어 같다.

즉 어플리케이션에 필요한 종속성 다운 받아야하는데
다운받을 때 먼저 package.json 보고 그 곳에 명시된
종속성을 다운받아 설치해야 하지만 컨테이너 안에
package.json 이 없어 발생

해결방법

COPY package.json ./ 추가해주면 된다.

FROM node:10

COPY package.json ./

RUN npm install

CMD ["node", "server.js"]

이 후 docker run 해서
에러가 나는데 server.js 찾지 못해서 그렇다

결국 COPY package.json ./ 이 부분을
COPY ./ ./ 전부 복사하면 된다.

이후 console log 찍은 Server is running은
터미널에서 docker run 하면 잘 나오지만

http에서 localhost:8080 을 하면 잘 실행되지 않는다

그 이유는 다음 강의에..

생성한 이미지로 어플리케이션에 실행 시 접근이 안 되는 이유

현재까지 컨테이너 실행 명령어
docker run 이미지이름

앞으로 실행할 명령어
docker run -p 5000:8000 이미지이름

로컬호스트네트워크 : 네트워크 현재
5000 8080

port 를 맵핑해줘야한다.

Working Directory 명시해주기

linux 에서 cd / 하면 mnt, usr 폴더가 있는 곳으로 간다.
이곳에서 벌어지는 일들이다.

workdir 지정하지않고 그냥 copy한다면?
베이스 이미지에 home 폴더 있고 copy 하면 새로 추가 되는 폴더 중에
home이라는 폴더가 있으면 중복이 되므로 원래있던 폴더 덮어씌어져 버린다.

그리고 모든 파일이 한 디렉토리에 들어가 버려 너무 정리정돈이 안되어있다.

-> 그래서 모든 어플리케이션을 위한 소스들은 WORK 디렉토리를 따로 만들어서 보관

working directory 만들기

FROM node:10 WORKDIR /usr/src/app COPY ./ ./ RUN npm install CMD ["node", "server.js"]

docker build 하고
docker run -it <이미지 이름> sh
ls
워크 디렉토리에 파일 잘 들어가있는지 확인

어플리케이션 소스 변경으로 다시 빌드하는 것에 대한 문제점

어플리케이션 만들다 소스 코드 계속 변경하면
변경된 부분 확인하며 개발해야하는데

소스코드를 변경하면 이미지 생성부터 다시 실행시켜줘야하는
매우 번거로운 문제점이 생겨버린다.

어플리케이션 소스 변경으로 재빌드 시 효율적으로 하는 법

FROM node:10
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install 
COPY ./ ./
CMD ["node", "server.js"]

copy 부분 바꿔주고 하나 더 추가해주면

모듈은 모듈에 변화가 생길때만 다시 다운 받고
소스 코드에 변화 생길 때
모듈 다시받는 현상 없애준다.

Docker Volume에 대해

주의
윈도우 환경에서 cmd 사용해 폴더에 들어가서 vscode 켜고
vscode에서 터미널을 우분투꺼를 사용해도 Volume 적용 안됨

해결방법
그냥 처음부터 wsl Ubuntu 실행시켜서 파일까지 경로 찾아간 다음
vscode 하고 코드 적용하면 server.js 내용 바뀌어도 바로 적용 잘됨

이제 npm install 전에 package.json 따로 변경해서
쓸때없이 모듈 다시 받지 않아도 된다.

하지만 아직 소스 변경하면 변경된 소스 copy 한 후
이미지 다시 빌드 하고 컨테이너 다시 실행해야 변경된 소스 반영되고
이 작업은 시간 소요 크고 이미지 너무 많이 빌드해 안좋다.
이런 문제점 해결하기 위해
Docker Volumes 사용하게 된다.

도커 컨테이너에서 Volume 사용해서 로컬 매핑해서 사용하는 방법
docker run -p 5000:8080
-v /usr/src/app/node_modules -> 호스트 디렉터리에 node_module 없기에 컨테이너에 맵핑 하지 말라고 하는것
-v $(pwd):/usr/src/app -> pwd 경로에 있는 디렉토리 혹은 파일을 /usr/src/app 경로에서 참조

docker run -d -p 5000:8080 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app ysh03634/nodejs

volume 이용해서 키면 빌드할때 소스 바꾸더라도 바꾼 코드 적용됨

                    vs

이렇게 copy로만 만든 이미지 사용해
어플리케이션 키면 소스 코드를 바꿔서 해도 바꾼 소스가 적용 되어 있지 않는다.

출처
https://www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%A9%B0-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EB%8F%84%EC%BB%A4-ci

0개의 댓글