행복한 하루

Raspberry Pi에서 MariaDB Docker Container 와 Python 연동하기 (Docker-compose 사용) 본문

RaspberryPi

Raspberry Pi에서 MariaDB Docker Container 와 Python 연동하기 (Docker-compose 사용)

변화의 물결 2023. 4. 6. 16:34

 

 

 

안녕하세요.

 

 이전 내용(“Raspberry Pi에 Docker로 MariaDB 설치하기”)에서 MariaDB를 설치해 보았습니다. 이번에는 Python을 이용해서 연결해서 데이터를 출력해 보는 것을 해볼 것입니다. 최종적으로는 Mosquitto MQTT에서 수신 데이터를 MariaDB에 저장하는 것입니다. 그리고 Docker-compose를 이용해서 설치 자동화까지 생각해서 테스트해보려고 했습니다.


1.  사전 준비

  - 이전 내용에서 MariaDB Docker Container를 생성했다면, 이번에는 추가로 DB와 연동하는 내용입니다.

 그러나 생성한 MariaDB container는 ubuntu가 아니라 Alpine Linux라서 MQTT관련된 몇 가지 라이브러리가 설치가 되지 않아서 MQTT 관련된 데이터를 받을 수 있는 Docker Container를 하나 더 생성해서 DB와 연동하는 것으로 테스트해보려고 합니다. 즉, MariaDB docker, MQTT DB 처리 docker 생성

 

  - 향후 내용을 위한 Mosquitto MQTT와 연동하기 위해 디렉터리도 생성합니다. 그리고 MQTT docker file 저장을 위한 디렉터리(ubuntu_mqtt)도 추가합니다. 

pi@raspberrypi:~/mariaDB_compose $ mkdir  mqtt_config  mqtt_data  mqtt_log  ubuntu_mqtt

 

 - MQTT 쪽 docker container 자동으로 생성할 수 있도록 Dockerfile를 생성합니다. (이 파일의 내용은 mosquitto broker 설치에 따라 내용이 추가될 수 있습니다. 이후 내용에서 자동 설치 부분 추가 테스트할 예정) 

pi@raspberrypi:~/mariaDB_compose/ubuntu_mqtt $ vim Dockerfile

  

  - Dockerfile 작성

FROM ubuntu:22.04

RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install python3 python3-pip libmysqlclient-dev vim
RUN pip3 install paho-mqtt mysqlclient mysql-connector

 

  - 편리성을 위해 Docker Compose Script (docker-compose.yml)에 두 개의 Container생성하는 내용을 추가합니다. 서비스 중 ubuntu_mqtt_dev 부분을 추가했고, build: 에서 context: 에는 자동으로 생성된 도커의 경로는 넣어줍니다. (상대경로를 넣어 주었을 경우 경로를 못 찾는 경우가 발생해서 절대경로로 변경하였습니다.) 

version: '3.1'

services:
  mariadb:
    image: lscr.io/linuxserver/mariadb:latest
    container_name: forAll_mariaDB
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Seoul
      - MYSQL_ROOT_PASSWORD=mariadbpw
      #- MYSQL_DATABASE=USER_DB_NAME #optional
      #- MYSQL_USER=MYSQL_USER #optional
      #- MYSQL_PASSWORD=DATABASE_PASSWORD #optional
      #- REMOTE_SQL=http://URL1/your.sql,https://URL2/your.sql #optional
    volumes:
      - /home/pi/mariaDB_compose/config:/config
    ports:
      - 3306:3306
    restart: unless-stopped

  ubuntu_mqtt_dev:
    image: ubuntu_mqtt:0.2
    container_name: ubuntu_mqtt
    build:
      context: /home/pi/mariaDB_compose/ubuntu_mqtt
    restart: unless-stopped
    tty: true
    ports:
      - 1883:1883
      - 9001:9001
    volumes:
      - /home/pi/mariaDB_compose/mqtt_config/mosquitto.conf:/mosquitto/config/mosquitto.conf
      - /home/pi/mariaDB_compose/mqtt_data:/mosquitto/data
      - /home/pi/mariaDB_compose/mqtt_log:/mosquitto/log

 

  - Docker-compose 실행합니다. 처음 실행하면 프로그램들이 자동으로 설치됩니다. 

 pi@raspberrypi:~/mariaDB_compose $ docker-compose up -d

 

 - 이상 없이 도커가 생성되었고 이전 내용(MariaDB 설치)으로 실행 보았다면 대략 아래와 같은 디렉터리 구조가 되었다는 것을 확인할 수 있습니다. 

pi@raspberrypi:~/mariaDB_compose $ tree -d .

 

2. 생성된 컨테이너에 접속

 

 - 현재 생성된 Docker Container 확인해 봅니다. 포트까지 잘 매핑된 것을 확인할 수 있습니다. 

