TIL/DOCKER

[Docker] docker-container 로 MySQL 접속하기

아람2 2024. 12. 7. 17:44
반응형

Docker

어플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼

환경에 구애받지 않고 어플리케이션을 신속하게 배포 및 확장할 수 있다 

1. 캡슐화 

2. 특권/ 비특권 컨테이너 

- 비특권 컨테이너는 호스트 시스템의 민감한 자원에 대한 접근이 제한된다, 보안 상으로는 안전하지만 시스템 제어가 불가하다 

- 특권 컨테이너는 Host 시스템의 리소스를 더 많이 제어할 수 있는 권한을 가지고 있다

Docker Container 

어플리케이션을 독립된 환경에서 실행할 수 있는 환경 

Docker-Compose

여러 개의 컨테이너를 관리하고 설정하는 도구 

 

컨테이너는 캡슐화되어 어플리케이션을 실행하는 독립된 환경이고, 컨테이너들을 Docker-Compose 에 담아 관리한다 

컨테이너는 화물 상자, Docker-Compose 는 여러 화물 상자를 운반하고 관리하는 선박 또는 컨테이너 관리 도구에 비유할 수 있다 


 

하루이와 기초 개념을 공부하고, ubuntu 22.04 에 Docker 와 Docker-Container 를 설치했다 

Docker 설치는 하루이의 블로그를 참고했고 (강요 당함) - 도커 https://developsvai5096.tistory.com/93

컨테이너 설치는 아래 Command 를 이용했다 

# 최신 docker-compose 버전 확인
DOCKER_COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d')

# docker-compose 바이너리 다운로드 및 설치
sudo curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose

# 심볼릭 링크 생성 (필요한 경우)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 설치 확인
docker-compose --version

 

오늘의 과제 
1. Docker-compose 를 활용해서 mysql-server 띄우기
2. mysql Admin 사용자를 제외하고 TestDB 생성
3. TestDB 에만 모든 권한을 가진 사용자 생성
4. TestDB 안에 BBanana 테이블 생성
5. 팀원들 필드 설정, 각 팀원들에게 숫자 "1" 삽입
6. docker exec -it 로 컨테이너 내부에서 mysql Server 로 진입하여 테이블 데이터 확인

 

Ubuntu 에 접속해서 docker-compose.yaml 를 만들고 mysql 이미지를 생성해서 up -d 로 실행해줬다 짜잔 

sudo docker-compose up -d

* -d 는 컨테이너를 백그라운드에서 계속 실행시키는 옵션, -d 를 사용하지 않으면 컨테이너 로그가 현재 터미널에 출력된다 

mysql_container 가 생성되었고, Started 상태로 표시되어 MySQL 서버가 정상적으로 실행되고 있음을 알 수 있다 

 

그리고 이제 Docker 컨테이너 내부의 MySQL 에 접속하고, MySQL 프롬프트에서 testDB 와 test_user 를 생성해 준다 

$ sudo docker exec -it mysql-container mysql -u root -p
# 패스워드는 Root 계정 비밀번호
mysql> CREATE DATABASE testDB;
mysql> CREATE USER 'test_user'@'%' IDENTIFIED BY 'test_password';
mysql> GRANT ALL PRIVILEGES ON testDB.* TO 'test_user'@'%';

🐣 mysql 은 한 번에 여러 명령어를 실행하려고 하면 오류가 발생한다, 프롬프트에서는 각 명령어를 " ; " 로 끝내야 한다 🐣

 

testDB 를 생성한 후 EXIT 명령어로 mysql 프롬프트를 종료하고, 새 사용자로 접속하여 확인해본다 

$ mysql -u test_user -p -h 127.0.0.1 -P 3306 mysql
Enter password:
ERROR 1044 (42000): Access denied for user 'test_user'@'%' to database 'mysql'

test_user 로 mysql 에 접근할 수 없음을 보여준다 

-u test_user ㅡ 사용자 이름을 test_user 로 지정 

-p ㅡ 비밀번호 입력을 요구 

-h 127.0.0.1 ㅡ MySQL 서버의 호스트를 127.0.0.1 (Localhost) 로 지정 

-P 3306 ㅡ MySQL 서버가 사용하는 포트 3306 지정 

testDB ㅡ 접속할 데이터베이스 이름 지정 

반대로, 접근 권한이 있는 testDB 는 접속 가능하다 

$ mysql -u test_user -p -h 127.0.0.1 -P 3306 testDB
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.40 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [testDB]>

🐣 DB 에 접속할 때, mysql -u test_user -p -h 127.0.0.1 -P 3306 으로 접속해도 되지만

내가 아직 기본 데이터베이스를 지정해 주지 않아서 MySQL [(none)]> 로 접속이 된다 🐣

 

3번까지 완료하였으니, 이제 testDB 안에 BBanana Table 을 만들어 줄 차례이다 

🐣 MySQL 테이블 - 데이터를 구조적으로 저장하는 기본 단위

데이터베이스 내에 여러 테이블을 두고, 각각의 테이블은 Row 와 Column 으로 구성되어 있다 

MySQL 테이블은 관계형 데이터베이스에서 데이터를 저장하고 관리하는 중요한 역할을 한다 

