Database에 대한 추가 이해가 필요해 MySql 수업을 들어야 했다.
내 PC에는 MySql Workbench가 설치되어 있었지만,
마침 Docker 수업을 들었었기에 이를 이용하여 Cli로 MySQL을 다뤄보기로 했다.
기본적인 docker container를 어떻게 실행하는지에 관해서도 포스팅했다.
https://choincnp.tistory.com/70
DOCKER에서 MySQL 컨테이너 띄우기
먼저, docker hub에서 mySQL 관련 image를 찾는다.
그러면 첫 번째로 mysql에 대한 official image가 있고, 들어가보면 명령어를 찾을 수 있다.
먼저 Docker desktop을 실행시키고, mysql 이미지를 가져오자.
$ docker pull mysql
설치가 되는 것을 볼 수 있다. 잘 설치되었는지 한번 확인해보자.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 99afc808f15b 13 days ago 577MB
이제 이 이미지를 기반으로 한 컨테이너를 띄울 것이다.
$ docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest
다시 설명하자면, 이 명령어를 자연어로 번역하면 다음과 같다.
mysql:latest 이미지를 기반으로 하는 mysql-container라는 이름을 가진 container를 띄울 거야.
-e라는 옵션으로 environment variable(환경 변수)를 줄 건데, MYSQL_ROOT_PASSWORD는 로 줄거야.
-d라는 옵션으로, 백그라운드에도 이 컨테이너를 계속 돌릴거야. (dispatch)
-p라는 옵션으로, host OS의 3306번 포트와 컨테이너의 3306번 포트(mySql 기본 포트)를 포트포워딩 해줘.
<password>에는 꼭 기억하기 쉬운 패스워드를 넣도록 하자.
이제, 설치가 되었는지 확인하자.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47d2686d7c9b mysql:latest "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-container
잘 설치가 되었음을 확인할 수 있다.
이제 다음 명령어를 한 번에 실행해보자.
- Container를 띄워서 bash shell을 실행하고,
- mysql root 계정에 접속해보자.
$ docker exec -it mysql-container bash
bash-4.4# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.1.0 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql >
query를 입력할 수 있는 라인이 뜨면, 정상적으로 접속한 것이다.
default로 생성된 DB를 확인해보자.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
총 4개의 DB가 디폴트로 생성되어 있음을 확인할 수 있다.
이제, 우리가 사용할 database를 만들어보자.
나는 회사와 관련된 스키마를 만들고 테스트 할 것이므로, company라는 DB를 만들었다.
mysql> CREATE DATABASE company;
Query OK, 1 row affected (0.00 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| company |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
이제, 이 company를 이용해야 하므로 다음과 같은 명령어를 준다.
mysql > use company;
이제, 테이블을 만들어보자.
mysql> create table DEPARTMENT(
-> id INT PRIMARY KEY,
-> name VARCHAR(20) NOT NULL UNIQUE,
-> leader_id INT
-> );
Query OK, 0 rows affected (0.05 sec)
세미콜론(;)을 넣지 않으면 자동으로 shell에서 줄바꿈을 지원한다.
처음으로는 '부서(department)'에 관한 테이블을 만들었다.
mysql> show tables;
+-------------------+
| Tables_in_company |
+-------------------+
| DEPARTMENT |
+-------------------+
1 row in set (0.00 sec)
테이블이 잘 만들어진 것을 확인할 수 있다.
그렇다면, 추가적으로 workbench에서도 이 내용이 반영되었을까?
WORKBENCH에서 DATABASE 확인하기
docker-mysql이라는 커넥션을 만들고 연결한 다음,
아까 host의 3306번 포트와 container의 3306번 포트를 연결시켰으므로 포트에 3306 옵션을 주고 들어간다.
쿼리 콘솔에서 select문으로 테이블을 확인해보면, 다음과 같이 잘 만들어졌음을 알 수 있다.
그럼 반대로, workbench에서 실행한 내용도 container에 잘 들어 갈까?
내가 결국 만들 db는 위와 같은 형태를 띄고 있으므로,
다음은 employee TABLE을 만들어보자.
CREATE TABLE EMPLOYEE(
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
birth_date DATE,
sex CHAR(1) CHECK(sex in ('M', 'F')),
position VARCHAR(10),
salary INT DEFAULT 5000000,
dept_id INT,
FOREIGN KEY(dept_id) references DEPARTMENT(id)
on delete SET NULL on update CASCADE,
CHECK(salary >= 5000000)
);
QUERY CONSOLE에서 위 SQL을 입력했고, 테이블까지 잘 만들어졌다.
이제 CLI에서 내용이 잘 실행되었는지를 확인해보자.
mysql> show tables;
+-------------------+
| Tables_in_company |
+-------------------+
| DEPARTMENT |
| EMPLOYEE |
+-------------------+
2 rows in set (0.00 sec)
잘 적용되었음을 확인할 수 있다. 과연 내용들도 잘 만들어 졌을까?DESC(DESCRIBE) TABLE
명령어로 테이블 구조나 attributes를 확인할 수 있다.
mysql> DESC EMPLOYEE
-> ;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(30) | NO | | NULL | |
| birth_date | date | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| position | varchar(10) | YES | | NULL | |
| salary | int | YES | | 5000000 | |
| dept_id | int | YES | MUL | NULL | |
+------------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
이렇게 mySQL을 docker에서 돌리는 방법을 확인했다. 정말 별 것 아니다.
오늘도 열심히 따라와준 나에게도 박수 :)
'DB' 카테고리의 다른 글
ORM이란 무엇인가요? JPA와 MyBatis는 어떤 차이가 있나요? (0) | 2023.12.13 |
---|---|
POSTGRESQL - RDB (0) | 2023.08.19 |
POSTGRESQL - 분노의 설치 (0) | 2023.08.19 |