pi@raspberrypi:~/mariaDB_compose $ docker ps

 

- 생성된 컨테이너에 접속을 합니다. 

pi@raspberrypi:~/mariaDB_compose $ docker exec -it ubuntu_mqtt bash

3. Python으로 MariaDB 접속

  - mariadb.connect( ) 내용에서 이미 만들어 놓았던 정보를 입력합니다. user, password, host 정보는 이전 내용에서 개인적으로 생성했던 내용입니다.

  그렇기 때문에 이 내용은 이전에 어떻게 입력한 것에 따라 다를 수 있습니다. 그리고 host는 현재  RaspberryPi 주소이며, database는 mysql이라고 되었는데 이것은 이미 생성되어 있는 DB입니다.

 

  - mysql에 있는 db table의 데이터를 확인하기 위해서 Query문을 추가합니다. 

root@8210e2d81b9e:/# vim db_connect.py

  - MariaDB접속할 수 있는 소스를 작성합니다.

#!/usr/bin/python -u

import mysql.connector as mariadb
import datetime

try:
    conn = mariadb.connect(
        user="root",
        password="mariadbpw",
        host="192.168.0.67",
        port=3306,
        database="mysql"
    )

except mariadb.Error as e:
    print(f"Error connecting to MariaDB Platform: {e}")
    sys.exit(1)

# Get Cursor
cur = conn.cursor()

print("==== DB Select Start ====")
cur.execute(
        "Select * from db LIMIT 100")

while(True):
    row = cur.fetchone()
    if row == None:
        break

    col1 = row[0]
    col2 = row[1]

    print("%5s  %15s" %(col1,col2))

print("==== DB Select End ====")

conn.close()

 

- 출력결과로 DB 목록이 나타나며, 이전 내용에서 생성한 sensorDB도 나오는 것을 확인할 수 있습니다.

 

 여기서 조금 발전시켜 MQTT Broker Server와 연동해서 DB에 저장하는 것을 이어서 진행해 보도록 하겠습니다.

 

 

<여담, 실험했던 내용들>

 1) Alpine Linux도 프로그램 설치 시 apt-get 혹은 yum 명령어라고 생각했는데, apk  add라는 다른 명령어 사용하고 libmysqlclient-dev 라이브러리는 검색되지 않아 설치되지 않아서, alpine linux에서 제공해 주는 것을 검색해서 설치 필요

 

2) 도커를 여러 번 설치, 삭제하다 보니 Cache에 만은 내용들이 저장되어 있었습니다. 그래서 도커를 작업하다가 불필요하게 누적되는 Cache를 삭제해 주는 것이 가끔 필요함 (중요한 정보가 있을 수 있으니 주의하라고 경고 뜸) 

pi@raspberrypi:~/mariaDB_compose $ sudo docker system prune –volumes

 

3) docker compose로 생성 시 container가 실행 못하고 계속 Restarting 하고 Shell로 들어가지 못하는 경우 발생

  docker-compose.yml 파일에 tty: true 추가해 준다. 그러면 정상적으로 ports도 할당되고 연결가능한 상태가 됩니다.

 

 

감사합니다.

 

 

<참고사이트>

1. [MariaDB] 마리아DB PYTHON – 파이썬과 MariaDB 연계 (MySQL)

https://reddb.tistory.com/139

2. How to connect Python programs to MariaDB

https://mariadb.com/ko/resources/blog/how-to-connect-python-programs-to-mariadb/

3. 도커 컴포즈 및 스택 yml 파일 옵션 정리1 - services

https://2mukee.tistory.com/295

4. [Docker Basic] 16. Dockerfile을 이용하여 이미지 빌드하기

https://watch-n-learn.tistory.com/37

5. How To Install and Use Docker on Ubuntu 22.04

https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04

6. [Docker] build와 Dockerfile로 나만의 이미지를 만들어보자

https://techblog-history-younghunjo1.tistory.com/245

7. ModuleNotFoundError: No module named 'mysql'

https://zetawiki.com/wiki/ModuleNotFoundError:_No_module_named_%27mysql%27

8. How to fix apt-get not found in Docker Image

https://www.programmerhat.com/docker-apt-get-not-found/

9. docker cache 데이터 삭제

https://vlee.kr/2976

10. Docker: Container keeps on restarting again on again

https://stackoverflow.com/questions/37471929/docker-container-keeps-on-restarting-again-on-again

11. 리눅스에서 디렉토리 구조 트리형태로 출력하기

https://webnautes.tistory.com/483   

db_connect.py
0.00MB
docker-compose.yml
0.00MB
Dockerfile
0.00MB

 

 

 

Comments