💡BE/그 외

docker-compose을 활용하여 mysql 설치하기

뇌 리셋은 기본이지 2023. 11. 29. 14:09

로컬 환경

  • Window 11 Home
  • Docker, docker-compose
  • DBeaver
  • MySQL 8.0

Docker Desktop 설치

 

Docker Desktop: The #1 Containerization Tool for Developers | Docker

Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.

www.docker.com

링크 클릭하고 들어가면 다운로드 버튼이 있다. 본인 OS에 맞는 프로그램을 다운로드 받으면 된다. 나는 Winodws를 선택해서 설치했다.

docker-compose 구성

docker-compose.yml 작성

version: '3'

services:
    mysql:
        image: mysql:8.0
        container_name: mysql_test
        ports:
            - "3306:3306" 
        env_file: .env
        environment:
            TZ: Asia/Seoul
        command:
            - --character-set-server=utf8mb4
            - --collation-server=utf8mb4_unicode_ci
            - --lower_case_table_names = 1
        volumes:
            - ./initdb.d:/docker-entrypoint-initdb.d
            - ./mysql_data/mysql/:/var/lib/mysql
# 파일 규격 버전

# 컨테이너 정의
   # 서비스 명
      # 사용할 이미지
      # 컨테이너 이름 설정
      # 접근 포트 설정
          # (컨테이너 외부 : 컨테이너 내부) ← 컨테이너 내부는 무조건 3306
      # 환경변수 옵션 파일 : 파일의 경로
      # -e 옵션
          # 타임존
      # 명령어 실행
          # 한글 깨짐 방지
          # 이모지 깨짐 방지
          # 쿼리문 대소문자 구분 X
       # -v 옵션 ( 데이터 볼륨 매핑 )
          # initdb.d 볼륨을 /docker-entrypoint-initdb.d에 연결
          # mysql-data/mysql 볼륨을 /var/lib/mysql에 연결

.evn 작성

MYSQL_ROOT_PASSWORD=root1234
MYSQL_DATABASE=moment
MYSQL_USER=moment
MYSQL_PASSWORD=moment

mysql 계정을 생성합니다.

initdb.d 폴더 추가

create_table.sql 작성

CREATE TABLE `MEMBER` (
	`ID`	VARCHAR(100)	NOT NULL,
	`PWD`	VARCHAR(100)	NULL,
	`NAME`	VARCHAR(50)	NULL,
	`PH`	VARCHAR(20)	NULL,
	`ZIPCODE`	VARCHAR(10)	NULL,
	`EMAIL`	VARCHAR(100)	NULL,
	`ADDR`	VARCHAR(200)	NULL,
	`ADDR_DETAIL`	VARCHAR(200)	NULL,
	`SUB_DT`	DATETIME	NULL,
	`UPDATE_DT`	DATETIME	NULL,
	`ROUTE`	INT	NULL	COMMENT '자사, KAKAO, NAVER',
	`YN`	INT	NULL,
	`SNS_TOKEN`	VARCHAR(500)	NULL
);

...

CREATE TABLE `REPLY` (
	`REPLY_NO`	INT	NOT NULL,
	`BOARD_NO`	INT	NOT NULL,
	`ID`	VARCHAR(100)	NOT NULL,
	`CONTENT`	VARCHAR(300)	NULL,
	`WRITE_DT`	DATETIME	NULL,
	`UPDATE_DT`	DATETIME	NULL,
	`YN`	INT	NULL	COMMENT 'YES or NO',
	`RE_REPLY_CONTENT`	VARCHAR(300)	NULL,
	`RE_REPLY_WRITE_DT`	DATETIME	NULL,
	`RE_REPLY_UPDATE_DT`	DATETIME	NULL,
	`RE_REPLY_YN`	INT	NULL	COMMENT 'YES or NO'
);

MySQL에서 사용할 Table을 정의합니다. 테이블 생성 구문은 ERDCloud를 활용하였습니다.

 

ERDCloud

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

실제 프로젝트를 진행할 때 사용한 다이어그램

docker 생성 및 실행

docker-compose up -d

파일이 있는 경로로 가서 해당 명령어를 실행하면 설정한 환경으로 MySQL 컨테이너가 생성 및 실행된다.

Visual studio code를 활용하여 실행했다. Ctrl + ` 단축키를 눌러 터미널을 띄운 다움 해당 명령어를 실행했다.

  • 터미널 성공 이력 확인

  • Docker Desktop Containers 확인

컨테이너가 올라간걸 확인했으니 이제 DB Tool을 이용하여 MySQL로 생성한 계정을 접근해보자.

DBeaver 설치

 

Download | DBeaver Community

Download DBeaver Community 23.2.5 Released on November 20th 2023 (Milestones). It is free and open source (license). Also you can get it from the GitHub mirror. DBeaver PRO 23.2 Released on September 12th, 2023 PRO version website: dbeaver.com Trial versio

dbeaver.io

DBeaver Connect MySQL

Database Navigaator 마우스 우 클릭 → Create  → Connection
MySQL 클릭 후 다음 버튼
docker compose file  → .evn file에 있는 계정 정보를 입력 → Test Connection
에..에러다...

에러가 발생하는 원인은 useSSL=false로 설정하고 allowPublicKeyRetrieval 설정을 하지 않은 경우라고 한다. 이 부분은 드라이버에서 설정해주면 된다.

Driver properties  → allowPublicKeyRetrieval  → false를 true로 변경  → Test Connection
성공 시 나오는 팝업창
생성한 계정 Databases 구성( DBeaver)

docker-compose 설정 시 명령어

docker-compose 설정 시 사용했던 명령어들이다.

# volume, image 전체 삭제 명령어
docker-compose down -v --rmi all

# 재생성 및 재실행
docker-compose up --build -d

파일에 만들어진 볼륨도 삭제해야 함

내 의도와는 다르게 되었을 때 컨테이너 재설정이 필요했었을 때 였다. 그래서 볼륨과 이미지를 삭제할 수 있는 명령어와 파일에 있는 볼륨을 삭제해준 후 재생성 및 재실행 명령어를 입력했다.

# 실행중인 컨테이너 확인하는 명령어
docker ps

# 컨테이너 전체 조회 -> STATUS가 Exited면 컨테이너 중지된거임
docker ps -a

# 컨테이너 재실행
docker restart 컨테이너명

# 실행중인 컨테이너 확인 -> 재실행하면 STATUS이 Up으로 바뀜
docker ps

위의 명령어를 실행하면서 docker 기본 명령어의 일부분을 배운 것 같다. 

마치며

docker desktop에서 Containe를 Exited해도 자체적으로 잡아먹는 메모리가 많기 때문에 docker desktop을 사용하지 않을 경우에는 무조건 프로그램을 꺼두는 것이 좋다.