| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 백준
- 데이트
- 자바
- docker
- elk stack
- nvidia docker
- 파이썬
- 도커 elk
- c++
- MySQL
- 알고리즘
- 스트림셋
- ansible install
- 클라우드
- mysql on docker
- mysql docker
- 데이터베이스
- streamsets 강의
- python
- 도커
- C언어
- 코딩
- 정보처리기사
- 도커 mysql
- 푸시푸시
- c
- java
- 스트림셋이란?
- 앤서블 설치
- 도커 시작하기
- Today
- Total
리그캣의 개발놀이터
flask와 mysql을 docker container 환경에서 연동해보기 본문
flask
설치
$ pip install flask
or
$ pip3 install flaskapp.py 만들기
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "<h1>Hello World!</h1>"
@app.route("/hello")
def hello_flask():
return "<h1>Hello Flash!</h1>"
@app.route("/first")
def hello_first():
return "<h3>Hello First</h3>"
if __name__ == "__main__":
app.run(host="0.0.0.0", port="8080")실행
$ python3 app.py
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)각 resource로 접근 테스트
- localhost:8080
- localhost:8080/hello
- localhost:8080/first
flask 와 mysql 연동 테스트
mysql on docker
docker file
FROM oraclelinux:7-slim
ENV PACKAGE_URL https://repo.mysql.com/yum/mysql-8.0-community/docker/x86_64/mysql-community-server-minimal-8.0.2-0.1.dmr.el7.x86_64.rpm
# Install server
RUN rpmkeys --import http://repo.mysql.com/RPM-GPG-KEY-mysql \
&& yum install -y $PACKAGE_URL \
&& yum install -y libpwquality \
&& rm -rf /var/cache/yum/*
RUN mkdir /docker-entrypoint-initdb.d
VOLUME /var/lib/mysql
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 3306 33060
CMD ["mysqld"]version 8.0
$ docker run --name=mymysql -v ./{mydatadirectory}:/var/lib/mysql -p 3306:3306 -d mysql/mysql-server:8.0log check
$ docker logs mymysqlpassword check
아래의 password는 W3lUMk3s9eNmInyb4lyw.YS1iq0
$ docker logs mymysql 2>&1 | grep GENERATED
example)
[Entrypoint] GENERATED ROOT PASSWORD: W3lUMk3s9eNmInyb4lyw.YS1iq0container 안에 있는 mysql 접근
$ docker exec -it mymysql mysql -uroot -p비밀번호 초기화
password대신에 원하는 비밀번호를 넣어주면된다
다시 나갔다 들어오면 저장했던 데이터로 접근 가능하다
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';테스트 db 생성
mysql> CREATE DATABASE study_db default CHARACTER SET UTF8;
Query OK, 1 row affected, 1 warning (0.00 sec)mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| study_db |
| sys |
+--------------------+
5 rows in set (0.00 sec)데이터 베이스를 사용할 사용자 추가
study_db의 모든 권한을 leaguecat이라는 사용자에게 넘겨준다.
leaguecat의 사용자는 password에 정의한다.
해당 user는 아래 {ip} 에서만 연동 가능하다.
GRANT ALL PRIVILEGES ON study_db.* TO leaguecat@{ip} IDENTIFIED BY 'password';슈퍼유저로 권한 할당
GRANT ALL PRIVILEGES on *.* to leaguecat@"%" IDENTIFIED BY '1234' WITH GRANT OPTION;그런데 8.0 부터는 위의 방식이 아래와 같은 에러가 난다.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY '1234' WITH GRANT OPTION' at line 1아래 내용을 참고하자
user 생성
id = leaguecat / password = 1234
CREATE USER 'leaguecat'@'%' IDENTIFIED BY '1234';
Query OK, 0 rows affected (0.01 sec)권할 할당
GRANT ALL ON *.* TO 'leaguecat'@'%';
Query OK, 0 rows affected (0.01 sec)컨테이너를 빠져나간뒤 ctrl+p+q or exit host os에서 진행
mysql> exit
Bye접근 테스트(호스트에 mysql 이 설치되어 있어야함)
이때 localhost 대신에 나의 localhost ip를 할당해야함
mysql -u leaguecat -h {localhost ip} -p
example
$ mysql -u leaguecat -h 123.123.123.123 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.21 MySQL Community Server - GPLdb 접근
mysql> USE study_db;테이블 생성
mysql> CREATE TABLE professor ( _id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) NOT NULL, belong VARCHAR(12) DEFAULT 'FOO', phone VARCHAR(12) ) ENGINE=INNODB; DESCRIBE professor;데이터 삽입
mysql> INSERT INTO professor (name, belong, phone) VALUES('유재석', 'IDE','01112345678');
mysql> INSERT INTO professor (name, belong, phone) VALUES('황영조', 'MSE', '01121342443');삽입된 데이터 확인
mysql> select * from professor;
+-----+-----------+--------+-------------+
| _id | name | belong | phone |
+-----+-----------+--------+-------------+
| 1 | 유재석 | IDE | 01112345678 |
| 2 | 황영조 | MSE | 01121342443 |
+-----+-----------+--------+-------------+app.py를 수정하여 데이터를 삽입하는 flask 만들기
mysql 연동 가능한 모듈 설치
$ pip3 install sqlalchemy
$ pip3 install mysql-connector-pythonconfig.py 작성
db = {
'user' : 'leaguecat',
'password' : '1234',
'host' : '127.0.0.1',
'port' : '3306',
'database' : 'study_db'
}
DB_URL = f"mysql+mysqlconnector://{db['user']}:{db['password']}@{db['host']}:{db['port']}/{db['database']}?charset=utf8"app.py 수정
from flask import Flask, jsonify, request
from sqlalchemy import create_engine, text
app = Flask(__name__)
app.config.from_pyfile('config.py')
database = create_engine(app.config['DB_URL'], encoding = "utf-8")
app.database = database
@app.route("/professor", methods = ['POST'])
def insertdb():
professor = request.json
professor = app.database.execute(text("""
INSERT INTO professor (
name,
belong,
phone
) VALUES (
:name,
:belong,
:phone
)
"""), professor).lastrowid
return "<h1>Insert DB POST API</h1>"
@app.route("/professor", methods = ['GET'])
def getinsertdb():
return "<h1>Insert DB GET API</h1>"
if __name__ == "__main__":
app.run(host="0.0.0.0", port="8080")curl 요청 하여 db에 저장
$ curl --location --request POST '10.231.238.45:8080/professor' \
--header 'Content-Type: application/json' \
--data-raw '{"name":"김창식", "belong":"RES", "phone":"01012341234"}'다시 db로 접근해서 확인하면 insert가 된것을 확인할 수 있다
mysql> select * from professor;
+-----+-----------+--------+-------------+
| _id | name | belong | phone |
+-----+-----------+--------+-------------+
| 1 | 유재석 | IDE | 01112345678 |
| 2 | 황영조 | MSE | 01121342443 |
| 3 | 김창식 | RES | 01012341234 |
+-----+-----------+--------+-------------+구성한 app.py를 dockerfile로 만들어서 이미지화
requirements.txt 작성
vim requirements.txt
Flask==1.1.1
mysql-connector-python==8.0.21
sqlalchemyflask용 dockerfile 작성
vim Dockerfile
FROM python:3.7
WORKDIR /usr/src/app
COPY ["requirements.txt", "app.py", "config.py", "./"]
RUN pip install --no-cache-dir -r requirements.txt
CMD [ "python", "./app.py" ]dockerfile build 후 이미지 화
$ docker build -t flask-connect-mysql:latest .생성된 image 를 컨테이너화해서 띄우기
$ docker run --name flask-connect-mysql -d -p 8080:8080 flask-connect-mysql:latestflask container 로그 확인
$ docker logs flask-connect-mysql
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)위와 같이 컨테이너 환경에서도 잘 돌아가는 것을 확인할 수 있다.
이제 똑같이 post 요청을 날려 mysql에 데이터가 잘 적제되는 것을 확인해보자
curl 요청 하여 db에 저장
$ curl --location --request POST '10.231.238.45:8080/professor' \
--header 'Content-Type: application/json' \
--data-raw '{"name":"호냥캣", "belong":"CAT", "phone":"01012341234"}'다시 db로 접근해서 확인하면 insert가 된것을 확인할 수 있다
mysql> select * from professor
-> ;
+-----+-----------+--------+-------------+
| _id | name | belong | phone |
+-----+-----------+--------+-------------+
| 1 | 유재석 | IDE | 01112345678 |
| 2 | 황영조 | MSE | 01121342443 |
| 3 | 김창식 | RES | 01012341234 |
| 4 | 김창식 | RES | 01012341234 |
| 5 | 호냥캣 | CAT | 01012341234 |
+-----+-----------+--------+-------------+귀여운 우리 호냥캣캣캣이 들어간것을 확인할 수 있다. 호냥캣캣캣
REF
'개발 공부 > Python(웹)' 카테고리의 다른 글
| [Follium] 사용하여 주소를 맵에 표시 (0) | 2018.05.16 |
|---|---|
| [pandas] 매장 주소 보정하기. (0) | 2018.05.16 |
| [Python] Facebook Page Crawler 만들기 (2) | 2018.04.06 |