---
# System prepended metadata

title: 雲端通訊整合實務(10/20)
tags: [docker]

---

# 雲端通訊整合實務(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)