본문 바로가기
Infra/Docker

[Docker] Centos에서 MySQL을 도커 컨테이너로 실행하기

by dbjh 2021. 3. 13.
반응형

이번 글에서는 Centos7에서 MySQL을 도커 컨테이너로 띄운 후에 접속하는 방법에 대해 알아보도록 하자. 해당 글에서 진행되는 과정들은 모두 GCP(Google Cloud Platform)에서 진행할 예정이다. 기본적으로 Docker Hub에 이미 MySQL의 이미지가 등록 되어있기 때문에 해당 이미지를 pull해서 컨테이너로 실행해주면된다. 데이터베이스를 컨테이너로 띄워서 활용하는 방식은 CDB(Container DataBase)이라고 하고 그렇지 않은 것은 non-CDB라고 한다.

출처 : 구글검색

 

0. 도커허브에서 MySQL 이미지 검색 
# docker image 검색
docker search mysql

 

1. MySQL 이미지 Pull 하기

도커이미지 pull 할 때는 mysql:{version}으로 버전을 명시해주는데 만약 버전을 명시 하지 않으면 latest 버전을 설치한다

# MySQL 이미지 pull
docker pull mysql
또는
docker pull mysql:latest

# 도커이미지 확인
docker images

mysql 이미지 설치 확인


2. MySQL 컨테이너로 띄우기
# 도커 컨테이너로 실행하기
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=패스워드  mysql

# ex
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=my1234  mysql

# 실행중인 도커 컨테이너 목록확인
docker ps

 

위의 명령어를 간단하게 설명하자면 아래와 같다.

-d : 데몬으로 실행
-e : 도커 컨테이너 환경에서 환경변수 설정
--name : 컨테이너명 설정
-p : 포트포워딩 설정 앞:뒤 라고 했을때, 앞=실제 호스트의 프로세스 포트번호 / 뒤: 도커컨테이너 포트번호

mysql 도커 컨테이너 실행 확인


3. 도커 컨테이너 볼륨 설정하기

실질적으로 MySQL을 컨테이너로 실행하고 나서  MySQL에 접속하여 DDL, DML등을 실행할 것이다. 이런 명령어들을 실행하면 도커 컨테이너 내부에서 동작하게 될 것이고 가상환경에서 데이터들을 관리할것이다. 그렇다면 만약 MySQL 버전업을 위해 MySQL 이미지를 새로받고 기존 컨테이너를 삭제한 후에 컨테이너를 새로 실행시켜야 하는 상황이라면 ? 당연히 내부 데이터들이 날아가기 때문에 치명적인 이슈가 발생할것이다. 그래서 도커에서는 이러한 상황을 대비하여 컨테이너 내부환경의 경로와 실제 호스트환경의 경로를 마운트하는 Volume 설정을 제공해준다. 

여기서 알아둬야할 것은 도커에서는 암시적 볼륨, 명시적 볼륨이 있는데 암시적 볼륨(기본 마운트)의 경우 컨테이너가 삭제되면 함께 삭제되기 때문에 내부 데이터가 삭제되는 문제를 해결할 수 없다. 하지만 명시적으로 볼륨을 생성하여 마운팅하면 영구적으로 데이터를 저장할 수 있다. 즉, 컨테이너가 삭제된 후에도 데이터가 삭제되지 않고 남아있는 것이다. 명시적으로 볼륨을 생성하기 위해 아래의 명령어를 실행하도록 하자.

# 볼륨 생성
docker volume create mysql-volume

# 볼륨 목록 확인
docker volume ls

도커 볼륨 생성

볼륨설정을 추가하여 컨테이너를 실행 하도록하자.

# 볼륨을 설정하여 도커컨테이너 실행
docker run -d -p 3306:3306 -v mysql-volume:/var/lib/mysql --name mysql -e MYSQL_ROOT_PASSWORD=abcd1234 mysql:latest

볼륨설정은 -v 또는 --volume 명령어를 사용하는데, 볼륨 설정 값은 호스트 경로:도커컨테이너 경로로 마운트된다. 여기서는 도커가 호스트에서 관리하는 저장공간인 볼륨 mysql-volume을 도커컨테이너 내부의 /var/lib/mysql에 마운트한 것이다.

 


4. MySQL 컨테이너 접속 및 MySQL 서버 접속하기
# mysql 컨테이너 내부로 접속
docker exec -it mysql bash
또는
docker exec -it mysql bin/bash

root@c151ab821731:/# mysql -u root -p
Enter password: "도커컨테이너 실행시 입력했던 패스워드"

도컨 컨테이너 내부에서 mysql 접속한 화면


