행복한 하루
Raspberry Pi에서 MariaDB Docker Container 와 Python 연동하기 (Docker-compose 사용) 본문
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)
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 데이터 삭제
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
'RaspberryPi' 카테고리의 다른 글
Raspberry Pi에서 MariaDB에 Mosquitto MQTT Message 저장하기 (0) | 2023.04.12 |
---|---|
Raspberry Pi에 Docker로 MariaDB 설치하기 (0) | 2023.03.31 |
Quest4-Pico W - 최종 결과물 완성 (상세 설명 및 동작 영상-화재감지기) (0) | 2022.10.23 |
Quest3-Pico W - 클라우드 연결 및 데이터 업로드(화재감지기) (0) | 2022.09.22 |
[도서 실습] Qt 5 and OpenCV 4 Computer Vision (Raspberry Pi CM 4 – ImageEditor) (0) | 2022.06.18 |