Home Docker-compose를 이용한 MySQL 구축
Post
Cancel

Docker-compose를 이용한 MySQL 구축

개요

필자가 Spring Boot를 익히는 동안 데이터베이스의 연계도 필요하다 생각했기에, Spring에 DB접속하기 쉬운 MySQL를 구축할 예정을 잡았다. 원래대로라면 로컬에 MySQL를 넣으면 간단하게 될 일이였지만 나중에 로컬에서 MySQL를 삭제하기 귀찮을 뿐더러, MySQL를 관리할 수 있는 툴로 phpMyAdmin을 같이 구축하는 방향으로 생각을 하게 되었다. 필요할때 구축하고 바로 삭제 가능한 방향으로 하는 방법으로는 역시 가상환경 or 컨테이너를 이용하는 것이 제일 좋을 듯 싶다. 하지만 가상환경은 용량과 구축의 귀찮음을 느껴 Docker 컨테이너로 빌드해 언제든지 실행/중단이 가능하며 삭제도 쉽게 가능한 환경을 만들어보는 작업을 해보았다. 이전 포스팅한 Docker-compose를 통해 컨테이너와 이미지를 쉽게 지정하고 구축하는 방법을 시도했다.

Docker-compose의 운용과 작성방식

MySQL과 phpMyAdmin 이미지를 가져와 한번에 컨테이너 안에 가져와 운영하는 방식으로 진행해보도록 하겠다. 추가로 초기 데이터베이스 작성 후 간단한 테이블 작성도 같이 해보도록 하겠다.


Docker-compose.yml 작성

이전 포스트와 같이 docker-compose.yml을 먼저 작성하도록 하겠다. 이번에는 MySQL과 동시에, phpMyAdmin도 같이 가져와 데이터베이스 관리까지 같은 컨테이너 안에서 실행해보도록 하겠다.

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '3'

services:
  # MySQL
  db:
    image: mysql:5.7
    container_name: mysql_host
    environment:
      MYSQL_ROOT_PASSWORD: root # 루트 진입시 필요한 패스워드
      MYSQL_DATABASE: test_db # 데이터베이스 생성시 데이터베이스명
      MYSQL_USER: admin # 관리자 유저 ID
      MYSQL_PASSWORD: admin # 관리자 유저 PW
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # 빌드 후 데이터베이스 문자열을 UTF-8로 변경
    volumes:
    - ./docker/db/data:/var/lib/mysql # 데이터 베이스 저장소(container 재실행시 이전 정보 유지)
    ports:
    - 3306:3306

  # phpMyAdmin
  phpmyadmin:
    container_name: test_phpmyadmin
    image: phpmyadmin/phpmyadmin
    environment:
    - PMA_ARBITRARY=1
    - PMA_HOSTS=mysql_host
    - PMA_USER=root
    - PMA_PASSWORD=root
    ports:
    - 5050:80

위와 같이 코드를 작성하였다. MySQL포트는 똑같이 3306으로 지정하였고, phpMyAdmin은 임의로 5050으로 지정하였다.

그리고 volumes안의 폴더는 임의로 docker/db/data의 식으로 넣어놓았다. 그렇기 때문에 현재 파일 트리는

1
2
3
4
5
./
├── docker
│   └── db
│       └── data
└── docker-compose.yml

이렇게 설정해야 빌드가 가능하다. 이제 파일 구성을 마치고 바로 데이터베이스 구축이 가능하다. 이하의 명령어를 입력해주도록 하자. (Docker-compose.yml가 있는 디렉토리 내에서)

1
docker-compose up -d

이렇게만 해도 바로 MySQL과 phpMyAdmin 구축이 성공이 되었다. 확인 방법은 phpMyAdmin이 접속되었나로 확인이 가능하다. 필자는 http://localhost:5050으로 접속하여 아래와 같은 화면이 접속 되었다.

mysql1

이렇게 구축이 되었다면 data폴더에도 mySQL에 필요한 파일들이 생성되어 있을 것이다. 이것들은 잠시 뒤로 하고, 여기서 추가적으로 초기 데이터베이스 작성과 테이블 작성을 해보겠다.

