리눅스에 node.js express를 설치하고 index.js에 express를 활용하여 8080에 서버를 코드를 작성한다. 이것을 이미지로 생성하고 실행하는 작업을 진행하려한다.
방화벽 끄기
- 기본 제공되는 보안 firewall을 off
- sudo systemctl stop firewalld
- sudo systemctl disable firewalld
프로젝트 폴더생성 및 이동
- sudo mkdir -p /docker_projects/node_1/project
- cd /docker_projects/node_1/project
소스코드
- vim index.js (권한 수정이 안되면 chown으로 권한을 부여하거나 앞에 sudo를 붙인다)
const express = require("express");
const port = "8080";
const app = express();
app.get("/", (req, res) => {
res.send("Hello Node");
});
app.listen(port);
console.log(`server running on ${port}`);
nodejs 설치
- sudo yum install nodejs -y
express 설치
- sudo npm install express
- package.json 파일 생성됨
- 자바스크립트 버전의 build.gradle 파일
- 각종 의존성에 대한 정보가 기술된다.
- node_modules 폴더 생성됨
- 실제 라이브러리들(express)이 저장되는 폴더
실행
- node index.js
이미지 제작은 사실상 VB에 스냅샷이랑 비슷함
원본 이미지 => 실행 => 컨테이너 생성 => 작업 => 스냅샷 => 새로운 이미지
이 제작에 사용되는 것이 Dockerfile 이다.
Dockerfile 생성
- vim Dockerfile
# 최신 node 이미지로 부터 시작
FROM node
# Working Directory 지정
# 도커 컨테이너의 작업폴더를 지정
WORKDIR /usr/src/app
# COPY package.json ./
# 앞의 ./는 HOST OS의 현재 폴더를 의미
# 뒤의 ./는 컨테이너의 현재 폴더(WORKDIR)를 의미
# 즉 외부에서 만들어둔 package.json 파일을 컨테이너 내부로 복사하겠다는 의미
COPY ./ ./
# node의 종속성 다운로드
# RUN 명령어는 컨테이너에서 실행
RUN npm install
# 안해도 되지만, 하는게 좋습니다.
# 이 컨테이너는 8080 포트를 사용한다는 의미 입니다.
EXPOSE 8080
# docker run 명령에서 실행항 명령이, 이 명령어 부터는 제작타임이 아닌 런타임에서 실행됨
CMD ["node", "index.js"]
1. node.js 까지 완벽하게 설치되어있는 것이 도커 허브에 이미 존재함
FROM node
2. 원본이미지로 부터 새로운 파일을 집어넣을 작업 폴더(컨테이너안에 있는)를 지정
WORKDIR /usr/src/app
3. 필요한 파일을 골라서 COPY
COPY ./ ./
사실 다 필요는 없다. index.js와 package.json만 있으면 된다. 깃허브에 내 프로젝트 올릴 때 gitignore에 node_modules, package-lock.json등을 추가했었다. 그렇지 않으면 무게만 무거워 졌었다. 어차피 받아서 실행시키면 자동으로 생성되었었다. 그 원리와 같이 COPY 할 때도 마찬가지이지만 필자 편리함을 위해 모든 것을 COPY 하였다.
4. 컨테이너 안에서 RUN이 실행됨
RUN npm install
5. 안내메시지 - 내부적으로 8080을 사용한다. 여기까지가 컴파일 타임(이미지를 만드는 과정)
EXPOSE 8080
6. 지금부터는 런타임, docker build를 하면 이전까지 실행됨, run을 하면 아래 명령어가 실행됨
CMD ["node", "index.js"]
도커 이미지 생성
- docker build -t examhello . => examhello라는(tag) 도커 이미지를 현재 폴더에 생성
생성된 도커 이미지 확인
- docker images
- examhello 확인
- node:latest 도 확인됨 => 원본으로 사용한 node 이미지
- 이미지 제작과정에서 다운로드 됨
참고 **필자는 제대로 확인하기 위해 도커와 관련된 모든 것들을 다 삭제하고 다시 시작한다.
# 컨테이너 삭제 docker rm -f $(docker ps -qa)
# 이미지 삭제 docker rmi -f $(docker images -qa)
# 안쓰는 네트워크 삭제 docker network prune -f
# 안쓰는 볼륨 삭제 docker volume prune -f
생성한 도커 이미지 실행
docker run \
--name=examhello_1 \
-p 8080:8080 \
--rm \
-d \
examhello
- 도커 실행
- 컨테이너 이름은 examhello_1로
- 외부 포트와 내부 포트를 8080
- 종료 시 깔끔하게 삭제
- 백그라운드
- 실행이 안되면 도커 자체를 restart => sudo systemctl restart docker
도커 이미지 종료
- docker stop examhello_1
- docker kill examhello_1
'IT' 카테고리의 다른 글
Linux(centOS9) 설정 8(스프링부트 앱 빌드하여 실행하기) (0) | 2022.09.18 |
---|---|
리눅스에서 도커(Docker) 활용하기 4(nginx 이미지 생성 및 실행) (0) | 2022.09.18 |
리눅스에서 도커(Docker) 활용하기 2(nginx, 컨테이너 내부 접근) (0) | 2022.09.18 |
리눅스에서 도커(Docker) 활용하기 1(설치, 기본 명령어) (0) | 2022.09.17 |
Linux(centOS9) 설정 7(proxy) (0) | 2022.09.16 |