🐳 Docker 명령어 완벽 가이드

안녕하세요! 오늘은 Docker를 사용하면서 꼭 알아야 할 명령어들을 정리해보려고 합니다. Docker를 처음 접하시는 분들도, 이미 사용 중이신 분들도 유용하게 활용하실 수 있도록 카테고리별로 나누어 설명드리겠습니다.


📦 컨테이너 관리 명령어

🚀 docker run - 컨테이너 생성 및 실행

Docker의 가장 기본이 되는 명령어입니다. 새로운 컨테이너를 생성하고 실행합니다.

# 기본 실행
docker run nginx  
# create & start 명령를 연속적으로 실행하는 것과 같다
# docker create nginx
# docker start -a 생성된 containerID  (-a : attatch)

# 백그라운드에서 실행 (-d 옵션)
docker run -d nginx

# 대화형 모드로 실행 (-it 옵션)
docker run -it ubuntu bash

# 포트 매핑하여 실행 (-p 옵션)
docker run -p 8080:80 nginx

# 컨테이너 이름 지정 (--name 옵션)
docker run --name my-nginx nginx

📋 docker ps - 컨테이너 목록 확인

실행 중인 컨테이너를 확인할 수 있습니다.

# 실행 중인 컨테이너만 보기
docker ps

# 모든 컨테이너 보기 (중지된 것 포함)
docker ps -a

# 최근 생성된 컨테이너 n개만 보기
docker ps -n 5

⏯️ docker start / stop / restart

컨테이너의 상태를 제어하는 명령어들입니다.

docker start 컨테이너명_또는_ID

# 정리할 시간이 준다(바로 종료되지 않는다) 
docker stop 컨테이너명_또는_ID

# 강제종료
docker kill 컨테이너명_또는_ID   

docker restart 컨테이너명_또는_ID

# 여러 컨테이너 동시 제어
docker stop container1 container2 container3

💻 docker exec - 실행 중인 컨테이너에서 명령어 실행

이미 실행 중인 컨테이너 내부에 접속하거나 명령어를 실행할 때 사용합니다.

# 컨테이너 내부 bash 접속
# 1회성이 아니라 계속 명령어 사용이 가능
# 종료할때는 ctrl+d  (일반적인 종료 키는 ctrl + c) 
docker exec -it 컨테이너명 bash
docker exec -it 컨테이너명 sh

# 컨테이너에서 특정 명령어 실행
docker exec 컨테이너명 ls /app
docker exec 컨테이너명 cat /var/log/app.log

🗑️ docker rm - 컨테이너 삭제

# 컨테이너 삭제
docker rm 컨테이너명

# 실행 중인 컨테이너 강제 삭제
docker rm -f 컨테이너명

# 중지된 모든 컨테이너 삭제
docker rm $(docker ps -aq)

🖼️ 이미지 관리 명령어

📸 docker images - 이미지 목록 확인

로컬에 저장된 Docker 이미지 목록을 확인합니다.

docker images

# 중간 이미지까지 모두 보기
docker images -a

⬇️ docker pull - 이미지 다운로드

Docker Hub 등의 레지스트리에서 이미지를 다운로드합니다.

# 최신 버전 다운로드
docker pull nginx

# 특정 버전(태그) 다운로드
docker pull nginx:1.21
docker pull mysql:8.0

🔨 docker build - 이미지 빌드

Dockerfile을 이용해 커스텀 이미지를 빌드합니다.

# 현재 디렉토리의 Dockerfile로 빌드
docker build -t myapp:1.0 .

# 특정 Dockerfile 지정하여 빌드
docker build -t myapp:prod -f Dockerfile.prod .

# 빌드 캐시 사용 안 함
docker build --no-cache -t myapp:1.0 .

❌ docker rmi - 이미지 삭제

docker rmi 이미지명
docker rmi nginx:1.21

# 강제 삭제
docker rmi -f 이미지명

# 사용하지 않는 모든 이미지 삭제
docker rmi $(docker images -q)

🏷️ docker tag - 이미지 태그 지정

docker tag 원본이미지:태그 새이미지명:태그
docker tag myapp:1.0 myapp:latest
docker tag myapp:1.0 myregistry.com/myapp:1.0

📊 로그 및 모니터링

📝 docker logs - 컨테이너 로그 확인

컨테이너의 표준 출력 로그를 확인합니다.

# 전체 로그 확인
docker logs 컨테이너명

# 실시간 로그 확인 (tail -f와 유사)
docker logs -f 컨테이너명

# 마지막 N줄만 보기
docker logs --tail 100 컨테이너명

# 타임스탬프와 함께 보기
docker logs -t 컨테이너명

🔍 docker inspect - 상세 정보 확인

컨테이너나 이미지의 상세한 메타데이터를 JSON 형식으로 확인합니다.

docker inspect 컨테이너명
docker inspect 이미지명

# 특정 정보만 추출
docker inspect --format='{{.NetworkSettings.IPAddress}}' 컨테이너명

