Raspberry Pi에서 MariaDB Docker Container 와 Python 연동하기 (Docker-compose 사용)
안녕하세요.
이전 내용(“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