|
| 1 | +# My First Docker |
| 2 | + |
| 3 | +## npm init |
| 4 | +```bash |
| 5 | +npm init -y |
| 6 | + |
| 7 | +npm install express |
| 8 | +``` |
| 9 | + |
| 10 | +## Create a server with express |
| 11 | +```javascript |
| 12 | +const express = require("express"); |
| 13 | + |
| 14 | +const app = express(); |
| 15 | + |
| 16 | +app.get("/", (req, res) => { |
| 17 | + res.send("🐳 Docker 🐳"); |
| 18 | +}); |
| 19 | + |
| 20 | +app.listen(8080, () => { |
| 21 | + console.log("Server is running on http://localhost:8080/"); |
| 22 | +}); |
| 23 | +``` |
| 24 | + |
| 25 | +## Dockerfile |
| 26 | +```Dockerfile |
| 27 | +FROM node:20.12.1-alpine3.18 |
| 28 | +# 항상 FROM baseImage로 시작해야 한다. |
| 29 | +# 기본적으로 순수 linux 이미지를 사용한다. |
| 30 | +# node에서 만들어놓은 베이스 이미지가 있다. |
| 31 | +# node:<version>-alpine(가장 최소 단위의 리눅스 이미지) |
| 32 | + |
| 33 | +WORKDIR /app |
| 34 | +# Container 내부에서 작업할 디렉토리를 설정한다. |
| 35 | +# 어떤 Directory에 Application을 복사할 것인지 설정한다. |
| 36 | +# `cd /app` 명령어를 실행한 것과 같다. |
| 37 | + |
| 38 | +COPY package.json package-lock.json ./ |
| 39 | +# `cd package.json package-lock.json ./` 명령어를 실행한 것과 같다. |
| 40 | + |
| 41 | +RUN npm ci |
| 42 | +# npm install 명령어를 실행한 것과 같다. |
| 43 | +# npm install의 경우 명시한 범위 중 가장 최신 버전을 설치하기 때문에 개발 버전과 배포 버전이 다를 수 있다. |
| 44 | +# 따라서 npm ci 명령어를 사용하여 package-lock.json에 명시된 버전을 설치하는 것이 가장 좋다. |
| 45 | + |
| 46 | +COPY index.js ./ |
| 47 | + |
| 48 | +ENTRYPOINT ["node", "index.js"] |
| 49 | +# ENTRYPOINT는 Container가 시작될 때 실행할 명령어를 설정한다. |
| 50 | +# ENTYPOINT [cmd, param1, param2] 형식으로 사용한다. |
| 51 | +``` |
| 52 | +- Dockerfile은 Layer System으로 구성되어 있기 때문에 빈번한 변경이 발생하는 부분은 가장 아래에 배치하는 것이 좋다. |
| 53 | +- 실제 Application 소스 코드인 `index.js`가 `package.json`같은 Dependency 파일보다 더 자주 변경되기 때문에 `index.js`를 가장 아래에 배치하는 것이 좋다. |
| 54 | +- [Dockerfile reference | Docker Docs](https://docs.docker.com/reference/dockerfile/#entrypoint) |
| 55 | +- [Overview of best practices for writing Dockerfiles | Docker Docs](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) |
| 56 | + |
| 57 | +## Build Docker Image |
| 58 | +```bash |
| 59 | +docker build -f Dockerfile -t my-first-docker . |
| 60 | +``` |
| 61 | +- build: Docker Image를 생성하는 명령어 |
| 62 | +- -f: 어떤 Dockerfile을 사용할 것인지 지정하는 옵션 |
| 63 | +- -t: Docker Image의 이름을 지정하는 옵션 |
| 64 | +- .: Dockerfile이 있는 경로를 지정하는 옵션 |
| 65 | + |
| 66 | +## Check Docker Image |
| 67 | +```bash |
| 68 | +docker images |
| 69 | +``` |
| 70 | + |
| 71 | +## Run Docker Container |
| 72 | +```bash |
| 73 | +docker run -d -p 8080:8080 my-first-docker |
| 74 | +``` |
| 75 | +- run: Docker Container를 생성하고 실행하는 명령어 |
| 76 | +- -d: Detached mode(background)로 실행하는 옵션 |
| 77 | +- -p: Port Mapping 옵션 (Host Port:Container Port) |
| 78 | + |
| 79 | +## Check Docker Container |
| 80 | +```bash |
| 81 | +docker ps |
| 82 | +docker log <Container ID> |
| 83 | +``` |
| 84 | + |
| 85 | +## Stop Docker Container |
| 86 | +```bash |
| 87 | +docker stop <Container ID> |
| 88 | +``` |
| 89 | + |
| 90 | +## Remove Docker Container/Image |
| 91 | +```bash |
| 92 | +docker rm <Container ID> |
| 93 | +docker rmi <Image ID> |
| 94 | +``` |
0 commit comments