Simplify

mariaDB(mysql) 원격 접속 허용하기 (How to allow 'Remote access' for mariaDB(mysql)) & docker로 mariadb 실행하기위한 docker-compose.yml & custom.cnf 본문

Web & Server/OS, Windows, Linux

mariaDB(mysql) 원격 접속 허용하기 (How to allow 'Remote access' for mariaDB(mysql)) & docker로 mariadb 실행하기위한 docker-compose.yml & custom.cnf

Simplify - Jonghun 2019. 6. 13. 16:15

요즘은 maria DB 를 자주 사용하고 있습니다. 가볍고, 지원하는 툴도 가볍고, 무료이고.. 사용하기 편한 DB 인 것 같습니다. 하지만 모든 프로그램이 그렇듯, 최초에 설치하고 나면 설정해야 할 것들이 조금 있습니다. mysql 기반 maria DB 역시 마찬가지인데, 가장 큰 문제가 되는 것이 원격 접속에 대한 것입니다. 

 

처음 maria DB를 설치하게 되면 root 계정에 대한 패스워드를 묻고, 설치를 마무리하게 됩니다. 서버에서

$ mysql -u root {패스워드}

를 입력하면 정상적으로 접속되는 것을 확인할 수 있는데, 문제는 원격에서 접속입니다. 

 

하나의 Host 안에서 어플리케이션과 DB를 모두 사용한다면 큰 문제가 되지 않겠지만, 거의 그런 상황은 없어보이고, 개발.테스트 목적으로라도 원격에서 접속해야 할 상황들이 있게 마련입니다. 

 

여기서는 이 부분에 대해서 어떻게 처리하면 되는 지, 설치 이후 작업에 대해서 알아봅니다. 

 

우선 위 명령어를 입력해서 mysql에 접속하고 어떤 상황인지 확인합니다.

mysql> SELECT Host,User,plugin,authentication_string FROM mysql.user;
+-----------+------+-----------------------+-------------------------------------------+
| Host      | User | plugin                | authentication_string                     |
+-----------+------+-----------------------+-------------------------------------------+
| localhost | root | mysql_native_password | *8024A6913C57E024BDFC6E813A57DFB924E6803A |
+-----------+------+-----------------------+-------------------------------------------+
2 rows in set (0.000 sec)

위와 같이 나오는 경우, root 에 대해서 host 가 localhost 즉, 자기 자신의 machine 에만 한정되어 있는 것을 알 수 있습니다. 

 

방법은, 두 가지가 가능합니다. 

  1. 위에 보이는 root 행에 대해서 localhost 대신 '%' 로 update하여 모든 ip 에 대해서 접근이 가능하게 한다. 
  2. 똑같이 root 에 해당하는, Host 를 '%'로 하는 row를 하나 추가(insert) 한다.

 

첫 번쨰 방법을 수행하려면, 아래와 같이 입력합니다. 

GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%' IDENTIFIED BY '패스워드';

 

두 번째 방법을 수행하려면, 아래와 같은 절차로 입력합니다. 

INSERT INTO mysql.user (host,user,authentication_string,ssl_cipher, x509_issuer, x509_subject) VALUES ('%','아이디',password('패스워드'),'','','');
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%';
FLUSH PRIVILEGES;

 

만약 특정 ip대역을 허용한다면(예. 111.222.xxx.xxx)

GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.%' IDENTIFIED BY '패스워드';
INSERT INTO mysql.user (host,user,authentication_string,ssl_cipher, x509_issuer, x509_subject) VALUES ('111.222.%','아이디',password('패스워드'),'','','');
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.%';
FLUSH PRIVILEGES;

 

만약 특정 ip 1개만 허용하려면 (운영 환경에서는 들어오는 채널을 하나만 두개 하기위해서 이런 방법을 사용하기도 합니다)

GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.33.44' IDENTIFIED BY '패스워드';
INSERT INTO mysql.user (host,user,authentication_string,ssl_cipher, x509_issuer, x509_subject) VALUES ('111.222.33.44','아이디',password('패스워드'),'','','');
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.33.44';
FLUSH PRIVILEGES;

 

원래 상태로 복구하려면 (2번째 방법에 대해서만..)

DELETE FROM mysql.user WHERE Host='%' AND User='아이디';
FLUSH PRIVILEGES;

 

마지막으로 LISTEN 하는 IP를 확인하고 이를 변경해 주어야 합니다. 

$ netstat -ntlp | grep mysqld
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      7931/mysqld
$ vi /etc/mysql/my.cnf

 

이 파일을 열어서, 다음의 내용으로 변경합니다. 

#bind-address            = 127.0.0.1
bind-address            = 0.0.0.0
그런데, 사실은 저 파일을 직접 수정하는 것이 아니라, /etc/mysql/conf.d 에 cnf 확장자를 갖는 파일을 추가해주면 override해서 적용해 줍니다. 이 방법이 정상적인 방법입니다.

 

그리고 나서, 아래 방법으로 재실행을 해 주고 LISTEN ip를 확인합니다. 

$ service mysql restart
mysql stop/waiting
mysql start/running, process 8190
$ netstat -ntlp | grep mysqld
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      8190/mysqld

 

이 모든 과정은 docker 를 사용하는 경우 모두 생략됩니다. 왜냐면, docker 자체가 container 방식으로 구동되고, 따라서 모든 접근 실제로 외부 입니다. 그렇지 않고,
$ docker exec -it mariadb /bin/bash
를 통해서 docker container 내부로 들어간 뒤, mysql -u {사용자} -p 로 접근하는 경우는 아주 특별한 경우입니다. (잘 사용하지 않고, 권하지도 않습니다. 

mariadb 공식 docker image 를 받아서 실행해 보면 '%'로 다 열려있는 것을 알 수 있습니다. 

 

 

참고로, 제 docker-compose.yml 파일과, custom.cnf 파일 내용을 공유합니다^^

 

[docker-compose.yml]

version: '3.1'

services:
  maria:
    image: mariadb:latest
    container_name: "mariadb"
    restart: always
    ports:
      - "63306:3306"
    volumes:
      - ~/docker/mariadb/etc/mysql/conf.d:/etc/mysql/conf.d:ro
      - ~/docker/mariadb/var/lib/mysql:/var/lib/mysql
      - ~/docker/mariadb/var/log/maria:/var/log/maria
    environment:
      - MYSQL_ROOT_PASSWORD=???
      - TZ="Asia/Seoul"

[custom.cnf]

[client]
port            = 3306
default-character-set=utf8

[mysqld]
#bind-address           = 127.0.0.1
bind-address            = 0.0.0.0

key_buffer_size         = 512M
innodb_buffer_pool_size = 512M

init_connect="SET collation_connection=utf8_general_ci"
character-set-server = utf8
collation-server = utf8_unicode_ci

[mysql]
default-character-set=utf8

 

 

참고 자료 : https://zetawiki.com/wiki/MySQL_%EC%9B%90%EA%B2%A9_%EC%A0%91%EC%86%8D_%ED%97%88%EC%9A%A9

Comments