2019年2月23日 星期六

台灣人工智慧學校第四屆開學典禮

台灣人工智慧學校 第四屆 開學典禮
      今天 AI 學校開學,非常特別像參加研討會一樣,開場介紹孔祥重校長和陳昇瑋執行長為什麼會創建這間學校,主要是他們發現AI技術可以幫助產業界解決很多問題,但是人才問題嚴重,希望透過一年三期每期500左右的規模並在北中南都有分校,來幫台灣訓練AI人才,讓已經是各行各業的專家,透過短短四個月的密集訓練,幫助專家可以把AI技術帶回去,解決和協助各企業的問題.

      台灣有兩個優勢製造業和醫療健保,這兩塊都可以大量的運用AI技術來幫助他們解決很多的問題,早上兩位Keynote分別是李友專院長-AI醫療大未來和廣達電腦的張嘉淵技術長-開創台灣產業智慧轉型的新契機,都帶給我很大的衝擊,讓我看到AI的藍圖,原來AI有這麼多的應用場景,有這麼多的題目可以嘗試,感覺有很多好玩的可以玩XD!

      下午陳昇瑋執行長為我們講解-人工智慧民主化在台灣,從AI的發展史第一波邏輯推理、第二波知識表達到現在的第三波機器學習講起,一步步引導我們暸解AI技術的發展到應用,學校主要教導的是機器學習(Machine Learning),從基礎的分辨數字到現在的人臉辨識,透過各種數學模型讓電腦把事情做得比人類還要好,讓電腦來幫我們解決問題,其中還介紹各種的應用範例,都一次次的啟發我的想像力,每一個範例都讓我覺得「哇~好酷!」,讓我有種迫不及待的想要玩玩看.

    最後還有上一屆的成果發表,看到學長姐的實作,都覺得好酷;還有產業分組交流,也和一些同學交換名片,期待未來的學習.


2019年2月19日 星期二

Docker 教學

Docker 教學

Containers as a Service ( CaaS ) - 容器如同服務
Docker 是一個開源專案,出現於 2013 年初,最初是 Dotcloud 公司內部的 Side-Project。
它基於 Google 公司推出的 Go 語言實作。( Dotcloud 公司後來改名為 Docker )

Agenda

  • 基本介紹 - 映像檔、容器、倉庫
  • 指令說明 - 安裝、指令
  • Dockerfile 說明
  • 進階應用 - docker compose
  • 進階應用 - docker machine
  • 實際案例

基本介紹

什麼是容器技術Container: 應用程式為中心的虛擬化

Docker 歷史

1982年Unix系統內建的chroot機制
LXC 利用controler groups 與namespaces的功能, 提供應用軟體一個獨立的作業系統環境
2013 Linux之父Linus Torvalds 發布Linux核心3.8版 支援Container技術
2013 dotCloud公司將內部專案Docker開源釋出程式碼

Containers(容器) vs Virtual Machines(虛擬主機)

螢幕快照 2019-02-19 上午11.07.39.png

Docker 三個基本概念

映像檔(Image)
  • Docker 映像檔就是一個唯讀的模板。
  • 映像檔可以用來建立 Docker 容器。
容器(Container)
  • 容器是從映像檔建立的執行實例。
  • Docker 利用容器來執行應用。
  • 可以被啟動、開始、停止、刪除。
  • 每個容器都是相互隔離的、保證安全的平台。
倉庫(Repository)
  • 倉庫是集中存放映像檔檔案的場所。
  • 每個倉庫中又包含了多個映像檔。
  • 每個映像檔有不同的標籤(tag)。
  • 倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
螢幕快照 2019-02-19 上午11.10.38.png

指令說明 - 安裝、指令

docker --help
螢幕快照 2019-02-19 下午3.16.11.png
螢幕快照 2019-02-19 下午3.16.25.png
螢幕快照 2019-02-19 下午3.16.37.png

安裝Docker

Image 映像檔 常用指令