필자는 MacOS를 사용하고 있기 때문에 Linux환경을 바탕으로 작성하였다. Windows를 이용하시는 분들은 init-mysql.sh 내용을 하나하나 입력하면 테이블 작성이 가능하다.


sh파일을 이용한 초기 테이블 작성(Linux환경)

필자는 docker폴더 내에 초기 테이블 작성 환경을 만들기 위한 sql폴더를 생성하였다. sql폴더를 작성 후 필요한 sql파일을 작성해보았다. 내용은 간단한 테이블 작성 내용이다.

01-create-tables.sql

1
2
3
4
5
6
7
8
9
10
11
12
13
---- drop ----
DROP TABLE IF EXISTS `test_table`;

---- create ----
create table IF not exists `test_table`
(
 `id`               INT(20) AUTO_INCREMENT,
 `name`             VARCHAR(20) NOT NULL,
 `created_at`       Datetime DEFAULT NULL,
 `updated_at`       Datetime DEFAULT NULL,
    PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

sql파일을 생성 후에는 후에 sh파일을 생성하였다. sql폴더 자체를 docker-compose의 volume으로 넣어 컨테이너 내부로 파일을 공유한 후 그 안에서 sh파일을 사용하기 위해서이다. sh파일은 다음과 같다.

init-database.sh

1
2
3
4
5
6
#!/usr/bin/env bash
#wait for the MySQL Server to come up
#sleep 90s

#run the setup script to create the DB and the schema in the DB
mysql -u $MYSQL_USER -p$MYSQL_PASSWORD test_db < "/docker-entrypoint-initdb.d/001-create-tables.sql"

이렇게 sh파일을 동시에 생성한 후 docker-compose.yml의 volumes에 다음과 같이 추가한다.

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
version: '3'

services:
  # MySQL
  db:
    image: mysql:5.7
    container_name: mysql_host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_db
      MYSQL_USER: admin
      MYSQL_PASSWORD: admin
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/sql:/docker-entrypoint-initdb.d # 새로 추가된 volume
    ports:
    - 3306:3306

  # phpMyAdmin
  phpmyadmin:
    container_name: test_phpmyadmin
    image: phpmyadmin/phpmyadmin
    environment:
    - PMA_ARBITRARY=1
    - PMA_HOSTS=mysql_host
    - PMA_USER=root
    - PMA_PASSWORD=root
    ports:
    - 5050:80

이렇게 추가하게 되면 sql폴더 내부에 있는 파일들은 컨테이너 안의 볼륨에 포함되었다. 현재의 파일 트리는 다음과 같다.

1
2
3
4
5
6
7
8
9
.
├── docker
│   └── db
│       ├── data
│       └── sql
│           ├── 001-create-tables.sql
│           └── init-database.sh
└── docker-compose.yml

이제 내부에 sh를 작동시킬 sh파일을 외부에 생성하여 직접 컨테이너에 들어가지 않으면서도 테이블을 작성을 해보겠다. Docker-compose.yml에 위치한 폴더에 sh파일을 하나 만들도록 하겠다.

init-mysql.sh

1
2
3
#!/bin/sh
docker-compose exec db bash -c "chmod 0775 docker-entrypoint-initdb.d/init-database.sh"
docker-compose exec db bash -c "./docker-entrypoint-initdb.d/init-database.sh"

여기서 windows를 사용하는 분들은 해당 명령어를 직접 치기만 하면 된다. 혹여나 귀찮다면 batch 파일로 작성해도 괜찮다.

이렇게 작성한 후 해당 명령어를 입력하면 자동으로 테이블 작성이 가능하다.

1
sh init-mysql.sh

그러면 phpMyAdmin에서 테이블이 하나 추가된 것을 볼 수 있다.

mysql2


이렇게 Docker 컨테이너를 이용한 MySQL 구축이 완료되었다. 기존 로컬에서 설치 후 서버를 On/Off하는 것보다는 깔끔하게 컨테이너에서 phpMyAdmin과 같이 만드는게 편하다고 생각하여 만들어본 구성이다. 불명확한 점 혹은 궁금한 점이 있다면 댓글로 남겨주시기 바란다.

VSCode를 사용하여 Spring Boot API 작성

-