제목 : 도커 안의 MySQL 과 MySQL Workbench 는 어떻게 연결할까?
부제목 : 편하게 데이터베이스를 작업하는 방법
이 글을 작성하는 이유
나는 주로 길 것이 예상되고 분석 혹은 공부가 반드시 뒤따르는 글을 작성하는 편이다.
(공식문서 해석 글은 빼고)
예를 들어 React 의 근간이 되는 Fiber Architecture 분석이나,
모든 HTML 태그를 작성하고 예시를 iframe 을 통해 직접적으로 보여주는 편인데,
이는 글이 길고 좁고 깊은 도메인의 지식을 독자들이 따라 올 수 있게 만든다.
분명히 "누군가는" 이러한 글이나 내부 지식을 필요로 할 것이다.
그러나 그 누군가가 상당수는 아닐 것이다.
나는 NestJS 에서 Spring 으로 백엔드 도메인 전문성을 교체하고 있는 중인데,
이를 위해 Udemy 에서 Spring 강의를 사서 듣고 있다.
이 과정에서 로컬 컴퓨터에 MySQL 을 설치하고, MySQL Workbench 를 통해
쉽게 데이터베이스에 접근하고 변경 및 추가 삭제를 할 수 있게 만들어 주는데,
내가 만약 Spring, MySQL 및 DB 를 처음 접하면 로컬로 프로그램을 실행하겠지만,
나는 추후 클라우드 컴퓨팅을 통해 다양한 프로젝트들을 나열할 생각이기 때문에,
이를 고려하여 Docker 를 통한 인프라 Isolation 구조로 데이터베이스를 구현하려 한다.
쉽게 말해 도커 컨테이너에 데이터베이스를 구축하고, 나중에 필요 없어 질 때 컨테이너를 삭제 할 것이다.
나와 같은 상황의 사람도 있을 것이고, 혹은 Docker 컨테이너로 고립된 프로세스에
굳이 터미널로 접근하는 것 보단, Workbench 를 통한 조작이 쉽고 간단하기 때문에
이 글을 보는 사람도 존재 할 것이다.
나는 공식문서를 통해 앞으로 표현될 코드와 그 원리는 이미 미리 글로 작성하며 공부했다.
이해가 되지 않는다면, 밑의 링크를 통해 어떤 과정이 있었는지 보길 권합니다.
이 글을 볼 때 주의점
이번 글은 평소에 글을 작성할 때 항상 초점을 겨누는 "방법론" 에 대한 해체는 진행하지 않습니다.
이 글을 작성하며 초점을 맞추게 되는 상황은 다음과 같습니다 :
- 로컬 컴퓨터(macOS)
- Docker 환경 + Docker Compose 프로그램 사용
docker-compose.yml파일을 통한 쉬운 MySQL 인프라 실행- 격리된 데이터베이스 서버와 로컬에 설치된 MySQL WorkBench 연동
여러분들에게 유용한 정보가 있길 빕니다.
- Email :
rhdwhdals8765@gmail.com
Docker 로 격리된 MySQL 컨테이너 생성하기
보통 MySQL 서버를 실행 할 때,
각 운영체제(Linux, Windows, MacOS) 에서 시동하는 방식이 다르며,
사용하는 로컬 컴퓨터와 떨어지지 않는 방식으로 즉석 실행한다.
주로 격리된 MySQL 컨테이너를 생성하는 이유는 위에서 설명한 나의 상황과 비슷하거나,
곧 Cloud 컴퓨터에 Docker 격리 컨테이너를 적용하게 되는데,
이를 로컬에서 테스팅 하기 위한 용도일 것이라고 추정한다.
어떠한 상황이던, 로컬에서 Docker 격리 상황을 가정하여 Workbench 로
연결하고자 하는 것은 동일한다는 것을 기억하면 된다.
MySQL 컨테이너를 생성하는 2 가지 방식
도커로 MySQL 컨테이너를 생성하는 방식은 크게 2 가지가 있다.
우선 도커가 설치된 로컬 컴퓨터라는 가정으로,
docker run 이라는 명령어와 함께 수많은 옵션을 추가하는 방식이 있고,
Example :
$ docker run -d \
> --name=custom-mysql \
> -e MYSQL_ROOT_PASSWORD=<root 유저 비밀번호> \
> -e MYSQL_DATABASE=test_scheme \
> -e MYSQL_USER=<보안을 위해 새로 생성한 일반 유저 이름> \
> -e MYSQL_PASSWORD=<위의 유저의 비밀번호> \
> -e TZ=Asiz/Seoul \
> -p 3306:3306 \
> -v "$(pwd)/data-db:/var/lib/mysql" \
> mysql:8.0 \
> --character-set-server=utf8mb4 \
> --collation-server=utf8mb4_unicode_ci
<생성된 CONTAINER ID>
또 다른 방식으로는 Docker-Compose 를 따로 설치하여
docker 의 호환성 하위 프로그램으로 만드는 방식이 있다.
이 때 docker-compose.yml 이라는 이름으로 생성하여
docker-compose or docker compose 로 해당 파일을 실행 할 수 있는데,
Dockerfile 로 충족하기 힘든 여러 요소들을 docker-compose.yml 파일을 통해
기입하여 도커 디버깅 및 개발에 필요한 여러 단계를 자동화하는데 기여한다.
또한 위에서 예시로 보여준 명령어를 굳이 띄웠다 내릴 때 마다 실행 할 필요가 없다.
도커와 도커 파일에 대한 더 많은 정보를 원한다면, 위에서 내가 보여준 2 개의 링크로 가면 된다.
아마 이 글은 답변을 요하는 사람들이 주로 볼 것 같아서이다.
1. 하위 디렉토리 ./data-db 생성하기
이는 컨테이너 내부의 MySQL 프로그램에 대한 정보와 내 정보를 저장하기 위해
로컬 디렉토리와 "Mount" 하기 위해 필요하다.
한번 띄우고 바로 내릴 때, 모든 정보가 항상 사라져야 하는 것이 아니라면,
데이터베이스는 특정 디렉토리가 항상 로컬과 연결되어 있는 것이 좋다.
MySQL 에 대한 정보는 /var/lib/mysql 이다.
컨테이너 내부의 경로 /var/lib/mysql 과 ./data-db 디렉토리를 연결(마운트) 한다.
2. docker-compose.yml 파일 생성
생성된 야믈(yaml or yml) 파일에 밑의 내용을 기입한다.
밑의 의미는 말하고 싶으나 글의 목적과 맞지 않아 생략한다.
꼭 알아야 할 것은, 한국어는 프로그래밍과 엔지니어링의 중심 언어가 아니다.
즉, 소수민족 취급을 받는 언어라고 생각해야 하기 때문에, 인코딩과 시간 설정이 핵심이다.
MYSQL_ 접두어가 붙은 장소는 이 글 독자의 마음대로 바꾸는 것이 맞으며,
환경변수 중 TZ 는 건드리면, 안되며, volumes, command 는 그대로 두어야 한다.
version: '3.8'
services:
db:
image: mysql:8.0
ports:
- 3306:3306
environment:
- MYSQL_DATABASE=test_user
- MYSQL_ROOT_PASSWORD=1324
- MYSQL_USER=udemystudent
- MYSQL_PASSWORD=1324
- TZ=Asia/Seoul
volumes:
- ./db-info:/var/lib/mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
그리고 이 docker-compose.yml 파일이 존재하는 터미널에서
docker compose up 을 입력한다.
➜ sqls docker compose up
WARN[0000] /Users/..../docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 2/2
✔ Network sqls_default Created 0.0s
✔ Container sqls-db-1 Created 0.0s
Attaching to db-1
db-1 | 2025-11-26 22:21:12+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.44-1.el9 started.
...
...
db-1 | 2025-11-26T13:21:19.448526Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.44' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
만약에 위의 긴 내용이 터미널에 나오지 않고 "백그라운드" 로 실행되기를 원한다면,
docker compose up -d 를 입력하면 된다.
그리고 꼭 확인해야 하는 것은, 특정 오류로 인해 컨테이너가 열리자마자 닫혔는지 꼭 확인해야 한다.
➜ ~ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b5d27c8c065 mysql:8.0 "docker-entrypoint.s…" 50 minutes ago Up 50 minutes 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp sqls-db-1
위의 내용에서 STATUS 칸을 잘 보아야 하는데, exited.... 가 없고,
Up ... 가 있는것을 볼 수 있다. (잘 동작한다는 이야기)
상황 정리
현재 docker, docker-compose 프로그램을 통해 MySQL 격리 컨테이너를 띄웠다.
이 컨테이너는 localhost Port 중에서, 3306 으로 요청을 넣을 수 있으며,
컨테이너 내부에서는 요청이 들어왔을 때, localhost:3306 으로 요청이 왔다고 인식한다.
MySQL 컨테이너는 잘 동작 중이므로, 이제 MySQL WorkBench 를 사용 할 차례이다.
MySQL Workbench 를 통해 연결 해 보자.
먼저 MySQL Workbench 를 키면, 이러한 화면을 볼 수 있다.
먼저 화면에서는 MySQL Connections 에 아무것도 없을 수도 있고,
혹은 여러 개가 있을 수도 있다.
그리고, 여기에서 내가 빨간색 처리 한 버튼을 눌러 다음과 같은 화면으로 이동한다.
위의 화면은 "새로운 Connection" 을 만드는 것이다.
나의 경우, Udemy 강의에서 생성한 프로젝트에 적용할 DB 이기 때문에,
Udemy_Connection 이라는 Connection Name 을 설정 할 것이다.
그리고, Hostname, Port 는 바꿀 필요 없다.
그리고 docker-compose.yml 파일에서 우리는 "루트 유저" 외 "일반 유저" 또한 생성했다.
원한다면 root 와 그 비밀번호로 연결해도 된다.
Default Schema 는 연결하면서 생성할 DB, 최상위 스키마를 말하는 것이다.
나는 이미 test_user 이라는 DB 스키마를 설정하기도 했고,
생성한다면 서버 내에서 생성하는 편이라서 넣지는 않았다.
위에서 예시를 든 것 처럼 입장한다면,
Docker Container 내부의 MySQL 을 마치 로컬에서 실행 한 것 처럼
운용할 수 있게 된다.
마무리
보통 나는 데이터베이스를 구축 할 때,
특정 프로젝트와 결합해야 하는 일이 생긴다면,
NodeJS 도메인에서는 TypeORM
Spring 도메인에서는 JPA & Hibernate 를 사용한다.
만약에 옛날에 데이터베이스를 구축했다면,
그건 주로 회사의 정보, 단체의 정보 및 등등을 넣어
데이터베이스 내부에서 효과적으로 원하는 정보를 계산 및 추출하기 위함이다.
그러나 요즘의 소프트웨어 자동화 기술은 정말 좋아서,
코드로 작성한 엔티티 코드를 데코레이터 혹은 애노테이션으로 읽어서,
이에 대한 메타데이터를 그대로 SQL 정보로 형성하여 데이터베이스에 명령한다.
그러면 우리는 데이터베이스에서 손 하나 까딱하지 않고도 원하는 스키마와 테이블 및
속성을 지정할 수 있다.
그럼에도 불구하고, ORM 이라는 기술이 완벽 한 것은 아니다.
PK, FK 의 변경, 혹은 속성의 삭제와 같이 치명적인 명령은
특수 옵션을 붙여야 하거나, 내부의 정보를 손상시키지 않기 위해
직접 데이터베이스로 들어가서 ALTER TABLE ... 해야 한다.
나는 이러한 이유 때문에 직접 SQL 을 작성 할 일이 많았다.
그러나 Docker 로 인해 격리화 된 상황에서도,
TCP/IP 방식으로 쉽게 Workbench 와 연동 할 수 있다는 것은,
이미 CLI 형식으로 접근 가능한 MySQL Containeried Server 에서,
GUI 로 내부 정보를 추출 및 변형 삭제를 수행함이 가능하다는 의미이다.
이는 개발 입장에서는 큰 차이가 존재한다.
질문하고 싶으신 분이 계시다면,
Email : : rhdwhdals8765@gmail.com
으로 언제든 연락 주세요. 환영합니다
참조 사이트 목록
내 깃허브
'잡다 지식' 카테고리의 다른 글
| Docker Compose 는 무엇이고 어떻게 사용할까? - Spring & Nginx & MySQL (0) | 2025.11.26 |
|---|---|
| 내가 Node.js 에서 Spring 으로 백엔드 영역을 변경하는 이유 (1) | 2025.11.05 |
| 동시성 (Concurrency) 이란 무엇일까? - 부제 : 동시 실행이라는 착각 (4) | 2025.06.04 |
| 프로세스와 스레드 (부제 : 정확한 의미를 알고, 명령어로 검색 해 보자) (0) | 2025.05.20 |
| Domain 과 SSL 에 대하여 (부제 : https 는 뭘까?) (0) | 2025.05.19 |