2020.코딩일지
[Docker]Node.js웹 앱의 도커라이징Dockerizing(컨테이너화) 본문
package.json 파일생성(서버이름, start명령어, express ver.)하고 `npm install` -> package-lock.json생성됨
package.json
{
"name": "docker_web_app",
"version": "1.0.0",
"description": "Node.js on Docker",
"author": "First Last <first.last@example.com>",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.16.1"
}
}
server.js 파일생성(Express프레임워크사용)
"use strict";
const express = require("express");
// 상수
const PORT = 8080;
const HOST = "0.0.0.0";
// 앱
const app = express();
app.get("/", (req, res) => {
res.send("Hello World");
});
app.listen({ host: "0.0.0.0", port: 8080 }); //여기수정함
console.log(`Running on http://${HOST}:${PORT}`);
Dockerfile생성 `touch dockerfile` -> 선호하는 텍스트에디터열어서 수정ㅋ
(node16버전으로이미지만들꺼고, 앱디렉토리만들어서 앱코드넣을꺼야, package.json참고해~, docker데몬에 맵핑)
Dockerfile
# 어떤 이미지를 사용해서 빌드할 것인가? docker Hub에 node최신16버전사용할거예용
FROM node:16
# 앱 디렉터리 생성(이미지안에 앱코드를 넣기위해)
WORKDIR /usr/src/app
# 앱 의존성 설치
# 가능한 경우(npm@5+) package.json과 package-lock.json을 모두 복사하기 위해
# 와일드카드를 사용
COPY package*.json ./
RUN npm install
# 프로덕션을 위한 코드를 빌드하는 경우
# RUN npm ci --only=production
#npm ci커맨드는 프로덕션 환경을 위한 더 빠르고,신뢰할 수 있고, 재현 가능한 빌드를 제공한다.
# 앱 소스 추가 (작업디렉터리 전체를 복사하는게아닌, package.json파일만 복사)<-캐시된 docker레이어의 장점활용하기위함
COPY . .
#8080포트에 바인딩되어있는걸 EXPOSE지시어로 docker데몬에 맵핑
EXPOSE 8080
CMD [ "node", "server.js" ]
#런타임 정의는 CMD로.
.dockerignore파일생성 (dockerfile과 같은 위치에)
(docker이미지에 로컬모듈과 디버깅로그를 복사하는것을 막아서 이미지 내에서 설치한 모듈을 덮어쓰지 않게 하는 작업)
.dockerignore
node_modules
npm-debug.log
🏗이미지빌드
dockerfile이 있는 디렉터리위치로가서 `docker build . -t <your username>/node-web-app`
(-t 옵션으로 태그를 추가해서 `docker images`에서 쉽게 찾을수있게하려고)
🕌이미지실행
`docker run -p 49160:8080 -d <your username>/node-web-app`
(-p 옵션은 공개 포트를 컨테이너 내의 비공개 포트로 리다이렉트 해줌)
(-d 옵션은 백그라운드에서 컨테이너가 돌아가도록 한다.)
`docker ps` 컨테이너 아이디 확인
`docker logs <container id>` 앱로그출력 -> Running on 0.0.0.0:8080서버돌고있는내용확인가능
`docker exec -it <container id> /bin/bash` 해당컨테이너안에 들어가기(exec명령어사용)
`curl -i localhost:49160` 또는 크롬켜서 확인가능
'WebServer&DB&CTI' 카테고리의 다른 글
[에러해결]Error: You attempted to save an instance with no primary key, this is not allowed since it would result in a global update (0) | 2022.11.18 |
---|---|
[mac] postgresql Guide (0) | 2022.11.03 |
[Docker]리눅스기반, 왜도커인가[BEB 6th] (0) | 2022.08.19 |
[인증/보안]OAuth2.0[BEB 6th] (1) | 2022.08.15 |
[데이터베이스]NoSQL:MongoDB = NoSQL도큐먼트DB[BEB 6th] (0) | 2022.08.11 |