- Mysql 띄우기 패스워드는 1234로 하기
- 패스워드 변경 sql로
- 새로운 유저 생성 권한은 DML만
- 외부 접속 설정 파일 위치
- 볼륨 지정
- 컨테이너 삭제 후 재생성 시 데이터가 남아있어야 한다.
- 두 개의 컨테이너가 같은 데이터 가지고 있기(인서트 하면 다른 디비에도 데이터 들어가게)
- 외부 접속 허용
- DML DDL 차이
- COMMIT 이란?
1. Mysql 띄우기 패스워드는 1234로 하기
먼저 Mysql 이미지를 받아온다.
docker pull mysql
그리고 Mysql 이미지를 컨테이너에 실행시킨다. 실행을 시키면서 동시에 패스워드도 설정할 것이다.
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest
위 명령어를 풀어서 해석하자면 아래와 같다.
--name <container_name> : <container_name> 이름의 컨테이너를 실행한다.
-e : 컨테이너 내에서 사용할 환경변수를 설정
-e MYSQL_ROOT_PASSWORD= : MySQL의 root 권한의 비밀번호를 로 설정한다.
-d : detach 모드로 컨테이너가 실행된다. 컨테이너가 백그라운드로 실행된다고 보면 된다.
-p <호스트 포트> <컨테이너 포트> : 호스트와 컨테이너의 포트를 연결한다
mysql:latest : 컨테이너에 사용할 이미지
2. 패스워드 변경 sql로
패스워드는 도커 컨테이너에 들어가서 변경이 가능하다.
docker exec -it mysql-container mysql -u root -p
접속을 완료한다면, 아래와 같은 sql을 통해 비밀번호 변경이 가능하다.
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
3. 새로운 유저 생성 권한은 DML만
새로운 유저를 생성하는 명령어 후 권한은 DML만 주도록 하겠다.
CREATE USER 'new_user'@'%' IDENTIFIED BY '1234';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'new_user'@'%';
여기서 DML이랑 'SELECT', 'INSERT', 'UPDATE', 'DELETE' 를 뜻한다.
4. 외부 접속 설정 파일 위치
외부에서 Mysql을 접속하려면 my.cnf 또는 mysqld.cnf을 수정해야 한다.
컨테이너를 들어간 상태에서 아래와 같은 명령어로 파일을 열 수 있다.
docker exec -it mysql-container bash
그런데 여기서 문제가 발생했다.
파일을 생성해서 수정하려고 하는데, vi vim 모두 'not found' 에러가 발생했으며, apt-get yum 또한 'not found' 에러가 발생했다.
그럼 어떤 방식으로 생성하라는 걸까...?!?!??!?!
microdnf install -y vim
구글링이 역시 답이다.. 위 명령을 작성하니 vim 설치가 되었다 ㅎㅎ
vim /etc/my.cnf
위와 같이 명령어를 치면 아래와 같이 파일 내용이 나온다.
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/9.0/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
5. 볼륨 지정
볼륨을 생성하고 컨테이너를 run하려면 아래와 같은 명령어를 사용한다.
docker volume create mysql_volume
docker run --name mysql_container -e MYSQL_ROOT_PASSWORD=1234 -p 3307:3306 -v mysql_volume:/var/lib/mysql -d mysql:latest
-v mysql_volume:/var/lib/mysql: 볼륨을 mysql_volume로 지정하여 컨테이너 삭제 후 재생성 시에도 데이터가 유지되도록 합니다.
6. 컨테이너 삭제 후 재생성 시 데이터가 남아있어야 한다.
데이터를 임의로 넣어주고 컨테이너 삭제 후 재생성 시 데이터가 남아있는 지 확인해 볼 예정이다.
docker exec -it mysql_test_container mysql -uroot -p1234
-- 데이터베이스 생성
CREATE DATABASE testdb;
-- 데이터베이스 사용
USE testdb;
-- 테이블 생성
CREATE TABLE test_table (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
-- 데이터 삽입
INSERT INTO test_table (name) VALUES ('Hello, World!');
위와 같이 데이터를 넣으면 아래와 같이 데이터가 들어간 것을 확인할 수 있다.
이제 삭제 후 다시 데이터가 존재하는 지 확인해 보겠다.
# 컨테이너 정지
docker stop mysql_container
# 컨테이너 삭제
docker rm mysql_container
# 동일한 볼륨을 사용하여 MySQL 컨테이너 재생성
docker run --name mysql_container_2 -e MYSQL_ROOT_PASSWORD=1234 -p 3307:3306 -v mysql_volume:/var/lib/mysql -d mysql:latest
mysql_container_2 안에 들어가서 테이블 및 데이터를 확인한 결과 아래와 같이 잘 저장되어 있는 것을 확인할 수 있다!!
7. 두 개의 컨테이너가 같은 데이터 가지고 있기(인서트 하면 다른 디비에도 데이터 들어가게)
일단 두 개의 컨테이너를 띄워줄 예정인데, 이게 다른 방법이 있을 지는 모르겠지만 내가 실행해 본 결과 두 컨테이너가 동시에 같은 하나의 볼륨을 갖고 있는게 불가능한 것 같았다.
그래서 'Replication' 을 사용해서 위 문제를 해결할 예정이다.
# 마스터 컨테이너 실행
docker run --name mysql_master -e MYSQL_ROOT_PASSWORD=1234 -p 3307:3306 -v mysql_master_data:/var/lib/mysql -d mysql:latest
# 슬레이브 컨테이너 실행
docker run --name mysql_slave -e MYSQL_ROOT_PASSWORD=1234 -p 3308:3306 -v mysql_slave_data:/var/lib/mysql -d mysql:latest
이제 마스터 컨테이너에 접속하여 'Replication' 설정을 구성할 것이다.
docker exec -it mysql_master mysql -uroot -p1234
-- 마스터 설정
CREATE USER 'repl'@'%' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
-- 마스터의 상태 확인
SHOW MASTER STATUS;
8. 외부 접속 허용
bind-address = 0.0.0.0 // my.cnf 파일 안에 이러한 내용을 넣었다.
그래서 아래와 같이 완성이 되었다.
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/9.0/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
bind-address = 0.0.0.0
host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
bind-address를 0.0.0.0으로 설정하여 모든 IP로부터의 접속을 허용할 수 있다.
9. DML DDL 차이
✅ DML (Data Manipulation Language): 데이터베이스의 데이터를 조작하는 명령어들을 말한다.
ex) SELECT, INSERT, UPDATE, DELETE
✅ DDL (Data Definition Language): 데이터베이스의 구조를 정의하는 명령어들을 말한다.
ex) CREATE, ALTER, DROP
10. COMMIT 이란?
✅ COMMIT : 트랜잭션을 종료하고, 해당 트랜잭션에서 수행된 모든 변경사항을 데이터베이스에 영구적으로 반영하는 SQL 명령어를 말한다.