📈 docker stats - 리소스 사용량 모니터링

컨테이너의 CPU, 메모리, 네트워크 사용량을 실시간으로 확인합니다.

# 모든 컨테이너의 리소스 사용량
docker stats

# 특정 컨테이너만 모니터링
docker stats 컨테이너명

🌐 네트워크 및 볼륨

🔗 docker network - 네트워크 관리

# 네트워크 목록 확인
docker network ls

# 새 네트워크 생성
docker network create my-network

# 네트워크 상세 정보
docker network inspect my-network

# 컨테이너를 네트워크에 연결
docker network connect my-network 컨테이너명

# 네트워크 삭제
docker network rm my-network

💾 docker volume - 볼륨 관리

데이터를 영구적으로 저장하기 위한 볼륨을 관리합니다.

# 볼륨 목록 확인
docker volume ls

# 볼륨 생성
docker volume create my-volume

# 볼륨 상세 정보
docker volume inspect my-volume

# 볼륨 삭제
docker volume rm my-volume

# 사용하지 않는 볼륨 모두 삭제
docker volume prune

⚙️ 자주 사용하는 옵션

docker run 명령어에서 자주 사용되는 옵션들입니다.

옵션 설명 예시

-d 백그라운드 실행 (detached mode) docker run -d nginx
-it 대화형 터미널 모드 docker run -it ubuntu bash
-p 포트 매핑 (호스트:컨테이너) docker run -p 8080:80 nginx
-v 볼륨 마운트 docker run -v /host/path:/container/path nginx
--name 컨테이너 이름 지정 docker run --name my-app nginx
-e 환경 변수 설정 docker run -e ENV=prod nginx
--rm 컨테이너 종료 시 자동 삭제 docker run --rm ubuntu
--network 네트워크 연결 docker run --network my-net nginx
--restart 재시작 정책 docker run --restart always nginx

💡 실전 예제

# 웹 서버를 백그라운드에서 실행하고 포트 매핑
docker run -d -p 8080:80 --name my-web nginx

# 환경 변수와 볼륨을 사용하는 데이터베이스
docker run -d \
  --name my-db \
  -e MYSQL_ROOT_PASSWORD=secret \
  -v mysql-data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0

# 자동 재시작 설정과 함께 애플리케이션 실행
docker run -d \
  --name my-app \
  --restart unless-stopped \
  -p 3000:3000 \
  myapp:latest

🧹 정리 명령어

시스템 리소스를 확보하기 위한 정리 명령어들입니다.

🗂️ docker system prune

# 중지된 컨테이너, 미사용 네트워크, dangling 이미지 삭제
docker system prune

# 사용하지 않는 이미지까지 모두 삭제
docker system prune -a

# 볼륨까지 삭제
docker system prune -a --volumes

# 확인 없이 바로 삭제
docker system prune -f

🔧 개별 정리 명령어

# 중지된 컨테이너만 삭제
docker container prune

# 사용하지 않는 이미지 삭제
docker image prune

# 사용하지 않는 볼륨 삭제
docker volume prune

# 사용하지 않는 네트워크 삭제
docker network prune

✨ 마무리

Docker의 주요 명령어들을 살펴봤습니다. 처음에는 많아 보일 수 있지만, 실제로는 run, ps, logs, exec, stop 정도만 알아도 기본적인 사용에는 문제가 없습니다.

🎯 초보자라면 먼저 익혀야 할 명령어:

  1. docker run - 컨테이너 실행
  2. docker ps - 실행 중인 컨테이너 확인
  3. docker logs - 로그 확인
  4. docker exec -it 컨테이너명 bash - 컨테이너 접속
  5. docker stop - 컨테이너 중지

실무에서는 주로 docker-compose를 사용하지만, 기본 명령어를 이해하고 있으면 트러블슈팅이나 간단한 테스트에 매우 유용합니다.

궁금한 점이나 추가로 다뤄줬으면 하는 내용이 있다면 댓글로 남겨주세요! 😊

🏷️ 태그: #Docker #컨테이너 #DevOps #개발환경 #도커명령어

 

💡 docker ps 명령어란?

docker ps 명령어는 Docker 환경에서 현재 실행 중인 컨테이너들의 목록과 주요 정보를 확인하는 데 사용되는 핵심 명령어입니다.

실제로 이 명령어는 컨테이너의 상태를 모니터링하고, 특정 컨테이너를 관리(정지, 제거 등)하기 위한 식별자(ID 또는 Name)를 얻는 데 가장 많이 활용됩니다.

기본 구문

docker ps

(Tip: 아무 옵션 없이 실행하면, Up 상태인 실행 중 컨테이너만 표시됩니다.)


🛠️ 자주 사용하는 핵심 옵션

docker ps에 옵션을 추가하여 실행 중이지 않은 컨테이너까지 확인하거나, 필요한 정보만 추출할 수 있습니다.

