Skip to content

Commit 6d563f1

Browse files
author
seungwonme
committed
Create My First Docker Image
1 parent 9a65b78 commit 6d563f1

File tree

6 files changed

+840
-0
lines changed

6 files changed

+840
-0
lines changed

.gitignore

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# OS
2+
.DS_Store
3+
4+
# vscode
5+
.vscode/
6+
7+
# C/C++
8+
a.out
9+
a.out.dSYM/
10+
11+
# Node.js
12+
node_modules/
13+
14+
# Python
15+
__pycache__/

docker/my-first-docker/Dockerfile

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
FROM node:20.12.1-alpine3.18
2+
3+
WORKDIR /app
4+
5+
COPY package.json package-lock.json ./
6+
7+
RUN npm ci
8+
9+
COPY index.js ./
10+
11+
ENTRYPOINT ["node", "index.js"]

docker/my-first-docker/README.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
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+
```

docker/my-first-docker/index.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const express = require("express");
2+
3+
const app = express();
4+
5+
app.get("/", (req, res) => {
6+
res.send("🐳 Docker 🐳");
7+
});
8+
9+
app.listen(8080, () => {
10+
console.log("Server is running on http://localhost:8080/");
11+
});

0 commit comments

Comments
 (0)