5.MySQL DB 생성 및 유저생성
# testdb 데이터베이스 생성
mysql> CREATE DATABASE testdb;

# 데이터베이스 목록 확인
mysql> show databases;

생성된 testdb 확인

DB를 새로 생성했으면 user를 생성하여 접속하도록 하자.

# user 생성 id : user1 / password : abcd1234 - 로컬에서 접속가능
mysql> CREATE USER user1@'localhost' identified by 'abcd1234';


# user 생성 id : user1 / password : abcd1234 - 외부에서 접속가능
mysql> CREATE USER user1@'%' identified by 'abcd1234'


# user1에게 testdb 사용권한을 부여함.
mysql> grant all privileges on test.* to user1@'%';
mysql> grant all privileges on test.* to user1@'localhost';
mysql> FLUSH PRIVILEGES;


# database 접속종료
mysql> \q

# 생성한 user로 mysql 접속
mysql -u user1 -p 
Enter password: abcd1234

# 정상적으로 권한을 부여 받았는지 확인
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testdb             |
+--------------------+

새로생성한 user로 mysql 접속 확인


6. 도커 볼륨 영구 저장확인

마지막으로 도커 컨테이너를 정지/삭제 하고나서 새로운 컨테이너를 생성하여 볼륨을 그대로 마운트 시켰을때, 기존 정보가 저장되어 있는지 확인해 보도록하자.  위에서 testdb 를 생성해둔 상태인데, 컨테이너를 삭제하고나서 다시 생성 및 실행 시켰을 때 해당 데이터베이스가 그대로 유지되는지 확인하면 된다.

# mysql 컨테이너 중지
docker stop mysql

# mysql 컨테이너 삭제
docker rm mysql

# mysql-volume 매핑하여 mysql 컨테이너 실행
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=abcd1234 -v mysql-volume:/var/lib/mysql mysql:latest

# mysql 컨테이너 내부로 접속
docker exec -it mysql bash

# mysql 접속 후 비밀번호 입력
mysql -u root -p


# 데이터베이스 목록 확인
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)

이전에 생성한 데이터 베이스가 정상적으로 남아있는 것을 확인할 수 있다.

7. 로컬 PC에서 MySQL 컨테이너로 접속하기

우선 해당 글은 GCP에서 진행된 과정이기 때문에 아래의 글을 참고하여 3306 포트 인바운드 허용을 설정하도록 하자.

 

GCP(Google Cloud) 방화벽 설정: 프로토콜과 포트를 사용 허용 또는 거부하기

Google Cloud Platform(이하 GCP)에서는 방화벽을 설정하는 방법을 설명합니다. GCP에서 서버를 구축하고 외부 인터넷 망을 통해서 해당 서버에 접속하는 경우 방화벽에서 특정 프로토콜과 포트를 허용

kibua20.tistory.com

인바운드 허용설정이 완료되었으면 로컬에서 telnet으로 접속하도록 하자.

# telnet으로 원격의 mysql 접속하기
telnet 원격IP 3306

# ex
telnet 33.59.132.248 3306

telnet 접속 확인

telnet으로 정상적으로 접속된 것을 확인할 수 있다. 실질적으로 MySQL에 접속하여 사용할 수 있는지 DB Client tool을 이용하여 접속해보도록하자. 필자는 DBeaver라는 툴을 사용할 것이다.

아래 표시된 내용들을 입력하고 Test Connection ... 버튼을 클릭하도록하자. 

그런데 여기서 java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'. 와 같은 에러메세지가 노출될 것이다. 이 에러는 mysql 패스워드를 sha2 방식으로 암호화하지 않아 발생하는 것이다. 이런경우에는 다시  MySQL 컨테이너로 돌아가서 아래의 명령을 실행하도록 하자.

# 패스워드 암호화 처리
mysql> alter user user1@'%' IDENTIFIED with mysql_native_password by 'abcd1234';

위의 명령어를 실행하고 로컬의 DB Client Tool(DBeaver)에서 다시 Test Connection ... 버튼을 클릭하도록하자.

Test Connection 성공

정상적으로 연결이 된것을 확인할 수 있다.

 

MySQL 도커 컨테이너로 실행후 접속하기 끝.

 

참조

 

MySQL Docker Containers: Understanding the Basics

In this post, we will cover some basics around running MySQL in a Docker container. It walks you through how to properly fire up a MySQL container, change configuration parameters, how to connect to the container, and how the data is stored.

severalnines.com

 

 

Stay with non-CDB or go to CDB? - Blog dbi services

Do we have to go to CDB architecture as non-CDB is deprecated?

blog.dbi-services.com

 

 

 

반응형

댓글