옵션 전체 옵션 이름 설명 활용 예시
-a --all 실행/정지된 모든 컨테이너 목록을 표시합니다. 컨테이너를 정리할 때 필수입니다. docker ps -a
-q --quiet 컨테이너의 ID만 표시합니다. 다른 명령어와 조합할 때 유용합니다. docker ps -q
-n   가장 최근에 생성된 컨테이너를 지정된 개수만큼 표시합니다. docker ps -n 5
-s --size 컨테이너의 가상 크기 정보를 추가로 표시합니다. docker ps -s
-f --filter 특정 조건으로 컨테이너 목록을 필터링합니다. docker ps -f status=exited

✨ 활용 Tip: 모든 정지 컨테이너 한 번에 삭제

-a와 -q, 그리고 -f 옵션을 조합하면 정지된 컨테이너만 골라 ID를 출력하고, 이를 삭제 명령어에 넘겨줄 수 있습니다.

docker rm $(docker ps -aq -f status=exited)

#Windows cmd를 사용하는 경우
FOR /f "tokens=*" %i IN ('docker ps -aq') DO docker rm -f %i

설명: docker ps -aq -f status=exited가 정지된 컨테이너 ID 목록을 출력하고, 이 ID 목록이 docker rm 명령어의 인자로 전달됩니다.


📊 출력 정보 상세 분석 (7가지 필드)

docker ps 실행 시 나오는 7가지 주요 열 정보에 대해 정확히 이해하는 것이 중요합니다.

열 이름 상세 설명
CONTAINER ID 컨테이너를 고유하게 식별하는 식별자(ID)의 약식입니다. 모든 Docker 명령에서 해당 컨테이너를 지정할 때 사용합니다.
IMAGE 이 컨테이너를 생성하는 데 사용된 Docker 이미지의 이름과 태그입니다. (예: nginx:latest)
COMMAND 컨테이너가 시작될 때 가장 먼저 실행되는 기본 명령어입니다.
CREATED 해당 컨테이너가 생성된 시점으로부터 현재까지 경과한 시간입니다.
STATUS 컨테이너의 현재 상태를 나타냅니다.
Up (X): 정상 실행 중
Exited (0): 정상 종료됨 (종료 코드 0은 성공)
Exited (1이상): 오류/비정상 종료됨
PORTS 컨테이너의 내부 포트와 호스트 머신의 외부 포트 간의 포트 포워딩(매핑) 정보입니다.

형식: 0.0.0.0:외부포트->컨테이너포트/프로토콜
NAMES 컨테이너의 고유한 이름입니다. ID 대신 식별자로 사용할 수 있으며, 사용자가 지정하지 않으면 Docker가 임의로 생성합니다.

📝 마무리하며

docker ps는 Docker 환경 관리의 시작이자 끝이라고 해도 과언이 아닙니다. 이 명령어와 주요 옵션만 숙지하셔도 컨테이너의 생명주기를 파악하고 관리하는 데 큰 어려움이 없을 것입니다.

#Docker #도커 #docker_ps #컨테이너 #개발자

[도커(docker)] docker-compose를 이용하여 react app 서버 설치 및 개발 환경 구성하기

 

🖥️ Dockerfile를 이용하여 react app 서버 설치 및 개발 환경 구성하기

 

 

[도커(docker)] Dockerfile를 이용하여 react app 서버 설치 및 개발 환경 구성하기

[도커(docker)] Dockerfile를 이용하여 react app 서버 설치 및 개발 환경 구성하기📢  작성순서 📌 로컬에서 react app 설치 및 환경구성   📌 Dockerfile 파일 작성📌 Docker image 빌드📌 Do

happyldh.tistory.com

💡이전글에서 Dockerfile 파일과 docker build 명령어와 docker run 명령어를 이용하여  서버 설치 및 환경 구성했는데 docker-compose를 이용하면 한번에 설치 및 구성을 할 수 있습니다. 

📌docker-compose를 이용하여 react app 서버 설치 및 개발 환경 구성하기

📝 docker-compose.yml 파일 생성

version: '3'
services:
  react:
    build: 
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - /usr/src/app/node_modules
      - .:/usr/src/app
    stdin_open: true

 

👉  파일내용에 대한 설명입니다. 

version: '3'  # 사용할 Docker Compose 파일의 버전 (v3)

services:
  react:  # 'react'라는 이름의 서비스 정의
    build: 
      context: .  # 현재 디렉터리를 빌드 컨텍스트로 사용
      dockerfile: Dockerfile  # React 개발을 위한 Dockerfile 지정 (Dockerfile)

    # 포트 매핑으로 로컬에서 React 개발 서버 접속 가능
    ports:
      - "3000:3000"  # 호스트의 3000번 포트를 컨테이너의 3000번 포트와 연결 (React 개발 서버용)

    # 로컬 코드 변경 사항을 컨테이너에 자동 반영
    # volumes 설정 덕분에 이미지 빌드를 하지 않고 코드를 수정하면 바로 반영됩니다.
    # 단, 서버는 재실행해야 반영됩니다.
    volumes:
      # 컨테이너 내부의 node_modules 폴더는 유지하여, 로컬 파일과 충돌 방지
      - /usr/src/app/node_modules  
      # 현재 디렉터리의 모든 파일을 컨테이너의 /usr/src/app에 마운트 (소스 코드 실시간 반영)
      - .:/usr/src/app  

	# 컨테이너를 실행할 때 표준 입력을 열어 인터랙티브 모드 활성화
    # react 서버 구성시 사용
    stdin_open: true


