설치
도커 홈페이지에서 Docker Desktop을 설치한다.
터미널에서 docker --version 명령어로 설치 확인이 가능하다.
이미지 빌드
Dockerfile을 루트에 생성하고 아래 내용을 입력한다.
# 다음 이미지에서부터 시작한다.
FROM node:12.18.4
# 현재 경로의 모든 파일을 복사해서 이미지의 루트에 붙여넣는다.
COPY . .
# 이미지를 생성하는 과정에서 실행할 명령어 (package.json의 express를 설치한다.)
RUN npm install
# RUN, CMD, ENTRYPOINT의 명령어(아래)를 실행할 위치 설정
WORKDIR /src
# 콘테이너가 시작됐을 때 실행할 명령어
CMD ["node", "index.js"]
위 설정을 토대로 이미지를 생성하려면 다음 명령어를 입력한다.
docker build -t <이미지이름> .
-t 옵션에 설정해준 이름에 따라 도커 이미지가 생성된다.
제일 뒤에 .은 이미지를 만들 때 현재 위치의 Dockerfile로 설정하겠다는 뜻이다.
과정은 다음과 같다.
먼저 Dockerfile의 FROM에서 프리셋처럼 기존에 있는 node:12.18.4 이미지를 DockerHub에서 다운 받는다.
이미지를 다운 받은 적이 있다면 그냥 넘어간다.
이 이미지를 토대로 우리가 설정한 이미지로 커스터마이징하기 위해 이미지를 복사한다.
COPY를 이용해서 프로젝트 폴더의 코드를 복사한 이미지에 포함시킨다.
여기서는 프로젝트 폴더의 모든 파일을 그대로 옮겨 넣었다.
RUN을 이용해서 이미지에 express와 같은 디펜던시를 설치해서 추가할 수 있다.
여기서는 package.json의 dependencies로 설정해 놓은 express를 npm install 명령어로 설치했다.
{
"name": "simple-docker",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1"
}
}
WORKDIR과 CMD는 이 이미지를 통해 콘테이너를 만들 때 반영되는 설정이다.
CMD에는 콘테이너가 실행될 때 입력할 명령어를 넣을 수 있다.
WORKDIR에서 설정한 경로로 명령어가 실행된다.
여기서는 node index.js 명령어가 /src 경로에서 입력돼
node express 앱이 실행되면서 서버가 작동된다.
// src/index.js
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`);
});
콘테이너 생성과 실행
이제 설정한 이미지로 콘테이너를 생성해서 실행하려면 다음 명령어를 입력한다.
docker run -dp 3000:3000 <이미지이름>
이 명령어를 입력할 때마다 새로운 콘테이너를 생성한다.
-dp 옵션을 설명하겠다.
d는 background에서 콘테이너를 실행시킨다는 뜻이다.
d를 빼면 콘테이너가 터미널에서 동작하며 터미널을 사용할 수 없게 된다.
p는 포트의 약자로 3000:3000이란 3000 포트로 들어온 요청을 콘테이너의 3000 포트에 연결시키겠다는 뜻이다.
브라우저의 URL 창에 http://localhost:3000/를 입력하여 3000 포트로 접근하면
3000 포트로 열어둔 node express에 연결이 되고 요청에 따른 값 'Hello World!'를 보내준다.
콘테이너 상태 확인
실행되고 있는 콘테이너를 확인하려면 다음 명령어를 입력한다.
docker ps
종료된 콘테이너까지 확인하려면 -a 옵션을 붙인다.
docker ps -a
이상은 Docker Desktop에서도 GUI로 쉽게 확인할 수 있다.
콘테이너 멈추고 지우기
콘테이너를 멈추려면 다음 명령어를 입력한다.
docker stop <콘테이너아이디>
위의 docker ps 명령어로 콘테이너 아이디를 확인할 수 있다.
콘테이너를 지우려면 다음 명령어를 입력한다.
docker rm <콘테이너아이디>
두 명령을 한 번에 하고 싶으면 다음 명령어를 입력한다.
docker rm -f <콘테이너아이디>
콘테이너 재실행
멈춘 콘테이너를 지우지 않았다면 다시 실행할 수도 있다.
docker start <콘테이너아이디>