# 雲端通訊整合實務(10/20) ###### tags: `docker` ## 利用docker 架起 phpMyAdmin + MySQL 生成MySQL容器: ``` docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7.24 ``` 生成phpMyAdmin容器: ``` docker run --name phpmyadmin -d --link mysql -e PMA_HOST="mysql" -p 8080:80 phpmyadmin/phpmyadmin ``` 容器皆部署好之後可以查看`docker ps -a`,會看到兩個容器皆運行了 接著可以進入mysql容器內去測試mysql是否成功,密碼為:`root` ``` root@vm1:/home/user# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d1099b7c43ab phpmyadmin/phpmyadmin "/docker-entrypoint.…" 48 seconds ago Up 47 seconds 0.0.0.0:8080->80/tcp phpmyadmin cd2b3a44e591 mysql:5.7.24 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, 33060/tcp mysql root@vm1:/home/user# docker exec -it cd2 bash root@cd2b3a44e591:/# mysql -uroot -p Enter password: ``` 登入之後可以看到以下畫面: ![](https://i.imgur.com/JZhjFqI.png) 創建一個database: ``` create database test1; ``` 使用database: ``` use test1; ``` 顯示database內的tables: ``` show tables; ``` 創建一個tables: ``` create table mytable(school char(5),name char(10),id int); ``` 當你創建好你的tables時,可以再次查看`show tables;`狀況: ``` mysql> create table mytable(school char(5),name char(10),id int); Query OK, 0 rows affected (0.02 sec) mysql> show tables; +------------------+ | Tables_in_mytest | +------------------+ | mytable | +------------------+ 1 row in set (0.01 sec) ``` 新增資料: ``` insert into mytable(school, name, id) values ('NCTU','Jerry','123'); insert into mytable values ('NCTU','Jerry','123'); ``` 資料表查詢: ``` select * from mytable ; ``` 此時結果如下: ![](https://i.imgur.com/HRrQdx0.png) 若要更新資料,你可以使用: ``` update mytable set name = 'HaHa' where id = '123'; ``` 而更新後的資料表就會長這樣: ![](https://i.imgur.com/5yxlC9K.png) 當你做了幾個簡單的mysql測試後,你可以再開啟一個新的終端機,並且打上`docker ps -a`進行查看: 使用`docker exec -it d10 bash`進入到php的容器內,並進行ping 的動作,此時你就會發現ping的指令無法使用: ![](https://i.imgur.com/6oVzcCg.png) 這時你可以使用以下方式安裝ping套件: ``` apt-get update apt-get install iputils-ping ``` 而安裝完再去進行`ping mysql`就會成功了: ![](https://i.imgur.com/ad37lLf.png) > 進行ping mysql會成功的原因是因為生成php容器時,有用到`--link mysql` 而你也可以進行`cat /etc/hosts`路徑下查看,可以發現: ![](https://i.imgur.com/NSUG7d8.png) 它會把mysql的ip寫上去,此時你就可以透過【本地端:埠號】進行連線: ![](https://i.imgur.com/X07cTUF.png) > username: root > password: root 當你成功進入後,你就可以透過網頁的方式進行觀看、更改。 ![](https://i.imgur.com/ssSejmc.png) ## ngrok 安裝以及設定 首先註冊一個ngrok帳號:https://dashboard.ngrok.com/login 下載ngrok壓縮包: ``` wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip ``` 解壓縮: ``` unzip ngrok-stable-linux-amd64.zip ``` 與你的帳號連接: ``` ./ngrok authtoken 1l8ipwPbu4VYzRuwdZ0WERfW8Tc_824Cm4GBZabAXqHWEQSX1 ``` 當你這一步做完時,你可以先開一個httpd的容器當作測試來源 ``` docker run -d -p 8080:80 httpd ``` ``` root@vm1:/home/user# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES becebb97850a httpd "httpd-foreground" 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp laughing_tereshkova ``` 啟動ngrok: ``` ./ngrok http 8080(根據你httpd的埠號去設置) ``` 進入後會看到這樣的畫面: ![](https://i.imgur.com/Q3ElAXP.png) 你會看到`https://d99a399e7586.ngrok.io`的網址,而結果會像這樣: ![](https://i.imgur.com/d7QcUuP.png) ## 鳶尾花資料集 創建一個資料夾iris,並且進入到資料夾內: ``` mkdir iris ``` 創建一個文件train_model.py: ``` # coding: utf-8 import pickle from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn import tree # simple demo for traing and saving model iris=datasets.load_iris() x=iris.data y=iris.target #labels for iris dataset labels ={ 0: "setosa", 1: "versicolor", 2: "virginica" } x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=.25) classifier=tree.DecisionTreeClassifier() classifier.fit(x_train,y_train) predictions=classifier.predict(x_test) #export the model model_name = 'model.pkl' print("finished training and dump the model as {0}".format(model_name)) pickle.dump(classifier, open(model_name,'wb')) ``` 接著利用python執行: ``` python train_model.py ``` 可以看到若正常的話,會出現這樣的情形: ![](https://i.imgur.com/QDDrceu.png) 若程式碼執行發現這樣的情況: ![](https://i.imgur.com/gOnvYgv.png) 可以使用: ``` pip install sklearn ``` 基本上報錯的原因就是一些套件缺少,請執行到可以跑出`finish training and dump the model as model.pkl`為止。 編輯 client.py: ``` # coding: utf-8 import requests # Change the value of experience that you want to test url = 'http://127.0.0.1:5000/api' feature = [[5.8, 4.0, 1.2, 0.2]] labels ={ 0: "setosa", 1: "versicolor", 2: "virginica" } r = requests.post(url,json={'feature': feature}) print(labels[r.json()]) ``` 編輯 server.py: ``` # coding: utf-8 import pickle from flask import Flask, request, jsonify app = Flask(__name__) # Load the model model = pickle.load(open('model.pkl', 'rb')) labels = { 0: "versicolor", 1: "setosa", 2: "virginica" } @app.route('/api', methods=['POST']) def predict(): # Get the data from the POST request. data = request.get_json(force = True) predict = model.predict(data['feature']) return jsonify(predict[0].tolist()) if __name__ == '__main__': app.run(debug = True, host = '0.0.0.0') ``` 編輯完後,請先執行 server.py,再執行 client.py,結果如下: ![](https://i.imgur.com/myTZ8dm.png) ## Reference [上課影片](https://drive.google.com/drive/folders/1oM_ejAeSIhGbDGAVBDnVRv4DuoXaDwYw?usp=sharing)