📝 이미지 빌드 및 서버 실행

docker-compose up


👉 실행결과입니다.

 

🚀 지금까지 docker compose를 이용한 방법에 대해 알아봤습니다. 


 

 

 

 

[도커(docker)] Dockerfile를 이용하여 react app 서버 설치 및 개발 환경 구성하기

📢  작성순서 

📌 로컬에서 react app 설치 및 환경구성   

📌 Dockerfile 파일 작성

📌 Docker image 빌드

📌 Docker에서 react app 실행

 

📌로컬에서 react app 설치 및 환경구성  

 

[react] react 설치하기 - Create React App

[react] react 설치하기 - Create React App📢  작업순서 📌 Node.js 및 npm 설치📌 Create React App 설치📌 React 앱 실행📌 Node.js 및 npm 설치  💡 React 앱을 개발하려면 Node.js가 필요합니다. Node.js에

happyldh.tistory.com

 

📌  Dockerfile 파일 작성

루트 폴더에서  Dockerfile 파일을 작성한다. 

FROM node:alpine

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

CMD ["npm", "start"]

 

📌  Docker image 빌드 

docker build 명령을 이용하여 image를 생성한다. 

# react-app 이름으로 이미지를 빌드한다. 
docker build -t react-app .

 

📌  Docker에서 react app 실행

 docker run 명령을 이용하여 react app를 실행한다.

docker run -it -p 3000:3000 -v /usr/src/app/node_modules -v %cd%:/usr/src/app react-app

👉 명령에 대한 설명입니다.

docker run 
  # 인터랙티브 모드(-i)와 터미널(-t)을 활성화하여 컨테이너 내에서 명령어 입력 가능하게 함
  -it   
  
  # 호스트의 3000번 포트를 컨테이너의 3000번 포트에 연결
  -p 3000:3000   
  
  # 컨테이너의 node_modules 디렉터리를 볼륨으로 유지하여 로컬파일을 참조하지 않도록 함
  # 로컬 파일과 충돌 방지
  -v /usr/src/app/node_modules  
  
  # 현재 디렉터리(%cd%)를 컨테이너의 /usr/src/app에 마운트하여 실시간 코드 변경 반영
  -v %cd%:/usr/src/app 
  
  # 실행할 도커 이미지 (React 앱을 포함한 이미지)
  react-app



👉 실행결과입니다.

 

 

 

 

 

 

 

[도커(docker)] docker build 명령어 사용법 - Dockerfile 

⚙ docker build 명령어는 Docker 이미지를 빌드하는 데 사용됩니다. 보통 Dockerfile을 기반으로 하며, 해당 디렉터리에서 지정된 명령어를 실행하여 이미지를 생성합니다.

🟢  기본 명령어 

# 해당 폴더의 Dockerfile파일을 이용하여 이미지를 생성합니다.
docker build .


🟢  이미지 이름 지정 ( -t)

# 이미지 이름을 myapp으로 지정
docker build -t myapp .


🟢  Dockerfile 이름 및 경로 지정 ( -f)

# Dockerfile의 이름이 다르거나 경로가 다른경우 
docker build -f ./app/Dockerfile.dev .



 

 

 

 

 

 

 

 

[도커(docker)] Docker Compose로 Node.js Express 서버와 Redis 연동하기

📢  작성순서 

📌 Express 서버 구성

📌 Express 서버용 Dockerfile 만들기

📌 Docker Compose 설정
📌 Docker Compose 실행

 

💻 참고 페이지 

📝 [도커(docker)] Dockerfile를 이용하여 nodejs & express 서버 설치 및 개발 환경 구성하기

 

[도커(docker)] Dockerfile를 이용하여 nodejs & express 서버 설치 및 개발 환경 구성하기

[도커(docker)] Dockerfile를 이용하여 nodejs & express 서버 설치 및 개발 환경 구성하기  📢  작성순서 📌 Node.js Express 서버 코드 작성📌 Docker 설정 파일 작성📌 Docker 컨테이너 실행 📌  Node.j

happyldh.tistory.com


📌  프로젝트 디렉터리 구조

📝 프로젝트 폴더 아래처럼 구성하겠습니다.

express-redis-app/
│── docker-compose.yml    # Docker Compose 설정 파일
│── app/                  # Node.js Express 서버 코드
│   ├── Dockerfile        # dockerfile
│   ├── server.js         # Express 서버 코드
│   ├── package.json      # Node.js 패키지 설정 파일

📌  Express 서버 구성 

📝 package.json 파일 생성 