指令說明範例
search搜尋docker search centos
pull下載docker pull centos
images列表docker images
run執行docker run -ti centos /bin/bash
rmi [Image ID]刪除docker rmi 615cb40d5d19
build建立docker build -t member:1 .
login登入docker login docker.okborn.com
push上傳docker push
Search 搜尋 Centos 映像檔
docker search contos
螢幕快照 2019-02-19 下午1.45.28.png
NAME:映像檔名稱
DESCRIPTION:映像檔描述
STARS:越多代表越多人使用
OFFICIAL:官方Image
AUTOMATED:自動化
顯示目前本機的 Images 列表
docker iamges
螢幕快照 2019-02-19 下午1.50.42.png
REPOSITORY:倉庫位置和映像檔名稱
TAG:映像檔標籤(通常是定義版本號)
IMAGE ID:映像檔ID(唯一碼)
CREATED:創建日期
SIZE:映像檔大小
啟動容器
docker run -ti centos /bin/bash
螢幕快照 2019-02-19 下午2.02.58.png
run : 參數說明 or docker run --help 常用:
-i :則讓容器的標準輸入保持打開
-t:讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上
-d:背景執行
-e:設定環境變數(AAA=BBB)
-p:Port 對應(host port:container port)
-v:資料對應(host folder:container folder)
--name:設定容器名稱
** 在執行RUN 映像檔時,如果沒有下載會先下載在執行 **
螢幕快照 2019-02-19 下午2.00.23.png
rmi : 刪除映像檔前要先移除所有Container
build : 使用build 指令時要先切換到Dockerfile 目錄下面

Container 容器 常用指令

指令說明範例
run新建或啟動docker run -d centos
start [Contain ID]啟動docker start a469b9226fc8
stop [Contain ID]停止docker stop a469b9226fc8
rm [Contain ID]刪除docker rm a4
ps -a列表docker ps -a
logs [Contain ID]查看容器內的資訊docker logs -f a4
exec [Contain ID]進入容器(開新console)docker exec -ti a4 /bin/bash
attach進入容器(退出停止容器)dockr attach a4
inspect查看docker inspect a4
啟動一個 Container 並且執行 ping google.com
docker run centos ping google.com
請動一個 Container 執行上面的動作,並背景執行
螢幕快照 2019-02-19 下午2.38.01.png
使用 查看 Container 指令
docker ps 
docker ps -a
ps : 參數說明 or docker ps --help 常用:
-a:顯示全部的容器
螢幕快照 2019-02-19 下午2.38.21.png
CONTAINER ID:容器ID
IMAGE:映像檔名稱
COMMAND:執行指令
CREATED:創建時間
STATUS:容器狀態
POSTS:開啟的Port號
NAMES:容器名稱
顯示容器的 log
docker logs -f 8a
logs : 參數說明 or docker logs --help 常用:
-f:不會跳出,會一直列印最新的log資訊
螢幕快照 2019-02-19 下午2.48.58.png
進入容器
docker exec -ti 8a /bin/bash
exec : 參數說明 or docker exec --help 常用:
-i :則讓容器的標準輸入保持打開
-t:讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上
-e:設定環境變數(AAA=BBB)
螢幕快照 2019-02-19 下午2.51.57.png
查看容器資訊
docker inspect 8a
螢幕快照 2019-02-19 下午2.56.52.png
開啟容器到關閉容器
docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
db0e9dbb150596a3a89db056d0ecb765c54c3c2fb5d428e3b35fc20b55813862
docker logs -f db
docker ps -a
docker stop db
docker ps -a
螢幕快照 2019-02-19 下午3.04.01.png

Registry 倉庫 常用指令

指令說明範例
commit容器存檔docker commit db aaa:v1
pull下載docker pull docker.okborn.com/okborn:base
tag標籤docker tag aaa docker.okborn.com/aaa
push上傳docker push docker.okborn.com/member:1
login登入docker login docker.okborn.com
export匯出docker export 7691a814370e > ubuntu.tar
import匯入cat ubuntu.tar sudo docker import - test/ubuntu:v1.0
對容器存檔
docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
96ea2a3f99e92ddd5fa0ec29f21d035703b6512f59c4f54fbaee551ee8fc044a
docker commit 96 aaa:v1
螢幕快照 2019-02-19 下午3.31.21.png
對映像檔打標籤
docker tag centos aaa asia.gcr.io/joyi-205504/aaa:v1
螢幕快照 2019-02-19 下午3.29.32.png
上傳到 GCP Registry
gcloud docker -- push  asia.gcr.io/joyi-205504/aaa:v1

