반응형

도커 컨테이너에 MariaDB 설치 및 파이썬 예제

 

글. 수알치 오상문

 

도커 컨테이너에 MariaDB 설치하기

[참고] https://7942yongdae.tistory.com/130

 

윈도우즈용 도커는 WSL 기능을 이용하므로 WSL 설치 안된 경우, WSL 부터 설치하자.

[참고] https://learn.microsoft.com/ko-kr/windows/wsl/install

 

 

1. 도커 다운로드 설치

Windows용으로 설치 파일 다운로드 받아서 설치

https://www.docker.com/get-started/

 

2. 도커 GUI 상단 검색창에서 'mariadb' 검색 후 원하는 이미지 선택하고, 하단 'PULL' 클릭

[참고] docker pull mariadb

 

이제 wsl에서 사용하는 리눅스에 접속하여 도커를 다룰 수 있다.

[참고] https://learn.microsoft.com/ko-kr/windows/wsl/tutorials/wsl-containers

 

> docker --version 도커 버전 확인

> docker images 사용 가능한 이미지 목록

> sudo docker ps 실행 중인 컨테이너 목록

 

3. mariadb 컨테이너 실행

 

docker rm mariadb <-- 기존 컨테이너 제거하는 명령

 

[참고] 제거 오류 발생하면 아래 명령으로 제거 시도

docker kill $(docker ps -q)

docker rm $(docker ps -a -q)

 

 

mariadb 컨테이너 실행

 

docker run --name mariadb -d -p 3306:3306 --restart=always -e MYSQL_ROOT_PASSWORD=root mariadb

 

--name: 만들어서 사용할 컨테이너의 이름을 정의

-d: 컨테이너를 백그라운드에서 실행

-p: 호스트와 컨테이너 간의 포트를 연결 (host-port:container-port) // 호스트에서 3306 포트 연결 시 컨테이너 3306 포트로 포워딩

--restart=always: 도커가 실행되는 경우 항상 컨테이너를 실행

-e: 기타 환경설정(Enviorment)

MYSQL_ROOT_PASSWORD=root // mariadb의 root 사용자 초기 비밀번호를 설정

mariadb: 컨테이너를 만들 때 사용할 이미지 이름

 

[에러] docker: Error response from daemon: Ports are not available:

listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address

(protocol/network address/port) is normally permitted.

해결 1 --> 포트 설정 변경한다. 3307:3306 의미는 바깥에서는 3307 포트로 접속하고, 컨테이너 내부는 3306으로 받음

해결 2 --> Windows에서 돌아가는 MySQL 포트와 겹치면 오류가 발생한다.

win+r 누르고 services.msc 실행하고 MySQL을 선택하여 '자동실행'을 '수동' 변경 및 중지 적용

 

[에러] docker: Error response from daemon: Conflict. The container name "/mariadb" is already in use by container "44e9379dbfd8a35b26ea06347b3b6db3214fd5f64f8555f1e661aff22caca7a1". You have to remove (or rename) that container to be able to reuse that name.

--> 기존 컨테이너 삭제하고 시도하자.

docker rm mariadb

 

[참고] Docker 컨테이너 실행 / 종료

docker start mariadb <-- 기존 실행했던 옵션 적용됨

docker stop mariadb

 

[참고] 도커 호스트와 컨테이너 간의 파일 복사 (docker container cp)

컨테이너 -> 호스트로 복사:

docker container cp <컨테이너 식별자>:<컨테이너 안의 파일 경로> <호스트 디렉토리 경로>

호스트 -> 컨테이너로 복사:

docker container cp <호스트의 파일> <컨테이너 식별자>:<컨테이너 안의 파일 경로>

 

4. Mariadb에 database를 추가하고 user 설정

도커를 이용해서 Mariadb를 설치하는 과정은 다 끝났다.

이제 database를 만들고 user를 추가해 권한을 부여하자.

 

5. Docker - Mariadb 컨테이너 접속하기

docker exec -it mariadb /bin/bash

 

만약 Mariadb 컨테이너를 만들 때 컨테이너 이름을 변경했다면 mariadb 대신에

변경한 컨테이너 이름을 사용하자.

 

