본문 바로가기

BACK END

Docker + Node.js + Nginx 4

이번엔 MySQL 이미지를 설치해 보겠습니다.root 경로에 작업 폴더를 생성해줍시다. 

 

mysql/conf.d/my.conf에는 다음과 같이 작성해 줍시다.

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake=FALSE
init-connect='SET NAMES utf8'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
bind-address=0.0.0.0

기본적인 encoding 설정은 제외하고  bind-address=0.0.0.0 은 사용 가능한 모든 네트워크 인터페이스를 수신합니다. 이는 MySQL 서버가 모든 IP 주소의 연결을 허용하도록 구성되었음을 의미합니다.

 

docker-compose.yml 수정

version: "3"

services:
  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - "80:80"
    depends_on:
      - node
      - mysql
    networks:
      - db-net
  node:
    build:
      context: ./node_server
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    depends_on:
      - mysql
    networks:
      - db-net
    volumes:
      - ./node_server/uploads:/store_images_volume
  mysql:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_HOST: mysql
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: chanho
      MYSQL_PASSWORD: 1234
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/config:/etc/mysql/conf.d
      - ./mysql/init:/docker-entrypoint-initdb.d
    ports:
      - "3307:3306"
    networks:
      - db-net

networks:
  db-net:

volume

 문득 이런 생각이 들었다. 이미지를 추가하거나 컨테이너를 리빌드하면 MySQL에 저정했던 데이터가 사라지진 않을까 ? 라는 생각이 들어 찾아본 결과 도커 컨테이너는 프로세스가 종료되면 변경 사항 중 일부가 손실될 수 있습니다. 그래서 도커는  volume 이라는 개념으로 데이터를 유지할 수 있는 기능을 제공합니다. 

 

MySQL에서는 이 기능을 내부적으로 사용해서 컨테이너 생성시 볼륨을 자동으로 생성해 줍니다만 컨테이너를 삭제할 경우엔 이 볼륨 또한 데이터를 보존할 수 없습니다.  기본적인 볼륨을 확인해 보겠습니다.  docker volume list  명령어로 볼륨 리스트를 확인하면 임의의 해시로 볼륨이 생성된 것을 확인할 수 있습니다.

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql 
e94b0ab7eed5b1d147147ffe5b170d1520ee680f7b3ab7511e4e0fb4fb9a1925

$  docker volume list
DRIVER    VOLUME NAME
local     15c1f4e9bfcf8d01154f232737ed9e90df479b2529247bc16a60a7a335675155
volumes:
    - ./db/mysql/data:/var/lib/mysql ->  ./db/mysql/data  디렉토리를 MySQL 컨테이너의  /var/lib/mysql 디렉토리로 마운트
    - ./db/mysql/config:/etc/mysql/conf.d  -> 사용자 정의 MySQL 설정을 제공할 수 있습니다. 이 디렉토리의 파일을  수정 하면 MySQL 컨테이너에서 해당 변경 사항이 반영
    - ./db/mysql/init:/docker-entrypoint-initdb.d -> 이 디렉토리에 있는 SQL 스크립트는 MySQL 컨테이너가 처음 시작  될 때 실행됩니다. 주로 데이터베이스를 스키마 및 데이터로 초기화하는 데 사용

 

설정이 끝나셨다면  docker-compose up --build 를 terminal에 입력해 build해주시면 됩니다.

terminal에서   docker container ps 를 입력해 CONTAINER_ID를 확인해 줍니다.

 docker exec -ot Container_ID bash  명령어를 입력 후  mysql -uroot -p  명령어로 mysql을 실행할 수 있습니다. 

간단하게  show databases  명령어를  실행하면  MYSQL_DATABASES: cloud_brigde  로 생성한 database를 확인할 수 있습니다.

'BACK END' 카테고리의 다른 글

우당탕탕 Node JS Server 다시보기  (1) 2023.12.18
Error: Connect econnrefused  (2) 2023.12.12
Docker + Node.js + Nginx 3  (0) 2023.12.11
Docker + Node.js + Nginx 2  (0) 2023.12.11
Docker + Node.js + Nginx 1  (0) 2023.12.10