출처:MySQL 도커 컨테이너 설치 후 DBeaver 연결하기. 도커 엔진을 설치하고 도커 허브에서 MySQL 서버의 도커 이미지를… | by BeomHwan Roh | Medium
백그라운드에서 실행되는 은행 보안 프로그램이 과도하게 설치되어 있어 다른 소프트웨어(예를 들면 게임)를 실행할 때 지장이 있었던 경험은 하나씩 가지고 있을 것이다. 나의 경우는 인터넷 뱅킹용 컴퓨터와 개인 활동용 컴퓨터를 따로 분리해서 사용했었다. 사실 이는 무척 비효율적인데, 하드웨어 리소스나 소프트웨어가 돌아갈 수 있는 OS에 대한 리소스가 두 배가 들어간다는 것을 의미한다.
서버에서도 마찬가지다. 하나의 서버에서 여러 소프트웨어를 돌리는 경우 한 소프트웨어가 다른 소프트웨어에 영향을 미칠 수 있다. 이는 소프트웨어 구동에 문제가 생길 수 있는 변수가 늘어난다는 것을 의미하고, DB같이 무결성이 보장되어야 하는 소프트웨어에는 치명적일 수 있다. 그렇다고 소프트웨어 하나당 서버를 한 대씩 띄우는 것은 매우 비효율적이다.
이러한 문제를 해결하기 위해 등장한 것이 도커(Docker)다. 도커는 리눅스 컨테이너 기술로 리눅스의 소프트웨어들을 감싸 격리하고 실행하려는 오픈소스 프로젝트다. 리눅스 컨테이너는 VMware 같은 일반적인 가상 머신과 다르게 가상 환경 내에 OS가 통째로 들어있지 않고 컨테이너 실행 환경은 호스트 OS에 맡기고 컨테이너 내부에는 파일 시스템과 애플리케이션으로만 구성되어있어 가볍고 빠르다.
예를 들어 Ubuntu 환경에 도커를 설치하고 CentOS 컨테이너를 실행한다면 컨테이너 내부에는 CentOS를 구성하는 파일 시스템이 들어있고 CentOS의 리눅스 실행 환경은 컨테이너 외부의 도커 엔진과 Ubuntu의 실행 환경에 맡긴다. 이러한 방식 덕분에 Ubuntu에서 도커 컨테이너 내부에 접속하면 완벽하게 격리된 CentOS 환경에서 개발할 수 있다.
이번 포스트에서는 도커 엔진을 설치하고 도커 허브에서 MySQL 서버의 도커 이미지를 받아 컨테이너화하고 컨테이너 밖 로컬에서 DBeaver에 MySQL 서버를 연결해 실행해보고자 한다.
실습 환경
- Ubuntu 22.04 Desktop
- Z shell
- Docker
- Docker Image: mysql:latest - MySQL 8.0.31, Oracle Linux
- DBeaver Community Edition
도커 설치
Docker docs에 기재되어있는 설치 방법에 따라 도커 엔진을 설치한다. Linux GUI 환경에 맞는 도커 데스트톱을 설치해도 되지만 CLI 환경에서의 연습을 위해 도커 엔진을 설치했다.
# apt 업데이트
sudo apt update
# Docker 의존성 패키지 설치
sudo apt install \
ca-certificates \
curl \
gnupg \
lsb-release
# GPG 키 발급
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Docker 리포지토리 연결
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker 설치
sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
설치가 완료되었는지 확인하기 위해 설치된 도커의 버전을 확인하는 명령어를 호출한다.
# Docker 버전 확인
docker version
도커 이미지 설치와 도커 컨테이너 구성
도커 이미지는 도커 서비스 운영에 필요한 각종 프로그램, 설정 상태, 라이브러리, 컴파일된 실행 파일, 의존성 프로그램등을 모아둔 형태를 뜻한다. 도커 이미지는 상태 값을 가지지 않고 불변(immutable)하다. 도커 컨테이너는 도커 이미지를 격리된 프로세스에서 실행한 상태를 뜻하며 하나의 도커 이미지에서 여러 개의 도커 컨테이너를 생성할 수 있다.
도커 이미지들은 Github와 유사한 Docker hub라는 사이트를 통해 배포와 버전 관리를 할 수 있는데, 해당 프로그램의 제조사가 직접 배포한 공식 이미지나 일반 유저들이 만들고 배포한 이미지를 받아 컨테이너화 할 수 있다.
Docker hub에서 MySQL 공식 이미지를 pull 해온다. 이미지 이름 외에 태그를 붙여 pull 해올 이미지의 옵션을 지정할 수 있는데, mysql:8.0과 같이 {이미지}:{태그}의 형식으로 지정할 수 있다. 태그를 표기하지 않으면 도커 이미지 업로더가 기본으로 지정한 태그로 자동 지정된다. MySQL 이미지의 기본 태그는 mysql:latest 로, Oracle Linux 기반에서 구동하는 MySQL 8.0.31버전의 도커 이미지가 설치된다.
docker images 명령어는 설치된 도커 이미지 리스트를 확인할 수 있다. 도커 이미지를 삭제하려면 docker rmi 명령어를 이용한다.
# Docker MySQL image pull
docker pull mysql
# 설치된 도커 이미지 목록 확인
docker images
# 이미지 삭제
docker rmi {이미지 이름:태그}
보유하고 있는 도커 이미지를 이용해 도커 컨테이너를 생성하고 실행한다. 하나의 도커 이미지를 가지고 여러 개의 도커 컨테이너를 생성할 수 있다.
# MySQL 컨테이너 생성
docker run --name {컨테이너 이름} -e MYSQL_ROOT_PASSWORD={루트 계정 비밀번호} -d, -p {포트포워딩} mysql
# Example
docker run -d --privileged --name mysql-server -e MYSQL_ROOT_PASSWORD=rootpwexample -d -p 3307:3306 mysql /sbin/init sleep infinity
- --name : 컨테이너의 이름 설정
- --privileged: 컨테이너에서 리눅스 명령어 사용 권한 있음.(단, 보안상 권장하지 않음)
- -e : 환경 변수 설정
- -d : 컨테이너를 백그라운드에서 실행하기
- -p : 호스트의 포트와 컨테이너의 포트 연결
- sleep infinity: 정상적으로 컨테이너가 유지됨
MySQL 컨테이너의 MYSQL_ROOT_PASSWORD 환경 변수를 설정해 루트 계정의 비밀번호를 설정할 수 있다.
MySQL은 기본적으로 네트워크 통신을 할 때 3306번 포트를 이용하지만, 로컬에 설치된 MySQL과 사용하는 포트가 겹쳐 로컬의 3307번 포트를 컨테이너 내부의 3306번 포트와 연결했다. 따라서 예시와 같이 구성할 경우 DBeaver와 같은 DB 관리 도구에 연결하기 위해서는 3307번 포트(로컬의 경우 localhost:3307, 외부 서버의 경우 xxx.xxx.xxx.xxx:3307)에 연결하면 접속 가능하다.
컨테이너를 생성한 뒤 실행 중인 컨테이너를 보려면 docker -ps 명령어를 이용한다. 해당 명령어의 -a 옵션은 실행 중인 컨테이너와 실행 종료 중인 컨테이너를 모두 조회할 수 있다. 실행 중인 컨테이너를 삭제하기 위해서는 컨테이너 종료 과정이 선행되어야 한다.
# 현재 실행 중인 컨테이너 보기
docker ps
# 종료된 컨테이터도 함께 보기
docker ps -a
# 컨테이너 종료하기
docker stop {컨테이너 ID 또는 이름}
# 컨테이너 (재)시작하기
docker start {컨테이너 ID 또는 이름}
# 컨테이너 삭제
docker rm {컨테이너 ID}
컨테이너 세팅이 완료되고 실행 중이면 컨테이너 내부로 접속할 준비가 완료되었다. docker exec 명령어로 컨테이너 내부 리눅스(여기에서는 Oracle Linux)로 진입한다. 진입 후 컨테이너 내부에 이미 설치된 MySQL 서버에 루트 계정으로 접속한다. 루트 계정의 비밀번호는 이전에 이미지로부터 컨테이너를 생성할 때 docker run -e MYSQL_ROOT_PASSWORD={루트 비밀번호} 명령어에서 입력한 비밀번호를 입력한다.
# 컨테이너에 접속하기
docker exec -it test_mysql bash
# MySQL 관리자로 접속하기
mysql -u root -p
# 패스워드 입력
MySQL 서버 콘솔에 접속하면 DBeaver에 접속할 사용자 계정, 사용자가 사용할 새 데이터베이스를 생성하고 사용자 계정에 데이터베이스 권한을 부여한다.
-- 데이터베이스 만들기
CREATE DATABASE {데이터베이스 이름} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 사용자 계정 만들기
CREATE USER {사용계 계정 이름} IDENTIFIED BY {사용자 계정 비밀번호};
-- 사용자 계정에 데이터베이스 권한 부여하기
GRANT ALL PRIVILEGES ON {데이터베이스 이름}.* TO {사용자 계정 이름};
-- Example
CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'test_user' IDENTIFIED BY 'userpwexample';
GRANT ALL PRIVILEGES ON test_db.* TO 'test_user';
-- 데이터베이스 목록 조회
SHOW DATABASES;
-- 사용자 목록 조회
SELECT User, Host, authentication_string FROM mysql.user;
데이터베이스와 사용자 구성이 완료되면 exit; 명령어로 MySQL 서버 콘솔에서 나가고, 다시 컨테이너 CLI 환경에서 exit 명령어를 이용해 컨테이너에서 나간다.
DBeaver 설치와 구성
DBeaver는 MySQL Workbench나 Heidi SQL 같은 데이터베이스 관리 도구로 Windows와 Mac, Linux 모든 플랫폼에서 사용 가능하다는 장점이 있다. Ubuntu Desktop 환경에서는 Ubuntu의 개발·배포사인 Canonical에서 개발한 패키지 관리 시스템인 Snapcraft를 이용해 설치할 수 있다.
snap 명령어를 이용해 DBeaver의 무료 버전인 community edition을 다운로드 받는다.
# DBeaver Community Edition 설치 (snap)
sudo snap install dbeaver-ce
다운로드가 완료되면 GUI 시작 메뉴에 자동으로 생성된다. 생성된 DBeaver CE 아이콘을 클릭해 실행한다. 초기 실행 화면에서 데이터베이스를 로드하기 위해 전기 플러그 모양의 새 데이터베이스 연결 버튼을 클릭한다.
새 데이터베이스 연결 팝업창에서 연결할 데이터베이스로 MySQL을 찾아 선택한다.
MySQL 데이터베이스 연결 구성 화면에서 연결할 데이터베이스의 서버 호스트 주소와 포트,데이터베이스 사용자명과 사용자 비밀번호를 입력한다.
본 포스트에서는 컨테이너 내부의 MySQL 서버에 할당된 3306번 포트를 컨테이너 외부(로컬 호스트)의 3307번 포트에 포트포워딩 했으므로 로컬 호스트의 3307번 포트를 호스트 주소로 설정했다. 데이터베이스 사용자는 위에서 생성한 test_user 사용자 정보를 입력했다. test_user 사용자는 이전에 test_db 라는 이름의 데이터베이스의 사용 권한을 부여받았다.
데이터베이스 연결 구성에 필요한 정보를 모두 입력한 뒤에도 Test Connection 버튼을 클릭하면 공개 키 검색이 허용되지 않는다는 에러문과 함께 연결이 되지 않는 모습을 확인할 수 있는데, 이는 MySQL 8.0 이상에서의 보안 설정값의 문제로 연결 구성 화면의 Driver properties 설정 창에서 allowPublicKeyRetrieval 값을 true 로 설정하면 해결할 수 있다.
설정을 마치고 Test Connection을 클릭하면 정상적으로 연결된 것을 확인할 수 있다.
연결 구성을 완료하면 로컬 호스트 3307번 포트에 앞서 생성한 test_db 데이터베이스에 연결된 모습을 확인할 수 있다.
로컬 호스트를 선택한 상태에서 새 SQL 스크립트를 불러오고 test_db 데이터베이스 내에 test_table 이라는 예시 테이블을 생성해본다.
USE test_db;
CREATE TABLE `test_table` (
`id` int NOT NULL AUTO_INCREMENT,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`name` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '',
PRIMARY KEY (`id`) USING BTREE
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
test_db 데이터베이스를 지정하고 CREATE TABLE 문으로 예시 테이블을 생성했다. 테이블의 구성 열은 다음과 같다.
- id: 데이터가 추가될 때마다 자동으로 1부터 숫자가 채워지고(AUTO_INCREMENT) 각 행마다 유일한 값임을 보장하는 키 값(PRIMARY KEY)이다.
- created_at: 데이터가 추가될 때마다 자동으로 데이터 추가 시간을 저장하는 열이다.
- updated_at: 데이터가 추가될 때 created_at 열과 함께 추가 시간을 저장하지만 해당 행의 데이터가 수정될 경우 데이터가 수정된 시간을 다시 저장한다.
- name: 50bytes 제한의 가변 문자열 형식(VARCHAR(50))을 사용하는 열. NULL 값을 허용하지 않으므로 값이 없는 경우 공백(‘’)을 할당한다.
id, created_at, updated_at 은 테이블 생성시 빠른 검색과 관리를 위해 대중적으로 추가하는(국룰) 열이다. 데이터의 특성을 파악해 여러 열들의 조합으로 primary key를 지정할 수 있다.
ctrl + enter로 스크립트를 실행하면 다음과 같이 성공 메시지를 받아볼 수 있다.
test_db 내부의 테이블 리스트를 확인하면 test_table이 생성되어 있는 모습을 확인할 수 있다.
참고 자료
- “Install Docker Engine on Ubuntu”. docker docs Manuals. https://docs.docker.com/engine/install/ubuntu/.
- “Docker CLI Child commands”. docker docs Reference. https://docs.docker.com/engine/reference/commandline/docker/.
- _nine. “[Docker] MySQL설치 및 접속하기”. Nine’s Log. 2022년 4월 5일. https://velog.io/@_nine/Docker-MySQL%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0.
- ragnarok_code. “도커 컨테이너(Container)와 이미지(Image)란 ?”. GonnabeAlright. 2022년 1월 2일. https://velog.io/@ragnarok_code/도커-컨테이너Container와-이미지Image란.
'정보관리(데이터베이스, DB) > MySQL' 카테고리의 다른 글
MySQL 설정파일 구성, my.cnf 기초! (0) | 2023.08.07 |
---|---|
mysql mysql.sock 개념 (0) | 2023.08.07 |
Docker로 mysql container 생성하고 DBeaver로 접속하기 (0) | 2023.08.01 |
VirtualBox + Ubuntu + MySQL 설치 하기 (0) | 2023.08.01 |
[MySQL] [08S01] Communications link failure (0) | 2023.08.01 |