其他常用指令

刪除
docker rmi `docker images|grep sele |awk '{print $3}'`

Dcoker 資料管理

資料卷(Data volumes)
  • 資料卷可以在容器之間共享和重用
  • 對資料卷的修改會立馬生效
  • 對資料卷的更新,不會影響映像檔
  • 卷會一直存在,直到沒有容器使用
範例:建立一個 web 容器,並載入一個資料卷到容器的 /webapp 目錄
docker run -d -P --name web -v /webapp training/webapp python app.py
範例:本機的 /src/webapp 目錄到容器的 /opt/webapp 目錄
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
範例:Docker 掛載資料卷的預設權限是讀寫,使用者也可以透過 :ro 指定為唯讀
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
資料卷容器(Data volume containers)
持續更新的資料需要在容器之間共享,最好建立資料卷容器。
一個正常的容器,專門用來提供資料卷供其它容器掛載的。
範例:建立一個命名的資料卷容器 dbdata
docker run -d -v /dbdata --name dbdata postgres echo Data-only container for postgres
範例:他容器中使用 --volumes-from 來掛載 dbdata 容器中的資料卷
docker run -d -P --volumes-from dbdata --name db1 postgres
docker run -d -P --volumes-from dbdata --name db2 postgres
範例:也可以從其他已經掛載了容器卷的容器來掛載資料卷。
docker run -d --name db3 --volumes-from db1 postgres
範例:備份
首先使用 --volumes-from 標記來建立一個載入 dbdata 容器卷的容器,並從本地主機掛載當前到容器的 /backup 目錄。
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
範例:恢復
恢復資料到一個容器,首先建立一個帶有資料卷的容器 dbdata2
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然後建立另一個容器,掛載 dbdata2 的容器,並使用 untar 解壓備份檔案到掛載的容器卷中。
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
Docker 中的網路功能介紹
  • 要讓外部也可以存取這些應用
  • 可以通過 -P 或 -p 參數來指定連接埠映射。
範例:隨機本機Port
docker run -d -P training/webapp python app.py
範例:指定本機Port
docker run -d -p 5000:5000 training/webapp python app.py
範例:綁定 localhost 的任意連接埠到容器的 5000 連接埠,本地主機會自動分配一個連接埠
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
範例:還可以使用 udp 標記來指定 udp 連接埠
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
範例: -p 標記可以多次使用來綁定多個連接埠
docker run -d -p 5000:5000  -p 3000:80 training/webapp python app.py

Dockerfile 說明

  • Dockerfile 由一行行命令語句組成,並且支援以 # 開頭的註解行。
  • Dockerfile 分為四部分:
    • 基底映像檔資訊
    • 維護者資訊
    • 映像檔操作指令
    • 容器啟動時執行指令。
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..

# 基本映像檔,必須是第一個指令
FROM ubuntu

# 維護者: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user docker_user@email.com

