# 雲端通訊整合實務(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:
```
登入之後可以看到以下畫面:

創建一個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 ;
```
此時結果如下:

若要更新資料,你可以使用:
```
update mytable set name = 'HaHa' where id = '123';
```
而更新後的資料表就會長這樣:

當你做了幾個簡單的mysql測試後,你可以再開啟一個新的終端機,並且打上`docker ps -a`進行查看:
使用`docker exec -it d10 bash`進入到php的容器內,並進行ping 的動作,此時你就會發現ping的指令無法使用:

這時你可以使用以下方式安裝ping套件:
```
apt-get update
apt-get install iputils-ping
```
而安裝完再去進行`ping mysql`就會成功了:

> 進行ping mysql會成功的原因是因為生成php容器時,有用到`--link mysql`
而你也可以進行`cat /etc/hosts`路徑下查看,可以發現:

它會把mysql的ip寫上去,此時你就可以透過【本地端:埠號】進行連線:

> username: root
> password: root
當你成功進入後,你就可以透過網頁的方式進行觀看、更改。

## 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://d99a399e7586.ngrok.io`的網址,而結果會像這樣:

## 鳶尾花資料集
創建一個資料夾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
```
可以看到若正常的話,會出現這樣的情形:

若程式碼執行發現這樣的情況:

可以使用:
```
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,結果如下:

## Reference
[上課影片](https://drive.google.com/drive/folders/1oM_ejAeSIhGbDGAVBDnVRv4DuoXaDwYw?usp=sharing)