도커 컨테이너에 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')
'Docker, Kubernetes' 카테고리의 다른 글
docker desktop 설치 시 "Invalid JSON string. (Exception from HRESULT: 0x83750007)" (0) | 2023.11.25 |
---|---|
[Docker] Prometheus + CAdvisor + Grafana 도커 클러스터 모니터링 (0) | 2023.02.04 |
docker RUN apt install 명령 executor failed running [/bin/sh -c apt install net-tools sysstat nano iputils-ping -y]: exit code: 100 오류 (0) | 2023.01.10 |
도커와 쿠버네티스 관계? (0) | 2022.05.28 |
Docker 사용법 (Linux) (0) | 2022.05.28 |