Docker

[프로젝트] NestJS, NextJS 도커 환경 설정 (도커 네트워크)

sian han 2023. 5. 14. 15:15

 

 

NestJS 글로벌 설치

npm install -g @nestjs/cli

 

프로젝트 폴더 생성

프로젝트 명 : scrumble

nest new scrumble

 

서버 실행

npm run start:dev

 

3000 번 포트 사용중이라서 3700번 포트연결

//main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3700); //3000->3700
}
bootstrap();

root 경로에 Dockerfile 생성

 

Dockerfile

  - <<도커 이미지>> 를 생성하기 위한 명령어들이 포함되어있는 스크립트 파일

  - Dockerfile 을 사용해 도커이미지를 생성할 때는 docker build 명령어를 사용한다. 

도커 이미지 만드는 절차

1. 베이스 이미지를 선택

2. 호스트머신의 파일을 도커 이미지로 복사

3. 도커 컨테이너의 포트를 호스트머신과 연결

4. 컨테이너가 시작될 때 실행할 명령어 지정

 

 

FROM node:16-alpine As development

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .
RUN npm run build

EXPOSE 3700

CMD ["npm", "run", "start"]

 

FROM node:16-alpine As development

FROM : 베이스 이미지 지정

  - Node 16 Alpine Linux 를 베이스 이미지로 사용함

  - AS : 이미지 이름 정의

 

WORKDIR /usr/src/app

WORKDIR : 작업디렉토리 설정

 

COPY {복사할파일(호스트머신 경로)} ... {복사할 파일을 이미지에 복사할 곳(Docker 컨테이너 내부경로)}
COPY package*.json ./

COPY : 호스트머신의 디렉토리나 파일을 Docker 이미지의 파일시스템으로 복사해줌

  - 호스트의 package*.json 파일들을 ./ 로 복사함. 

  - ./ 는 WORKDIR 로 설정된 /usr/src/app 경로이다

 

RUN npm install

RUN : 도커 이미지를 빌드할 때 실행될 명령어를 지정

  - 도커 이미지를 빌드할 때 npm install 을 실행해 package*.json 파일에 정의된 패키지들을 설치한다

 

COPY . .

 - 호스트머신의 모든 파일과 디렉토리를 WORKDIR 로 설정된 '/usr/src/app' 경로로 복사한다

 

EXPOSE 3700

EXPOSE : 호스트머신과 연결될 컨테이너 포트를 지정

  - 컨테이너의 3700번 포트를 호스트머신과 연결했음

 

CMD ["npm", "run", "start"]

CMD : 도커 이미지를 실행할 때 컨테이너가 시작될 때 실행할 기본 명령어를 지정한다

  - CMD 명령어는 Dockerfile 에서 한번만 사용할 수 있음

  - JSON 배열 형식으로 작성됨

 

 

도커 이미지 생성

docker build -t 이미지이름 .
docker build -t scrumble .

-t : 이미지 이름 지정

. : <<현재 디렉토리>>를 빌드 컨텍스트로 사용할꺼임

 

컨테이너 실행

docker run {컨테이너ID}

 

컨테이너 명 수정

scrumble git:(main) ✗ docker rename strange_germain scrumble

 

scrumble git:(main) ✗ docker exec -it scrumble bash // bash 없음
scrumble git:(main) ✗ docker exec -it scrumble sh // sh 쉘로 접속

sh 로 접속했지만 난 bash 가 쓰고싶다

 

bash 설치를 위해 패키지 매니저 업데이트

/usr/src/app # apt-get update
sh: apt-get: not found

컨테이너 내부에 패키지 매니저가 설치되어있지 않음

내가 선택한 베이스 이미지 node:16-alpine에 apt-get 패키지 매니저가 포함안되어있었기 때문

 

apk 패키지 매니저로 bash 설치

apk update
apk add bash
➜  scrumble git:(main) ✗ docker exec -it 5a0f57b66408 bash 
5a0f57b66408:/usr/src/app#

 

도커 네트워크 생성

docker network create scrumble-network

 

Docker 볼륨 마운트 + 동일한 네트워크 연결해서 컨테이너 생성하고 실행하기

server

docker run -p 3700:3700 -v "$(pwd)":/usr/src/app --name scrumble-server --network scrumble-network scrumble-server

client

 

docker run -p 3003:3003 -v "$(pwd)":/usr/src/app --name scrumble-client --network scrumble-network scrumble-client

 

서버 -> 프론트

http://scrumble-server:3700/

 

scrumble git:(main) ✗ docker inspect web {컨테이너ID}
 "scrumble-network": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "c66bdcd5e***"
                    ],
                    "NetworkID": "a6521a27d33734dbe12118b221c7db0a20300d76efb458ba52ecf825f60fa***",
                    ...
                }

 

 

 

docker-compose.yml 파일 작성

docker-compose.yml : 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구이다.

  - 각 컨테이너는 Service 로 정의된다. Docker Compose 는 이러한 서비스들을 하나의 애플리케이션으로 관리할 수 있게 해준다. 여러개의 서비스를 Docker Compose 파일로 정의하면 애플리케이션의 시작, 정지, 스케일링, 로그 등의 작업을 단순화 할 수 있다. 

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    depends_on:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

docker-compose.yml 파일의 주요 구성요소

  • version : Docker Compose 파일의 버전을 지정한다
  • services : 여러개의 서비스를 정의한다
  • networks : 서비스들이 속한 네트워크를 정의한다
  • volumes : 서비스들이 공유하는 데이터볼륨을 정의한다

Service 가 가질 수 있는 옵션

  • build : Dockerfile 로 부터 이미지를 빌드한다
  • image : 사용할 이미지를 지정한다
  • ports : 컨테이너의 포트를 호스트의 포트에 매핑한다
  • volumes : 호스트의 디렉토리를 컨테이너의 디렉토리에 매핑한다
  • environment : 컨테이너에서 사용할 환경변수를 설정한다
  • depends_on : 서비스가 시작되기 전에 다른 서비스가 먼저 시작되어야 하는 경우, depends_on 을 사용해 순서를 정할 수 있다
  • networks : 컨테이너들이 사용할 네트워크를 지정할 수 있다. 컨테이너간에 통신을 할 경우 네트워크를 지정해줘야 한다.
  • volumes : 데이터를 저장할 디렉토리를 지정할 수 있다. 호스트 OS 와 공유하거나, 다른 컨테이너와 공유 할 수도 있다
  • env_file : 환경변수 파일을 지정할 수 있다

mysql 컨테이너 생성

scrumble git:(main) ✗ docker pull mysql
scrumble git:(main) ✗ docker run --name scrumble-DB -e MYSQL_ROOT_PASSWORD=a123! -p 33077:3306 mysql:latest

-e : 컨테이너 안에서 사용할 환경변수를 설정하는 옵션

scrumble git:(main) ✗ docker exec -it {컨테이너ID} bash
bash-4.4# mysql -u root -p
Enter password: //a123!
# Welcome to the MySQL monitor.  Commands end with ; or \g