
LXC(리눅스 컨테이너스)라는 커널 컨테이너 기술을 이용하여 만든 컨테이너 기술 중 하나.
도커 엔진(Docker Engine) 혹은 도커에 관련된 모든 프로젝트를 칭함
애플리케이션을 '컨테이너'라는 가벼운, 이식 가능한 실행 환경으로 패키징, 배포 및 실행할 수 있도록 해 주는 플랫폼으로, 컨테이너는 애플리케이션과 그 종속성을 함께 묶어 운영 체제 수준에서 격리된 환경에서 실행되며(가상환경), 이를 통해 다양한 환경에서 일관된 실행을 보장할 수 있다.
리눅스에서 유래한 기술이지만 윈도우에서 리눅스 컨테이너를 구동하거나, 윈도우 컨테이너를 구동할 수도 있다.
이번 프로젝트 때 써 보면 좋을 것 같아 한 번 찾아봤다.

1. npm init -y
(package.json에서 "type": "module" 추가해 주는 거 잊지 말기. 맨날 까먹누)
2. express 설치
3. index.js 파일을 만들어 간단히 스크립트 작성
import express from 'express';
const app = express();
app.get('/', (req, res) => {
res.send('Hello Docker!!!!!🐳')
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
4. Dockerfile이라는 이름으로 파일 생성.
(다른 이름으로 해도 되나본데 관례적으로 이렇게 하는 것 같다.)

5. 컨테이너에서 실행시킬 코드를 적는다.
FROM node:16-alpine
# Create app directory
WORKDIR /app
# 1. COPY . . : 현재 디렉토리의 모든 파일을 컨테이너의 /app 디렉토리로 복사
COPY package.json package-lock.json ./
# 2. npm ci : run install을 써도 되지만 ci가 더 나음.
# package-lock.json에 명시된 버전이 아니어도 괜찮
RUN npm ci
# 3. COPY . . : 현재 디렉토리의 모든 파일을 컨테이너의 /app 디렉토리로 복사
COPY index.js .
ENTRYPOINT ["node", "index.js"]
# 명령어 하나하나가 레이어로 생성되기 때문에, 명령어를 최대한 묶어서 사용하는 것이 좋다.
# 가장 빈번히 변경되는 부분을 가장 아래에 배치하는 것이 좋다. (캐시를 재사용하기 위해)
# 레이어를 재사용하면 빌드 속도가 빨라진다. (캐시를 재사용하기 때문)
# 레이어를 재사용하면 이미지 크기가 줄어든다. (캐시를 재사용하기 때문)
# 터미널: docker build -f Dockerfile -t june-docker .
# . <- 현재 도커파일 위치
# -f <- 파일명 지정
# -t <- 태그명 지정
# june-docker <- 태그명
# 터미널: docker run -it fun-docker
# -it <- 인터렉티브 모드
# june-docker <- 이미지명
# 터미널: docker run -d -p 3000:3000 june-docker
# -d <- 백그라운드 실행
# -p <- 포트포워딩
# 3000:3000 <- 호스트포트:컨테이너포트
# june-docker <- 이미지명
6. 빌드하기 : 터미널에서 docker build -f 도커파일명 -t 내 이미지명
도커는 빌드 결과물을 image라고 표현을 하는데 객체지향에서 말하는 'class' 개념으로 보면 될 것 같다. 일단 Dockerfile이라는 레시피를 통해 image를 만들어 두면, 다시 이 image를 통해 각 컨테이너들을 만드는 형식.


명령어 하나하나가 레이어로 생성되기 때문에, 명령어를 최대한 묶어서 사용하는 것이 좋다.
가장 빈번히 변경되는 부분을 가장 아래에 배치하는 것이 좋다. (캐시를 재사용하기 위해)
레이어를 재사용하면 빌드 속도가 빨라진다. (캐시를 재사용하기 때문)
레이어를 재사용하면 이미지 크기가 줄어든다. (캐시를 재사용하기 때문)
중요한 내용이니 한 번 더.
7. RUN : docker run -d -p 호스트포트:컨테이너포트 june-docker
포트는 둘 다 3000:3000 으로 주었다.

이제 브라우저를 열고 localhost:3000을 입력하면,

프로젝트 시작하면 배포까진 시간 걸릴텐데
아마 나는 분명 그 때쯤이면 잊어버릴 것 같아서 미리 기록해 둠!
윈도우용 도커는 WSL2안에 올라가는데 VirtualBox나 VMware에서 VT-X를 사용할 수 없다는 이슈가 있다는 모양이지만
일단 참고만 해 두기로.