๐ [Docker] Docker ์์ํ๊ธฐ & ๋ช ๋ น์ด ์ ๋ฆฌ
![๐ [Docker] Docker ์์ํ๊ธฐ & ๋ช
๋ น์ด ์ ๋ฆฌ](/assets/img/thumbnail/docker-thumbnail.jpg)
[Docker] Docker ์์ํ๊ธฐ & ๋ช ๋ น์ด ์ ๋ฆฌ
Docker desktop ๋ค์ด๋ก๋
Docker: Accelerated Container Application Development ๋์ปค ์ค์น
WSL ์ค์น
$ wsl --install
- Windows 10/11 Professional / Education / Enterprise ์๋์
- WSL2 ๊ธฐ๋ฐ Docker Engine ์ฌ์ฉ ๊ฐ๋ฅ
- Hyper-V ๊ธฐ๋ฐ Docker Engine ์ฌ์ฉ ๊ฐ๋ฅ
- Windows 10/11 Home ์๋์
- WSL2 ๊ธฐ๋ฐ Docker Engine ์ฌ์ฉ ๊ฐ๋ฅ
WSL ๋ฒ์ ๊ธฐ๋ณธ๊ฐ์ 2๋ก ๋ณ๊ฒฝ
$ wsl --set-default-version 2
WSL(Windows Subsystem for Linux)ย : ์๋์ฐ์ ๊ฐ์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํด, ์๋์ฐ์์ ๋ฆฌ๋ ์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ฃผ๋ ๋๊ตฌ
WSL์ ์๋์ฐ์ ๊ฐ์ํ ๊ธฐ์ Hyper-V ์ํคํ ์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
- WSL 1ย : ์ค์ Linux ์ปค๋ ์์ด ๋์ํ๊ธฐ ๋๋ฌธ์, ๋ชจ๋ Linux ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ํ์ง ์์.
- WSL 2ย : VM์์ Linux ์ปค๋์ ์คํํด ์์ ํ ์์คํ ํธ์ถ ํธํ์ฑ์ ์ ๊ณต.
Hyper-v ํ์ฑํ ๋ฐฉ๋ฒ
Terminal app์ ์คํ์์ผ์ ์๋ ๋ช ๋ น์ด ์คํ
$ Enable-WindowsOptionalFeatureย -Onlineย -FeatureNameย Microsoft-Hyper-Vย -All
๋๋
์ปจํธ๋กค + s ๋๋ฌ์ windows ๊ธฐ๋ฅ ์ ํ Hyper-v ์ฒดํฌ๋ฐ์ค ์ ํ
Hyper-V ๋นํ์ฑํ ๋ฐฉ๋ฒ
// ๋นํ์ฑํ
$ bcdedit /set hypervisorlaunchtype off
// ์ญ์
$ Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
- ํ์ฑํ์ค์ธ์ง ํ์ธ
$ bcdedit /enum
React(vite) + docker ํ๊ฒฝ ์ ํ
react ํ๋ก์ ํธ ์์ฑ
[[2025-04-01-react-002]] ์ฐธ๊ณ
ํ๋ก์ ํธ ํด๋ ๋ฃจํธ ๊ฒฝ๋ก์ Dockerfile ์์ฑ
# node ๊ธฐ๋ฐ docker ์ด๋ฏธ์ง ์์ฑ
FROM node
# ๊ฒฝ๋ก ์ค์ ํ๊ธฐ
WORKDIR /app
# package.json์ working ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌํ๋ค. ย ./์ ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ์๋ฏธ
COPY package.json .
# ์์กด์ฑ ์ค์น ๋ช
๋ น์ด๋ฅผ ์คํํ๋ค.
RUN npm install
# ํ์ฌ ๋๋ ํ ๋ฆฌ์ ํ์ผ์ ๋์ปค ์ปจํ
์ด๋์ working ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌ
COPY . .
# ํ๊ฒฝ๋ณ์ ์ ์ฉ
# hot reloading : ์์ค ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ ๋ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ์ง ์๊ณ ๋ฐ๋ ์์ค ์ฝ๋๋ง ๋น ๋ฅด๊ฒ ๊ต์ฒดํด ์ค๋ค.
# ์๋์ฐ ํ๊ฒฝ์์ hot reloading์ ์ฉ์ด ๋์ง์์๋ CHOKIDAR_USEPOLLING=true
ENV CHOKIDAR_USEPOLLING=true
# ํด๋น ํฌํธ ์ธ๋ถ์ ๋
ธ์ถ
EXPOSE 5173
# npm run dev ์คํฌ๋ฆฝํธ ์คํ
CMD ["npm", "run", "dev"]
Docker ์ด๋ฏธ์ง ๋น๋
docker build -t <์ด๋ฏธ์ง ์ด๋ฆ> <๊ฒฝ๋ก>
docker build -t test_image .
docker images
- ์ด๋ฏธ์ง๊ฐ ์ ๋ง๋ค์ด์ก๋์ง ํ์ธ
Docker ์ปจํ ์ด๋ ์คํ
// docker run -d -p <host port>:<container port> --name <tag> <์ฌ์ฉํ ์ด๋ฏธ์ง>
docker run -d -p 3000:5173 --name test_container test_image
- ์ด๋ฏธ์ง๋ก๋ถํฐ ์ปจํ ์ด๋ ์ธ์คํด์ค๋ฅผ ์์ฑ
- ๋ก์ปฌ์ด๋ฏธ์ง๊ฐ ์๋ค๋ฉด ์๊ฒฉ ์ ์ฅ์ url์ ์ง์ ํ๋ฉด ์๊ฒฉ์ ์ฅ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ๋ค.
- -d ์ต์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์คํ
- -p ์ต์ ์ ํธ์คํธ ํฌํธ์ ์ปจํ ์ด๋ ํฌํธ๋ฅผ ๋ฐ์ธ๋ฉ ํ๋ค. (ํฌํธ ํฌ์๋ฉ ์ค์ )
- viteํ๊ฒฝ์์๋ ๊ธฐ๋ณธport 5173์ผ๋ก ์ค์ ๋์ด์๊ธฐ๋๋ฌธ์ 3000:5173์ผ๋ก ์ค์
docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3000 -> 127.0.0.1:0: listen tcp 0.0.0.0:3000: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
- ํด๋น ํฌํธ๊ฐ ์์ธ์ค๊ฐ ๋์ง ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ ํ ๊ฒฝ์ฐ
netsh interface ipv4 show excludedportrange protocol=tcp
- cmd์ฐฝ์ ํฌํธ ์ ์ธ ๋ฒ์๋ฅผ ํ์ธ 3000ํฌํธ๊ฐ ์ ์ธ ๋ฒ์์ ํฌํจ๋๋ค๋ฉด
net stop winnat
- cmd ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์คํ ๋ช ๋ น์ด ์คํ
ERR_EMPTY_RESPONSE http://localhost:3000/ ์ ์์ด ์๋๋๊ฒฝ์ฐ
๋์ปค ์ปจํ ์ด๋ ํ๊ฒฝ๊ณผ ํธ์คํธ ํ๊ฒฝ์ ๋ ๋ฆฝ์ ์ธ ํ๊ฒฝ์ ๊ฐ์ง๋ค. ์ฆ ํธ์คํธ ํ๊ฒฝ๊ณผ ๋์ปค ์ปจํ ์ด๋ ํ๊ฒฝ์ localhost๋ ๋ค๋ฅธ ๋คํธ์ํฌ ํ๊ฒฝ์ด๋ค. ์ปจํ ์ด๋ ๋ด๋ถ์์ localhost์ ์ฌ์ฉํ์ฌ ํธ์คํธ ํ๊ฒฝ์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์๋ก ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ vite.config.js์์ ์๋ฒ ์ต์ ์ค์ ์ ์ถ๊ฐํด์ค์ผ ํ๋ค. server host 0.0.0.0 ์๋ฏธ๋ ย LAN์ ๊ณต์ฉ ์ฃผ์๋ฅผ ํฌํจํ ๋ชจ๋ ์ฃผ์๋ฅผ ์์ ํ๋ค๋ ์๋ฏธ์ด๋ค.
vite.config.js
export default defineConfig({
plugins: [react()],
server: {
host: "0.0.0.0",
port: 5137
},
});
.dockerignore ์์ฑ
๋น๋์ ๋ถํ์ํ ํ์ผ ์ ์ธ .gitignore์ ๋์ผ Docker ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ๋ถํ์ํ ํ์ผ ํฌํจ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋งค์ฐ ์ค์ํ๋ค.
# Docker ๋ด๋ถ์์๋ ๋ฌด์
docker-compose*.yml
Dockerfile
.dockerignore
# Node.js ์์กด์ฑ ํด๋
node_modules
npm-debug.log
yarn-debug.log
yarn-error.log
# ๋น๋ ๊ฒฐ๊ณผ๋ฌผ
build
dist
# ํ๊ฒฝ ์ค์
.env
# ์ด์์ฒด์ ๋ IDE ๊ด๋ จ
.DS_Store
# Git
.git
.gitignore
.env
ํ์ผ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ํฌํจํ๋ฏ๋ก ์ ๋ ํฌํจ๋๋ฉด ์๋๋ค.build
๋๋dist
๋ ๊ฐ๋ฐ์ฉ Dockerfile์์ ๋ณดํต ์ ์ธ, ์ด์์ฉ Dockerfile์์ ํฌํจํ ์ ์์ต๋๋ค.node_modules
๋ ๋ก์ปฌ์์ ๊ผญ ํ์ํ์ง๋ง ์ปจํ ์ด๋ ์์์๋ ๋ณดํตnpm install
์ ๋ค์ ํ๋ฏ๋ก ์ ์ธํด์ผ ํ๋ค.
Docker Bind Mount & Volume
๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์์ค ์์ ๋ ๊ฒฝ์ฐ ์ปจํ ์ด๋๋ฅผ ์ข ๋ฃํ๊ณ ์ด๋ฏธ์ง ๋น๋ ๋ค์ ์ปจํ ์ด๋ ์คํ์์ผ๋ก ๋ฐ๋ณตํด์ผ ํ๋ค. ๋ณ๊ฒฝ๋ ์์ค๋ฅผ ์คํ์ค์ธ ์ปจํ ์ด๋ ๋ด๋ถ์ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๊ธฐ ์ํด ๋ก์ปฌ ํด๋์ ์ปจํ ์ด๋ ๋ด๋ถ ํด๋๋ฅผ ๋ง์ดํธ ํ์ฌ ์ฐ๊ฒฐ์์ผ์ผ ํ๋ค.
docker run -v ${pwd}<๋ก์ปฌํด๋๊ฒฝ๋ก>:<์ปจํ
์ด๋ํด๋๊ฒฝ๋ก> -d -p <host port>:<container port> --name <tag> <์ฌ์ฉํ ์ด๋ฏธ์ง>
docker run -v ${pwd}/src:/app/src:ro -d -p 3000:5173 --name test_container test_image
- ${pwd}๋ ํ์ฌ๊ฒฝ๋ก๋ฅผ ์๋ฏธ
:ro
์ฝ๊ธฐ์ ์ฉ ๋ชจ๋(์ปจํฐ์ด๋ ๋ด๋ถ์์ ์ฐ๊ธฐx) - ํ์ฌ๊ฒฝ๋ก/src ํด๋์ test_container /app/src ํด๋์ ๋ง์ดํธ
- -d ์ต์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์คํ
- -p ์ต์ ์ ํธ์คํธ ํฌํธ์ ์ปจํ ์ด๋ ํฌํธ๋ฅผ ๋ฐ์ธ๋ฉ ํ๋ค. (ํฌํธ ํฌ์๋ฉ ์ค์ )
- ์๋์ฐ ํ๊ฒฝ์์ Hot reloading๋์ง ์์๊ฒฝ์ฐ
CHOKIDAR_USEPOLLING=true
์ถ๊ฐ
docker-compose.yml ์์ฑ ๋ฐฉ๋ฒ
docker-compose.yml
์ ์ฌ๋ฌ ์ปจํ
์ด๋๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ํ๊ณ ๊ด๋ฆฌํ ์ ์๋ ์ค์ ํ์ผ์
๋๋ค.
services:
react-app:
# Dockerfile์ด ์๋ ๊ฒฝ๋ก ์ง์
build:
context: .
dockerfile: Dockerfile
# ์ปจํ
์ด๋ ์ด๋ฆ ๋ช
์
container_name: "react_container"
# ์ฌ์ฉํ docker์ด๋ฏธ์ง ์ง์
ย ย image: test
# ์ปจํ
์ด๋ ์์ ์ ์คํํ ๋ช
๋ น์ด
# command:
# ํฌํธ ํฌ์๋ฉ ์ค์
ports:
- "3000:5137"
restart: always
# ํธ์คํธ ์ปจํ
์ด๋ volume ๋ง์ดํธ
volumes:
- ./src:/app/src
# -it ์ต์
์ ์ํด ์ฌ์ฉ๋จ (ํ์ค์
์ถ๋ ฅ)
stdin_open: true
tty: true
# ์ง์ ํ๊ฒฝ ๋ณ์ ๋ช
์ ๊ฐ๋ฅ
environment:
- CHOKIDAR_USEPOLLING=true
#`.env` ํ์ผ์ ์๋ ๋ณ์๋ค ์๋ ๋ก๋ฉ
# env_file:
docker-compose ์คํ ๋ช ๋ น์ด
# ์ปจํ
์ด๋๋ฅผ ์์ฑ
docker compose up
# ์ด๋ฏธ์ง๋ฅผ ์๋ก ๋น๋ํด์ ์ปจํ
์ด๋๋ฅผ ์์ฑ
docker compose -p <container name> up -d --build
# ์ปจํ
์ด๋ ์ญ์
docker compose down
# ์ปจํ
์ด๋ ์ค๋จ
docker compose stop
# ์ปจํ
์ด๋ ์์
docker compose start
# ์ปจํ
์ด๋ ์ฌ์์
docker copmose restart
Docker ๋ช ๋ น์ด ์ ๋ฆฌ
docker ps
docker ps -a
- Docker ์คํ์ค์ธ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
- Docker ๋ชจ๋ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธ
docker inspect <id or name>
- Docker ์ปจํ ์ด๋ ์ ๋ณด ํ์ธ
docker rm <id or name>
- Docker ์ปจํ ์ด๋ ์ ๊ฑฐ
docker start <id or name>
- Docker ์ปจํ ์ด๋ ์์
docker stop <id or name>
docker kill <id or name>
- Docker ์ปจํ ์ด๋ ์ ์ง
- Docker ์ปจํ ์ด๋ ๊ฐ์ ์ข ๋ฃ
docker restart <id or name>
- Docker ์ฌ์์
docker exec -it <id or name> bash
- Docker ์ปจํ ์ด๋ ๋ด๋ถ์์ ๋ช ๋ น ์คํ
docker logs <id or name>
- Docker ๋ก๊ทธ ํ์ธ
docker login
- Docker ๋ก๊ทธ์ธ Docker Hub id,password ์ ๋ ฅ
docker exec -it <id or name> /bin/bash
exec
์ย-it
ย ์ต์ ์ ์ฐ๋ ์ด์-i
: ํ์ค ์ ์ถ๋ ฅ STDIN์ ์ด๊ฒ ๋ค๋ ์๋ฏธ-t
: ๊ฐ์ TTY(Pseudo TTY)๋ฅผ ํตํด ์ ์ํ๊ฒ ๋ค๋ ์๋ฏธ
- Docker ์ปจํ ์ด๋ ์ ์
docker pull username/repo-name:[:tag]
- Docker ์ ์ฅ์ ์ด๋ฏธ์ง pull
docker tag <๋ก์ปฌ ์ด๋ฏธ์ง๋ช
> username/repo-name:[:tag]
- ์ด๋ฏธ์ง ํ๊น (Docker Hub์ฉ)
- Docker Hub์๋
username/repo-name[:tag]
ํ์์ผ๋ก ํธ์ํด์ผ ํ๋ฏ๋ก ํ๊น ์ด ํ์
docker push username/repo-name:[:tag]
- Docker Hub๋ก ์ด๋ฏธ์ง ํธ์
docker rmi username/repo-name:[:tag]
- ํธ์ํ ํ ๋ก์ปฌ์์ ์ด๋ฏธ์ง ์ญ์