/app 폴더에서 아래의 명령어를 이용해서 package.json 파일을 생성한다.

npm init -y

생성된 파일 내용을 아래와 같이 변경한다.

{
  "name": "express-redis-app",  // 프로젝트 이름
  "version": "1.0.0",  // 프로젝트 버전
  "main": "index.js",  // 기본 실행 파일 (사용되지 않음, "start" 스크립트에서 server.js 사용)
  "scripts": {
    "start": "node server.js",  // 서버 실행 명령어 (server.js 파일을 실행)
    "test": "echo \"Error: no test specified\" && exit 1"  // 테스트 스크립트 (현재 테스트 없음)
  },
  "keywords": [],  // 프로젝트 관련 키워드 (비어 있음)
  "author": "",  // 작성자 정보 (비어 있음)
  "license": "ISC",  // 오픈소스 라이선스 (ISC 라이선스 적용)
  "description": "",  // 프로젝트 설명 (비어 있음)
  "dependencies": {
    "express": "^4.21.2",  // Express.js 최신 버전 (4.21.2 이상)
    "redis": "^4.7.0"  // Redis 클라이언트 최신 버전 (4.7.0 이상)
  }  
}

🙌 local에서 구현하는 방법은 상단에 Dockerfile를 이용하여 nodejs & express 서버 설치 및 개발 환경 구성하기 링크를 이용하여 확인하세요

📝 server.js 파일 생성 

/app 폴더에 editor(vscode등)을 이용하여 Redis 연동코드를 server.js파일에 작성한다. 

const express = require('express'); // Express.js 프레임워크 모듈 불러오기
const redis = require('redis'); // Redis 클라이언트 모듈 불러오기

const app = express();
const PORT = 3000; // 서버가 실행될 포트 번호

// Redis 클라이언트 설정
const redisClient  = redis.createClient({
    socket: {
        host: 'redis', // Docker Compose에서 정의한 Redis 컨테이너의 이름
        port: 6379 // Redis 기본 포트
    }
});

// Redis 서버에 연결
redisClient.connect()
    .then(() => console.log('Redis connected')) // 연결 성공 시 메시지 출력
    .catch((err) => console.error("❌ Redis 연결 실패:", err)); // 연결 실패 시 오류 출력

// 기본 라우트 설정
app.get('/', async (req, res) => {     
    let count = await redisClient.get('count'); // Redis에서 'count' 키의 값을 가져옴
    if (!count) {
        count = 0; // 값이 없으면 기본값 0으로 설정
    } 

    count = parseInt(count) + 1; // 방문자 수 증가
    await redisClient.set('count', count); // 증가된 값을 Redis에 저장
    res.send(`Hello World! ${count}`); // 응답으로 방문 횟수 출력
});

// 서버 실행
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`); // 서버 실행 메시지 출력
});

 

📌  Express 서버용 Dockerfile 만들기

📝 /app 폴더에 Dockerfile를 생성한다. 

# Node.js 18 버전의 공식 이미지를 기반으로 함
FROM node:18

# 작업 디렉터리 설정
WORKDIR /usr/src/app

# package.json과 package-lock.json을 복사
COPY package*.json .

# 의존성 설치
RUN npm install 

# 모든 파일을 컨테이너로 복사
COPY . .

# 애플리케이션 실행
CMD ["npm", "start"]

 

📌  Docker Compose 설정

📝 Root 폴더에 docker-compose.yml을 작성해서 Express와 Redis 서버를 하나의 네트워크에서 실행하자

version: '3'  # Docker Compose 파일의 버전 지정

services:
  redis:
    image: "redis:latest"  # 최신 Redis 이미지를 사용하여 컨테이너 실행
    container_name: "redis-server"  # 컨테이너의 이름을 "redis-server"로 지정
    ports:
      - "6379:6379"  # 호스트의 6379 포트를 컨테이너의 6379 포트에 매핑 (Redis 기본 포트)

  app:
    build: ./app  # ./app 디렉터리에 있는 Dockerfile을 기반으로 애플리케이션 빌드
    container_name: "express-server"  # 컨테이너의 이름을 "express-server"로 지정
    ports:
      - "3000:3000"  # 호스트의 3000 포트를 컨테이너의 3000 포트에 매핑
    depends_on:
      - redis  # "redis" 서비스가 먼저 실행된 후 "app" 서비스가 실행됨
    volumes:
      - ./app:/usr/src/app  # 로컬의 "./app" 디렉터리를 컨테이너의 "/usr/src/app"에 매핑
      - /usr/src/app/node_modules  # "node_modules" 디렉터리는 호스트와 공유하지 않음 (컨테이너 내부에서만 유지)
    environment:
      - REDIS_HOST=redis  # Redis 서버의 호스트명을 "redis"로 설정 (Docker Compose 내 서비스 이름 사용 가능)
      - REDIS_PORT=6379  # Redis 포트를 6379로 설정

 

📌  Docker Compose 실행

📝 docker-compose up 명령을 실행해서 Redis와 Express 서버를 함께 실행하자.

docker-compose up --build

👉 터미널 출력결과

👉 docker images 화면

👉 docker containers 화면

👉 브라우저 접속 화면

👉 새로고침을 할때마다 숫자가 1씩 증가합니다.

🚀 지금까지 Docker Compose를 이용하여 Node.js Express 서버와 Redis서버 두개의 docker를 연동하는 방법을 알아보았습니다 

 

 



 

 

 

[도커(docker)] Dockerfile를 이용하여 nodejs & express 서버 설치 및 개발 환경 구성하기 

📢  작성순서 

📌 Node.js Express 서버 코드 작성

📌 Docker 설정 파일 작성

📌 Docker 컨테이너 실행

📌  Node.js Express 서버 코드 작성

📝 프로젝트 디렉토리 생성

터미널에서 아래 명령어를 실행하여 프로젝트 디렉토리를 만든다

mkdir docker-nodejs
cd docker-nodejs

📝 Node.js 프로젝트 초기화

아래 명령어를 실행하여 package.json 파일을 생성한다.

npm init -y

📝 Express 설치

아래 명령어를 실행하여  Express 프레임워크를 설치한다.

npm install express

🛠  package.json 파일 내용을 확인합니다.

📝 Express 서버 코드 작성

server.js 파일을 생성하고 아래 코드를 입력한다.

const express = require('express');

const PORT = 8080;
const HOST = '0.0.0.0';

const app = express();

app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(PORT, HOST);
console.log(`Server running at http://${HOST}:${PORT}/`);

