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

잘 설치가 되었음을 확인할 수 있다.

이제 다음 명령어를 한 번에 실행해보자.

  1. Container를 띄워서 bash shell을 실행하고,
  2. 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

+ Recent posts