docker 是公司與產品名稱
我們若用 container (容器) 來稱呼更恰當
9/5/2020 王銘德
Python Taiwan (讀書會)
YouTube https://youtu.be/GRxS67nggTw
以前執行任何軟體, 或其指令, 或是 web apps, 甚至於需要 database 都要從開 VMs 開始. 安裝 OS, 設定網路, 加user 帳號, 設防火牆, 安裝監控程式, 安裝語言與必要套件, 才能開始部署程式. 如果需雙機備援, 又要更複雜的專業設定.
開始有 docker 可以用, 那是幾年前的事了(2013)
你還在只會用 VMs 嗎?
copyright: Philipz
用軟體模擬 PC 所有硬體, 讓一台實體主機, 可以變多台電腦使用, 也可以個別裝不同的作業系統, 各跑各的程式。
(但因為什麼都靠軟體模擬, 連 CPU, 都是, 而且記憶體, CPU 資源, 甚至硬碟資源(可共用), 需求都要很大), 整個作業系統也又重新安裝, 設定, 網路, 使用起來相當耗時耗力), 例如
2008 微軟的 Hyper-V
Oracle 的 VirtualBox
VMware 公司的 VMware
指令帶著 app 走,
app 帶著環境設定(語言)走,
環境設定帶著 os 走.
(真得嗎?)
所以我們時時刻刻只要有一個 docker 環境:
無需先開 VM,
也無需先安裝 OS,
更無需安裝 app, libs, etc...
直接可以啟動指令或 server daemon or 甚至 database
你還不心動嗎? 心動不如行動
copyright: Philipz
VirtualBox, vmware
docker engine
docker (container)
docker (container)
docker (container)
docker (container)
docker (container)
docker (container)
docker (container)
docker (container)
docker (container)
docker (container)
docker (container)
1 ~ 2 VMs
Mac OS, Linux, Clouds, ARM (Raspberry -Pi)
Cloud GPU, Nvidia JETSON (GPU 也都能在 docker 裡跑)
Windows (???) 雖然它宣稱也有, 但不跟別人相容...
(舉例, 你用的 Gmail, 其實都是在 containers 裡跑的.
2014, Google Cloud, 開啟 20億 containers 每週)
為了方便你安裝, 很多新軟體都會提供 docker 執行方法
你也可以自己一開始就替你的 Python 專案, 準備好用 docker 執行
(幾乎)
在你電腦先安裝 docker engine
docker engine
docker image
docker hub (先申請帳號)
多台主機時用 docker swarm
多台主機時用 kubernetes (所有雲端都支援)
裝在本機裡
VM 裡
雲端裡
clouds 包括 Google, AWS,
IBM,
scaleway,
Digital Ocean, ...
以前用 docker-machine, 現在不也還可以.
docker ps -a
docker images
docker rmi <image-id>
docker exec -it <docker-id> bash
docker kill <docker-id>
docker rm <docker-id>
docker run -d <docker-tag>
docker run hello-world
docker search <你想裝的軟體, 例如 python>
// 執行 hello-world 程式, 順便測試 docker 是否安裝OK docker run hello-world
// 裝一個 ubuntu OS, 執行 bash (-d 就當 daemon 執行) docker run -it ubuntu bash
// 尋找網路上 是否有已經裝好 python 的 docker images docker search python
// 清掉所有沒在用的 images, containers, networks, build cache
docker system prune
docker run -d --name elstack -p 80:80 -p 9200:9200 blacktop/elastic-stack
什麼是, 把你的 Python 程式 docker 化?
就只有一個檔案, 叫 Dockerfile
FROM python:3 WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python", "./main.py" ]
Dockerfile
git clone https://github.com/mingderwang/project_python.git cd project_python docker build -t python-app:v1 . docker run -it --rm --name my_app python-app:v1
https://cloud.google.com/container-registry/
https://cloud.google.com/container-registry/
Container-Registry
遠端存放 docker images 的地方, 可以是公有的, 也可以是私有的
$ docker tag python-app:v1 mingder78/python-app:v1
$ docker run -it --rm --name my_app mingder78/python-app:v1
high low volume open close
1970-01-02 14:30:00 15.8750 15.125 64600 15.3750 15.7500
1970-01-05 14:30:00 15.6875 15.250 47200 15.6875 15.4375
$ docker push mingder78/python-app:v1
可以改 images tag
$ docker run mingder78/python-app:v1
open high volume low close
1970-01-02 14:30:00 15.3750 15.8750 64600 15.125 15.7500
1970-01-05 14:30:00 15.6875 15.6875 47200 15.250 15.4375
1970-01-06 14:30:00 15.1875 15.1875 122000 14.750 15.0000
1970-01-07 14:30:00 14.9375 14.9375 45600 14.625 14.8125
把幾個 docker 化好的東西, 用一個檔案快速部署
真的只有一個檔案, 叫 docker-compose.yml
git clone https://github.com/mingderwang/my-docker-for-python.git
cd my-docker-for-python
docker-compose up -d
Text
FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD ["flask", "run"]
Flask==1.1.1
redis==3.5.3
requirements.txt
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
(就不要再考慮了, 直接選用 k8s)
可以單獨開一堂 2 天, 或ㄧ學期的課 (下次再介紹)