📝 Express 서버 실행 

터미널에서 아래 명령어를 입력하여 서버를 실행합니다.

node server.js
결과 > Server running at http://0.0.0.0:8080/

🛠  브라우저를 이용해 실행 화면을 확인합니다.

터미널에서 확인 후 종료한다(Ctrl + C) 


📌  Docker 설정 파일 작성

📝 Dockerfile 파일 생성

Dockerfile의 이름으로 파일을 만들고 다음 내용을 추가한다.

FROM node

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install 

COPY ./ ./

EXPOSE 8080 

CMD ["node", "server.js"]

🛠  Dockerfile 작성에 사용된 명령어 설명

# 1. Node.js 베이스 이미지 사용
FROM node:18

# 2. 작업 디렉토리 생성
WORKDIR /usr/src/app

# 3. package.json과 package-lock.json 복사
# 3, 4, 5번 순서 주의!!! 
# 불필요한 npm install 작업을 줄여준다. 
COPY package*.json ./

# 4. npm 패키지 설치
RUN npm install

# 5. 애플리케이션 소스 코드 복사
COPY . .

# 6. 컨테이너에서 사용할 포트 지정
EXPOSE 3000

# 7. 서버 실행
CMD ["node", "server.js"]

📌  Docker 컨테이너 실행

📝 Docker 이미지 빌드

  아래 명령어를 실행하여 도커 이미지를 빌드한다.

docker build -t my-express-app .

📝 컨테이너 실행

  이미지를 빌드한 후 컨테이너를 실행한다.

docker run -p 3000:8080 my-express-app

🛠 이제 http://localhost:3000에 접속하면 Docker 컨테이너에서 Express 서버가 실행된다.

📝 volume 설정 

  volume를 설정하면 이미지를 재생성하지 않아도 프로그램 소스를 변경할 수 있습니다.

docker run -p 3000:8080 -v /usr/src/app/node_modules -v %cd%:/usr/src/app my-express-app

🛠 명령에 대한 설명입니다. 

docker run \
  -p 3000:8080 \                     
  # 로컬 호스트의 3000번 포트를 컨테이너의 8080 포트에 매핑
  # 로컬 호스트의 3000번 포트로 접속하면 컨테이너 내부의 8080 포트로 요청이 전달됨.
  
  -v /usr/src/app/node_modules \      
  # 컨테이너 내부의 'node_modules' 디렉토리를 호스트와 공유하지 않음 (빈 볼륨 마운트)
  # 이렇게 하면 node_modules가 호스트의 영향을 받지 않고 컨테이너 내에서만 유지됨.
  
  -v %cd%:/usr/src/app \              
  # 현재 디렉터리 (%cd%)를 컨테이너의 '/usr/src/app' 디렉터리에 마운트 (윈도우 기준)
  # 이를 통해 로컬에서 파일을 수정하면 컨테이너 내부에서도 반영됨.
  # %cd%는 Windows cmd에서 현재 디렉토리를 의미함.
  # Linux/macOS에서는 $PWD를 사용하여 대체
  
  my-express-app                      
  # 'my-express-app'이라는 이름의 도커 이미지로 컨테이너 실행
  # 사전에 docker build -t my-express-app . 같은 명령어로 빌드되었어야 함.

  소스 수정후 컨테이너를 재시작하면 변경사항이 적용됩니다. 

docker restart 컨테이너-이름



 

 

 



[도커(docker)] 도커에 MariaDB 설치 및 실행하기