실행하면 아래처럼 명령 프롬프트가 변경된다.

root@24111f16d353:/#

 

6. Mariadb - 루트 계정으로 데이터베이스 접속

mysql -u root -p

 

위 명령어를 입력하고 엔터, Mariadb 컨테이너를 만들 때 사용한 패스워드를 입력하자.

예시 명령어에서는 "root"를 root의 초기 비밀번호로 설정하였다.

성공하면 명령 프롬프트가 다음처럼 바뀐다.

 

MariaDB [(none)]>

 

7. Mariadb - 데이터베이스 만들기

create database [db_name];

 

ex) create database test;

Query OK, 1 row affected (0.001 sec)

 

8. Mariadb - 사용자 추가

create user 'user_name'@'XXX.XXX.XXX.XXX' identified by 'user_password';

 

ex) create user 'user'@'%' identified by '1234';

Query OK, 0 rows affected (0.015 sec)

 

9. Mariadb - 사용자 권한 부여

grant all privileges on db_name.* to 'user_name'@'XXX.XXX.XXX.XXX';

flush privileges;

 

(예)

grant all privileges on test.* to 'user'@'%';

Query OK, 0 rows affected (0.018 sec)

 

flush privileges;

Query OK, 0 rows affected (0.000 sec)

 

 

[참고] MariaDB CLI 명령/쿼리

MariaDB> SHOW DATABASES; 데이터베이스 목록

MariaDB> CREATE DATABASE 데이터베이스이름; 데이터베이스 생성

CREATE DATABASE test;

MariaDB> USE 데이터베이스이름; 데이터베이스 사용

USE test;

Database changed

MariaDB> SHOW TABLES; 특정 DB의 Table 목록

MariaDB> CREATE TABLE 테이블이름 (데이터명 데이터유형); Table 생성

CREATE TABLE test_table (id int not null, name char(100) not null);

Query OK, 0 rows affected (0.028 sec)

MariaDB> INSERT INTO 테이블이름 (데이터명) VALUES(데이터값); Table에 데이터 입력

INSERT INTO test_table (id, name) VALUES (1, 'jisu');

INSERT INTO test_table (id, name) VALUES (2, 'sualchi');

MariaDB> SELECT * FROM 테이블이름; Table의 데이터 내용 출력

SELECT * FROM test_table;

 

10. Python 환경 설치 및 테스트 코드 작성

> exit 컨테이너에서 우분투(WSL)로 빠져 나감.

 

설치 프로그램 정보 업데이트

> pip install -U pip setuptools

> sudo apt-get update -y

 

pymysql을 설치하자.

 

> pip install pymysql

 

vi 에디터를 실행하고 코드 작성

sualchi@OSM:~$ vi main.py

 

i <-- insert 편집 모드 키 누름

 

이제 코드 작성

 

import pymysql

# 데이터베이스 연결 정보
DB_HOST = "0.0.0.0"
DB_PORT = 3306
DB_USER = "root"
DB_PASSWORD = "root"
DB_NAME = "test"

# 데이터베이스 연결
conn = pymysql.connect(
  host=DB_HOST,
  port=DB_PORT,
  user=DB_USER,
  password=DB_PASSWORD,
  database=DB_NAME
)

def create_table():
# 테이블 생성 예제
cursor = conn.cursor()

cursor.execute("""
CREATE TABLE test_table (
id INT PRIMARY KEY,
name VARCHAR(50),
);
""")

conn.commit()
print("test_table 테이블이 생성되었습니다.")

# Test -------------------------
# test_table 테이블에 있는 데이터 출력 
cursor = conn.cursor()
cursor.execute("""SELECT * FROM test_table""")
result = cursor.fetchall()

for r in result:
  print(r)

<esc> 키 누름

:         명령 모드 키(':") 누름

wq <엔터>     저장하고 vi 편집기 종료 

 

 

파이썬 버전 확인

> python3 --version

Python 3.10.6

 

이제, 컨테이너에 있는 마라아디비에 연동해서 데이터를 가져오는지 테스트

> python3 main.py

(1, 'jisu')

(2, 'sualchi')

 

반응형

+ Recent posts