Docker의 주요 명령어와 그 역할
명령어 | 설명 | 예시 |
FROM | 컨테이너 이미지를 만들 때 기본으로 사용할 운영체제나 기반 이미지를 지정합니다. | FROM node:18 (node18를 기반으로 컨테이너 생성 합니다.) |
ENV | 컨테이너에서 사용할 환경변수를 설정합니다. | ENV node_env production (node_env라는 변수를 production 값으로 설정 합니다.) |
WORKDIR | 컨테이너 내부에서 작업 디렉토리를 설정합니다. | WORKDIR /app (컨테이너의 /app 디렉토리에서 모든 작업을 시작합니다.) |
COPY | 내 컴퓨터에 있는 파일을 컨테이너로 복사합니다. | COPY . /app (로컬의 현재 디렉토리 내용을 컨테이너의 /app 디렉토리로 복사합니다.) |
ADD | COPY와 비슷하지만 URL에서 파일을 다운로드하거나 압축파일을 자동으로 풀어줍니다. | ADD https://NiceKHJ.com/file.zip /app/ (URL에서 파일을 다운로드하고 /app/ 디렉토리로 복사합니다.) |
RUN | 컨테이너 빌드 과정에서 명령어를 실행합니다. | RUN apt-get update && apt-get install -y curl (패키지 리스트를 업데이트하고 curl을 설치합니다.) |
CMD | 컨테이너가 실행될 때 기본적으로 실행할 명령어를 지정합니다. | CMD ["node", "app.js"] (컨테이너가 실행되면 Node.js로 app.js를 실행합니다.) |
ENTRYPOINT | 컨테이너의 실행 명령어를 고정합니다. CMD와 비슷하지만 추가 명령어와 함께 사용합니다. |
ENTRYPOINT ["nginx", "-g", "daemon off;"] (컨테이너 실행 시 항상 Nginx를 실행합니다.) |
VOLUME | 호스트와 컨테이너 사이에서 데이터를 공유하거나 지속적으로 유지할 디렉토리를 설정합니다. | VOLUME ["/data"] (/data 디렉토리는 컨테이너가 종료되어도 데이터가 유지됩니다.) |
EXPOSE | 컨테이너에서 외부와 연결할 네트워크 포트를 지정합니다. | EXPOSE 3000 (컨테이너의 3000번 포트를 외부와 연결할 준비를 합니다.) |
ARG | Docketfile 빌드 시 사용할 변수(빌드 시점의 값)를 설정합니다. | ARG APP_ENV=production (APP_ENV 라는 변수를 만들어 기본값을 production으로 설정합니다.) |
USER | 컨테이너 내부에서 명령어를 실행할 사용자 계정을 설정합니다. | USER node (node라는 사용자로 명령을 실행합니다.) |
LABEL | 컨테이너 이미지에 정보를 추가합니다. | LABEL maintainer="NiceKHJ@aaa.com" (이미지를 만든 사람의 정보를 기록합니다.) |
SHELL | 명령어를 실행할 기본 쉘을 설정합니다. | SHELL ["bash" , "-c"] (명령어를 bash 쉘 에서 실행합니다.) |
HEALTHCHECK | 컨테이너가 정상적으로 동작하는지 주기적으로 확인합니다. | HEALTHCHECK CMD curl --fail http://localhost:3000 || exit 1 (주소에 접속이 안 되면 컨테이너가 비정상 상태로 간주합니다.) |
ONBUILD | 해당 이미지를 기반으로 다른 이미지를 만들 때 실행될 명령을 설정합니다. | ONBUILD COPY . /app (이 이미지를 기반으로 다른 이미지를 만들 때 파일을 /app에 복사합니다.) |
React + Node + MySQL을 Docker에 적용하기
React 프론트엔드 Node 백엔드 MySQL 데이터베이스를 Docker를 사용하여 통합하고 최적화된 환경을 구성하는 방법 예시
frontend (React 빌드) - Dokerfile
React는 정적 파일로 빌드되므로 Nginx와 같은 정적 파일 서버에서 서빙하는 것이 일반적입니다.
FROM node:18 AS react-build
#작업 디렉토리 설정
WORKDIR /app
#package.json 과 package-lock.json 복사
COPY package*.json ./
#의존성 설치
RUN npm install
#애플리케이션 코드 복사 및 빌드
COPY . .
RUN npm run build
#Nginx를 사용하여 빌드된 파일 서빙
FROM nginx:stable-alpine AS react-serve
#React에서 빌드한 결과물을 Nginx의 기본 HTML 위치에 복사
COPY --from=react-build /app/build /usr/share/nginx/html
#Nginx 컨테이너가 80번 포트를 사용할 수 있도록 노출
EXPOSE 80
#Nginx 실행
CMD ["nginx", "-g", "daemon off;"]
backend (Node.js 서버) - Dockerfile
#Node.js 서버 이미지
FROM node:18
#작업 디렉토리 설정
WORKDIR /app
#package.json과 package-lock.json 복사
COPY package*.json ./
#의존성 설치
RUN npm install
#애플리케이션 코드 복사
COPY . .
#포트 노출
EXPOSE 3000
#서버 실행
CMD ["node", "server.js"]
전역 - docker-compose.yml
version: "3.8"
services:
# React 서비스
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "8080:80" # 호스트의 8080번 포트를 컨테이너의 80번 포트로 매핑
networks: - app-network
# Node.js 서버
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "3000:3000" # 호스트의 3000번 포트를 컨테이너의 3000번 포트로 매핑
environment:
- DB_HOST=database
- DB_USER=root
- DB_PASSWORD=password
- DB_NAME=my_database
depends_on:
- database
networks:
- app-network
# MySQL 데이터베이스
database:
image: mysql:8
ports:
- "3306:3306" # MySQL 기본 포트 / 호스트의 3306번 포트를 컨테이너의 3306번 포트에 매핑
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: my_database
MYSQL_USER: root
MYSQL_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
db_data:
Docker 실행 명렁어
1. Docker 이미지 빌드 :
- docker-compose build
2. 컨테이너 실행 :
- docker-compose up
3. 컨테이너 종료 :
- docker-compose down
'Docker' 카테고리의 다른 글
Docker를 초반에 설정하고 시작해야 하는 이유 (5) | 2024.11.10 |
---|---|
Docker 사용하는 이유 ? (1) | 2024.11.02 |