각 열은 데이터의 특정 속성 (ex. 이름, 나이, 주소) 을 저장하고, 특정 데이터 타입을 가질 수 있다 

각 행은 특정 데이터 항목 (Record) 를 나타낸다, 열에 정의된 속성에 맞는 값을 가진다 🐣

 

CREATE TABLE 명령어로 테이블을 생성하고, 구조 (필드, 데이터 타입 등) 를 () 안에 정의한다 

컬럼은 [필드명 데이터타입 제약조건] 순으로 정의할 수 있다 

MySQL [testDB]> CREATE TABLE BBanana (
    -> id INT AUTO_INCREMENT PRIMARY KEY,
    -> name VARCHAR(50) NOT NULL,
    -> team_number INT NOT NULL
    -> );
Query OK, 0 rows affected (0.081 sec)

 

이제 팀원들 필드를 설정하고 각 팀원에게 숫자 " 1 " 을 삽입할 차례이다 

MySQL [testDB]> INSERT INTO BBanana (name, team_number) VALUES
    -> ('Ahram', 1),
    -> ('YJ', 1),
    -> ('HS', 1),
    -> ('DH', 1),
    -> ('SH', 1);
Query OK, 5 rows affected (0.016 sec)
Records: 5  Duplicates: 0  Warnings: 0

# 사실 이렇게 줄을 다 띄우지 않아도 된다 
MySQL [testDB]> INSERT INTO BBanana (name, team_number) VALUES ('Ahram', 1), ('YJ', 1), ('HS',
 1), ('DH', 1), ('SH', 1);
Query OK, 5 rows affected (0.016 sec)
Records: 5  Duplicates: 0  Warnings: 0

INSERT 명령어로 이름과 번호를 BBanana Table 에 삽입했다

삽입한 데이터가 BBanana Table 에 잘 들어갔는지 확인한다 짜잔 

MySQL [testDB]> SELECT * FROM BBanana;
+----+-------+-------------+
| id | name  | team_number |
+----+-------+-------------+
|  1 | Ahram |           1 |
|  2 | YJ    |           1 |
|  3 | HS    |           1 |
|  4 | DH    |           1 |
|  5 | SH    |           1 |
+----+-------+-------------+
5 rows in set (0.002 sec)

 

 

🐣 데이터를 수정할 때는 UPDATE 명령어를 활용한다, id 4 의 DH 를 DDH 로 변경하고 싶으면 아래 명령어를 입력하면 된다 🐣

MySQL [testDB]> UPDATE BBanana SET name = 'DDH' WHERE id = 4;

 

과제의 마지막 관문은 docker exec -it 로 컨테이너 내부에서 MySQL Server 로 진입하여 테이블 데이터를 확인하는 것이다 

 

🐣 Docker Container 에 접속하기 전에, docker ps 로 실행 중인 컨테이너를 확인해 준다 

중지된 컨테이너도 함께 보고 싶으면 docker ps -a 를 사용하면 된다 🐣

$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS        PORTS                                                  NAMES
------------   mysql:8.0      "docker-entrypoint.s…"   18 hours ago   Up 18 hours   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql-container
------------   nginx:latest   "/docker-entrypoint.…"   18 hours ago   Up 18 hours   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp                nginx_container

 

 

Ubuntu 에서 docker exec -it [컨테이너 이름] bash 명령어로

MySQL 서버가 실행 중인 Docker Container (mysql-container) 에 접속한다 

$ docker exec -it mysql-container bash
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.47/containers/mysql-container/json": dial unix /var/run/docker.sock: connect: permission denied
$ sudo docker exec -it mysql-container bash
bash-5.1#

 

그리고 컨테이너 내부에서 MySQL 클라이언트를 실행하고, 확인하려는 테이블의 데이터를 조회한다 짜잔

bash-5.1# mysql -u test_user -p testDB
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 8.0.40 MySQL Community Server - GPL

Copyright (c) 2000, 2024, 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>
mysql> SELECT * FROM BBanana;
+----+-------+-------------+
| id | name  | team_number |
+----+-------+-------------+
|  1 | Ahram |           1 |
|  2 | YJ    |           1 |
|  3 | HS    |           1 |
|  4 | DH    |           1 |
|  5 | SH    |           1 |
+----+-------+-------------+
5 rows in set (0.00 sec)

mysql>

 

🐣 현재 접속한 DB 에 있는 테이블 목록을 확인하려면 SHOW TABLES; 명령어를 사용하면 된다 🐣

mysql> SHOW TABLES;
+------------------+
| Tables_in_testDB |
+------------------+
| BBanana          |
+------------------+
1 row in set (0.00 sec)

mysql>

 

짜잔!

각오해라 하루이

 

반응형

'TIL > DOCKER' 카테고리의 다른 글

[Docker] Docker Image Build  (0) 2025.01.04
Docker Exited (0) 되는 문제 수정하기  (0) 2024.12.24
CI/CD via Jenkins #2  (0) 2024.12.23
CI/CD via Jenkins + Docker #1  (1) 2024.12.22
쿠버네티스 Kubernetes  (0) 2024.12.17