# 更新映像檔的指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# 建立新容器時要執行的指令
CMD /usr/sbin/nginx
####Dockerfile 基本語法
指令說明範例
FROM :映像檔來源FROM python:3.5
MAINTAINER維護者訊息MAINTAINER docker_user docker_user@email.com
RUN創建映像檔時執行動作RUN apt-get -y update && apt-get install -y supervisor
RUN ["executable", "param1", "param2"]創建映像檔時執行動作RUN ["/bin/bash", "-c", "echo hello"]
CMD command param1 param2啟動容器時執行的命令CMD pserve development.ini
CMD ["executable","param1","param2"]啟動容器時執行的命令
CMD ["param1","param2"]啟動容器時執行的命令
EXPOSE容器對外的埠號EXPOSE 8082
ADD複製檔案(單檔)ADD requirements.txt /usr/src/app/
COPY複製檔案(資料夾)COPY . /usr/src/app
ENV環境變數ENV PG_VERSION 9.3.4
ENTRYPOINT command param1 param2指定容器啟動後執行的命令
ENTRYPOINT ["executable", "param1", "param2"]指定容器啟動後執行的命令ENTRYPOINT ["/docker-entrypoint.sh"]
VOLUME ["/data"]掛載資料卷VOLUME /var/lib/postgresql/data
USER daemon指定運行使用者RUN groupadd -r postgres && useradd -r -g postgres postgres
WORKDIR /path/to/workdir指定工作目錄WORKDIR /usr/src/app
ONBUILD [INSTRUCTION]基底映像檔建立時執行ONBUILD COPY . /usr/src/app
RUN 當命令較長時可以使用 \ 來換行。
RUN : 在 shell 終端中運行命令,即 /bin/sh -c;
RUN ["executable", "param1", "param2"] : 使用 exec 執行。
CMD 指定啟動容器時執行的命令, 每個 Dockerfile 只能有一條 CMD 命令 。
如果指定了多條命令,只有最後一條會被執行。
CMD ["executable","param1","param2"] 使用 exec 執行,推薦使用;
CMD command param1 param2 在 /bin/sh 中執行,使用在給需要互動的指令;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的預設參數;
ENTRYPOINT:每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個會生效。
USER:要臨時取得管理員權限可以使用 gosu,而不推薦 sudo。
WORKDIR:可以使用多個 WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑

Docker File Base

# 映像檔Image
FROM python:3.5
# 維護者
MAINTAINER Pellok "pellok@double-cash.com"
# 更新
RUN apt-get -y update && apt-get install -y supervisor
# 創建專案資料夾
RUN mkdir -p /usr/src/app
# 指定工作目錄在專案資料夾
WORKDIR /usr/src/app
# 預先要安裝的requirements複製到Docker裡面
ADD requirements.txt /usr/src/app/
# 安裝需要用的插件
RUN pip install --upgrade pip setuptools
RUN pip install --no-cache-dir -r requirements.txt
# 下次Build 的時候複製專案目錄到Docker 裡面
ONBUILD COPY . /usr/src/app
建置
docker build -t sample:base .
Docker File for Project
#  挑選Image
FROM sample:base
# 安裝cryptography
RUN pip install cryptography 
# 設定工作目錄
WORKDIR /usr/src/app/
# 執行Python Setup
RUN python setup.py develop
# 開啟Port號
EXPOSE 8082
# 執行專案
CMD pserve development.ini
建置
docker build -t project:v1 .

Pyramid 專案 Docker 化

#創建一個新專案
pcreate -s alchemy pyramid_dockerlize
cd pyramid_dockerlize
# 創建dockerfile
touch Dockerfile
# 編輯 Dockerfile
# 建置映像檔
docker build -t pyramid_dockerlize .
# 執行容器
docker run -d -P pyramid_dockerlize
Dockerfile
# This dockerfile uses the python pyramid
# VERSION 1 - EDITION 1
# Author: pellok
# Command describe

# 使用的python映像檔版本
FROM python:3.5

MAINTAINER pellok pellok@okborn.com

# 創建存放專案的資料夾
RUN mkdir -p /usr/src/app

# 複製當前目錄的所有檔案到容器內的,資料放在/usr/src/app
COPY . /usr/src/app

# 指定工作目錄
WORKDIR /usr/src/app/

# 安裝環境變數和相依性套件
RUN python setup.py develop

# 初始化DB
RUN initialize_pyramid_dockerlize_db development.ini

# 專案監聽的Port號
EXPOSE 6543

# 啟動專案
CMD pserve production.ini

參考

台灣人工智慧學校第四屆開學典禮

台灣人工智慧學校  第四屆 開學典禮       今天 AI 學校開學,非常特別像參加研討會一樣,開場介紹孔祥重校長和陳昇瑋執行長為什麼會創建這間學校,主要是他們發現AI技術可以幫助產業界解決很多問題,但是人才問題嚴重,希望透過一年三期每期500左右的規模並在北中南都有分校,來...