2-1. 간단한 백엔드 환경 만들기
npm inin -y
# 초기화
npm i express
# 익스프레스 설치
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("🐳Docker test!🐳");
});
app.listen(8080, () => console.log("Server is running🤖"));
루트 디렉토리에 Dockerfile
생성
프로젝트에 필요한 것들을 명시함
baseimage 사용하기
FROM node:16-alpine
# 숫자는 노드의 버전, alpine은 최소 단위의 리눅스 버전을 말함(os)
# 어떤 버전의 베이스이미지를 사용할 것인지 명시
이미지 안에서 어떤 경로에서 실행할 건지 명시
WORKDIR /app
# WORKDIR /path/to/workdir
# app이라는 폴더 안에 프로젝트 관련 파일을 모두 카피하겠다고 명시
# 유닉스 명령어에서 cd와 같은 개념
프로젝트 파일들 복사하기
도커파일 명령어 수행은 레이어 시스템으로 구성되어 있어 빈번히 변경되는 파일일수록 제일 마지막에 작성해주는 것이 좋다.
index.js는 다른 디펜던시 정보를 담고 있는 pakage.json보다 빈번히 변경 되기 때문에 하단에 배치
COPY package.json package-lock.json ./
# 우리 프로젝트에 모든 디펜던시를 담고 있는 pakage.json
# 필요한 라이브러리를 다 설치하게 됨
RUN npm install
# install 대신 ci를 사용하면 package-lock.json에 명시되어 있는 버전 그대로를
# 설치하기 때문에 버전 달라지는 문제 해결
최종 작성 파일
FROM node:16-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY index.js .
# 소스파일 카피
ENTRYPOINT [ "node", "index.js" ]
# 실행하는 명령어
도커 문법은 공식 사이트 참고
도커 파일은 레이어 형태로 작성해주는 것이 좋은데 제일 빈번히 변경되는 파일을 제일 마지막에 작성하는 것이 좋다.
명령어 하나 하나가 레이어로 되어 있어 자주 변경되는 걸 아래에 적으면 실행될 때는 레이어 상단으로 위치가 되기 때문에 이미지를 만들고 새로운 이미지를 만들어야 할 때 변경된 최상단 레이어만 업데이트 해주고 나머지 레이어는 다시 만들지 않아도 된다.
이미지 다시 만들 때 변경되지 않은 레이어는 재사용 (캐싱), 변경된 레이어부터만 다시 빌드하도록 만듦
⇒ 이미지 만드는 시간 단축, 효율성 높아짐
docker build -f Dockerfile -t fun-docker .
# build context . 명령어를 수행하는 현재 경로 지정
# use -f to point to a Dockerfile (어떤 도커파일 사용할 건지 명시,
# 기본적으로 도커파일이라고 작성하지만 다른 이름 지정해줄 수도 있음)
# use -t to name the image (도커 이미지에 네이밍하기. 태그 같은 개념!)
# 다양한 옵션들이 존재함
docker images
# 이미지 확인
docker run -d -p 8080:8080 fun-docker
# -d stands for datached to run a container in a background
# 백그라운드에서 도커가 동작해야 하므로 (node.js 백엔드 어플리케이션이기 때문)
# 터미널이 계속 기다려야 함? 끝날 때까지 기다리지 말고 할 일 하라는 옵션 (?)
# -p is port publishing 포트 지정하는 옵션
# maps a port on the container to a port on the host
# 호스트 머신의 8080과 컨테이너의 8080을 연결해주는 작업
# 각각의 컨테이너는 고립된, 개별적인 환경에서 동작하고 있으므로.
docker logs 6ce1eda1c787
# docker logs 컨테이너 ID
cmd 컨테이너 DB 조회 방법
1. 컨테이너에 접근 : `docker exec -it ${container_name} bash;`
2. mariaDB 실행 : `mariadb -u root -p;` 이후 패스워드 입력
3. Database 조회 : `show databases`;
4. Database 선택 : `use ${database_name};`
5. Table 조회 : `show tables;`
6. DB schema 조회 : `desc ${table_name};` (각 컬럼들 자료형 조회)
7. DB 데이터 확인 : `select * from ${table_name};`