Docker

Docker 명령어 및 사용

NiceKHJ 2024. 11. 24. 23:50

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