📝 MariaDB 이미지 다운로드

먼저, Docker Hub에서 MariaDB 이미지를 다운로드합니다.

docker pull mariadb

📝 컨테이너 생성 및 실행

 먼저, Docker Hub에서 MariaDB 이미지를 다운로드합니다.

docker run -p 3306:3306 --name mariadb-container -e MARIADB_ROOT_PASSWORD=1234 -d mariadb

🛠 명령어 설명

docker run                # 새로운 컨테이너를 생성하고 실행
    -p 3306:3306          
    # 호스트의 3306 포트를 컨테이너의 3306 포트와 연결 (MySQL/MariaDB 기본 포트)
    # MariaDB의 기본 포트(3306번)를 호스트와 컨테이너에서 동일하게 연결하여 외부에서 접근할 수 있도록 함.
    
    --name mariadb-container   
    # 컨테이너의 이름을 'mariadb-container'로 지정
    # 컨테이너에 mariadb-container라는 이름을 부여하여 관리하기 쉽게 만듦.
    
    -e MARIADB_ROOT_PASSWORD=1234   
    # MariaDB의 root 계정 비밀번호를 '1234'로 설정
    
    -d                    
    # 컨테이너를 백그라운드에서 실행 (detached mode)
    # 컨테이너를 백그라운드에서 실행하여 터미널을 차단하지 않음.
    
    mariadb                # 사용할 이미지 이름 (MariaDB 공식 이미지)

📝 컨테이너 상태 확인

실행 중인 컨테이너 목록을 확인하여 MariaDB 컨테이너가 정상적으로 실행되고 있는지 확인합니다.

docker ps

📝 컨테이너 내부 접속 및 MariaDB 사용

컨테이너 내부로 접속하여 MariaDB를 사용할 수 있습니다.

docker exec -it mariadb-container mariadb -uroot -p

 DBeaver와 같은 툴을 이용하여 접근 & 관리도 가능합니다. 

이러한 과정을 통해 Docker 환경에서 MariaDB를 설치하고 사용할 수 있습니다.

 

 

 

[도커(docker)] 도커로 RabbitMQ 설치 및 실행하기

docker run -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3-management

♣ 명령어 설명

docker run
새로운 컨테이너를 실행하는 명령어입니다.

-d (Detached mode)
컨테이너를 백그라운드에서 실행합니다.
즉, 터미널을 차지하지 않고 백그라운드에서 실행됩니다.

--hostname my-rabbitmq
컨테이너 내부에서 사용할 호스트 이름을 my-rabbitmq으로 설정합니다.
네트워크에서 my-rabbit이라는 이름으로 컨테이너를 찾을 수 있습니다.

--name some-rabbitmq
컨테이너의 이름을 some-rabbitmq으로 설정합니다.
docker ps로 실행 중인 컨테이너 목록을 볼 때 이 이름이 표시됩니다.

-p 5672:5672 (메시징 포트 개방)
호스트의 5672 포트를 컨테이너의 5672 포트와 연결(포트 매핑)합니다.
**RabbitMQ의 기본 메시지 브로커 포트(5672)**를 호스트의 5672 포트와 연결합니다.
애플리케이션이 RabbitMQ와 메시지를 주고받을 때 이 포트를 사용합니다.
예를 들어, Python, Java, Node.js 애플리케이션이 RabbitMQ에 연결할 때 이 포트를 통해 통신합니다.

-p 15672:15672 (관리 UI 포트 개방)
호스트의 15672 포트를 컨테이너의 15672 포트와 연결(포트 매핑)합니다.
15672 포트는 **RabbitMQ 관리 웹 인터페이스 (Management Plugin)**에 사용됩니다.
브라우저에서 http://localhost:15672로 접속하면 RabbitMQ 웹 UI에 접근할 수 있습니다.

rabbitmq:3-management
rabbitmq:3-management 이미지로 컨테이너를 실행합니다.
rabbitmq:3-management 태그는 RabbitMQ 3.x 버전 + 관리 플러그인이 포함된 버전입니다.
기본 RabbitMQ는 웹 UI가 없지만, -management 태그가 붙은 이미지는 관리 기능을 포함하고 있습니다.

♣ 컨테이너가 정상 실행 중인지 확인하는 방법

docker ps

♣  RabbitMQ 기본 계정 정보

기본 사용자: guest
기본 비밀번호: guest
웹 UI 접속: http://localhost:15672


♣ 웹 UI 접속 화면 : http://localhost:15672

♣ 로그인후 화면 - 기본 아이디 패스워드 : guest/guest


♣ RabbitMQ 컨테이너를 종료하는 방법

docker stop some-rabbitmq

♣ RabbitMQ 컨테이너를 삭제하는 방법

docker rm some-rabbitmq

- some-rabbitmq 컨테이너를 삭제합니다.
- 삭제 전에 컨테이너를 stop해야 합니다.


 

 

 

 

 

도커란 무엇인가?

