일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Jenkins
- remove
- not to accept jdbcUrl
- jdbc
- spring
- change file content
- mariadb
- spring boot
- docker
- JavaScript
- duplicate lines
- install maven
- svn backup
- maven
- driverspy
- JAR
- javaascript
- ^M바꾸기
- local
- key bindings
- pkgutil
- install
- Java
- 전송포맷
- ubuntu
- gradle
- 줄복사
- ADB
- Change port
- object
- Today
- Total
Simplify
mariaDB(mysql) 원격 접속 허용하기 (How to allow 'Remote access' for mariaDB(mysql)) & docker로 mariadb 실행하기위한 docker-compose.yml & custom.cnf 본문
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 에만 한정되어 있는 것을 알 수 있습니다.
방법은, 두 가지가 가능합니다.
- 위에 보이는 root 행에 대해서 localhost 대신 '%' 로 update하여 모든 ip 에 대해서 접근이 가능하게 한다.
- 똑같이 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