도커(Docker)는 애플리케이션을 컨테이너라는 단위로 패키징하여 실행할 수 있게 해주는 플랫폼입니다. 간단히 말해, 개발자가 코드를 작성하고 이를 테스트 및 배포하는 과정을 간편하게 만들어주는 도구입니다.


 

1. 도커의 핵심 개념

 

컨테이너란 무엇인가?

컨테이너는 애플리케이션과 실행 환경(라이브러리, 종속성 등)을 하나로 묶어 운영체제(OS)와 독립적으로 실행할 수 있도록 만들어주는 가상화 기술입니다. 가상머신(Virtual Machine)과 달리, 컨테이너는 호스트 OS의 커널을 공유하여 가볍고 빠르게 동작합니다.

 

가상 머신과의 차이점

항목 컨테이너 가상 머신(VM)
크기 MB 단위 (가볍다) GB 단위 (무겁다)
시작 속도 초 단위 (빠르다) 분 단위 (느리다)
리소스 사용 효율적 (호스트 OS 공유) 비효율적 (각 OS 별도 실행)

 

도커 이미지와 컨테이너

  • 도커 이미지(Docker Image): 실행 가능한 애플리케이션의 모든 것을 포함하는 읽기 전용 템플릿입니다.

도커 이미지는 애플리케이션과 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 읽기 전용 템플릿입니다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정이 포함됩니다. 이미지는 변경되지 않으며, 여러 컨테이너를 생성하는 데 사용될 수 있는 "청사진" 또는 "클래스"와 같습니다. 도커 이미지는 레이어(layer)로 구성되어 있어서 효율적으로 빌드되고 저장될 수 있습니다.

  • 도커 컨테이너(Docker Container): 이미지를 실행한 상태로, 동작 중인 가상 환경입니다.

도커 컨테이너는 도커 이미지를 기반으로 실행되는 독립적인 환경입니다. 이미지를 "실행 가능한 인스턴스"로 만든 것이라고 생각할 수 있습니다. 각 컨테이너는 격리된 공간에서 실행되며, 서로 영향을 주지 않습니다. 컨테이너는 이미지를 기반으로 하지만, 컨테이너 내부에서 변경된 내용은 해당 컨테이너에만 적용됩니다. 컨테이너는 애플리케이션을 호스트 환경과 격리시켜 충돌을 방지하고 이식성을 높입니다.

  • 도커 이미지와 컨테이너의 관계

도커 이미지는 컨테이너를 만들기 위한 "설계도"이고, 도커 컨테이너는 그 설계도를 바탕으로 만들어진 "실제 인스턴스"입니다. 하나의 이미지를 가지고 여러 개의 컨테이너를 생성할 수 있으며, 각 컨테이너는 독립적으로 실행됩니다. 마치 붕어빵 틀(이미지)로 여러 개의 붕어빵(컨테이너)을 만드는 것과 같다고 비유할 수 있습니다.


 

2. 도커를 사용하는 이유

1) 일관된 환경 제공

  • 도커는 개발 환경과 배포 환경의 차이로 발생하는 문제를 해결합니다. 컨테이너 안에서 실행되는 애플리케이션은 어디서나 동일하게 동작합니다.

2) 경량성과 효율성

  • 컨테이너는 OS 레벨 가상화로 동작하기 때문에 가상머신보다 훨씬 가볍고 빠릅니다. 리소스를 효율적으로 사용하여 여러 컨테이너를 동시에 실행할 수 있습니다.

3) 빠른 배포와 확장

  • 컨테이너를 사용하면 애플리케이션을 빌드하고 배포하는 시간이 단축됩니다. 필요에 따라 컨테이너 수를 빠르게 늘리거나 줄일 수 있습니다.

 

 

3. 도커의 실제 활용 사례

  • 개발 환경 통합: 모든 개발자가 동일한 환경에서 작업 가능.
  • 테스트 환경 구성: 테스트를 위한 독립적인 환경을 빠르게 생성.
  • 애플리케이션 배포: 컨테이너를 통해 클라우드에 쉽게 배포.
  • 마이크로서비스: 각 서비스를 독립적인 컨테이너로 실행하여 관리.

4. 간단한 비유

도커를 이해하기 쉽도록 비유하자면:

  • 도커 이미지는 요리 레시피이고,
  • 도커 컨테이너는 그 레시피로 만든 요리입니다. 레시피(이미지)를 기반으로 언제든지 동일한 요리(컨테이너)를 만들 수 있습니다.

5. 도커의 장점 한눈에 보기

  • 플랫폼 독립성: 한 번 만들면 어디서나 실행 가능.
  • 효율성: 하드웨어 자원을 적게 사용.
  • 확장성: 배포 및 스케일링이 간단.
  • 생산성: 개발, 테스트, 배포 사이의 간격을 줄임.

다음 포스팅에서는 "도커를 설치하고 Hello World 실행하기"를 알아보겠습니다. 도커와 함께 컨테이너의 세계로 첫발을 내디뎌 보세요!

+ Recent posts