天天用 docker
docker 是公司與產品名稱
我們若用 container (容器) 來稱呼更恰當
9/5/2020 王銘德
Python Taiwan (讀書會)
YouTube https://youtu.be/GRxS67nggTw
How to use docker everyday ?
- docker is everywhere!
- docker
docker-machine- docker-compose
docker-swam- kubernetes (k8s)
VM(虛擬主機) 的概念
以前執行任何軟體, 或其指令, 或是 web apps, 甚至於需要 database 都要從開 VMs 開始. 安裝 OS, 設定網路, 加user 帳號, 設防火牆, 安裝監控程式, 安裝語言與必要套件, 才能開始部署程式. 如果需雙機備援, 又要更複雜的專業設定.
開始有 docker 可以用, 那是幾年前的事了(2013)
2020 的今天
你還在只會用 VMs 嗎?
copyright: Philipz
什麼是虛擬主機?
用軟體模擬 PC 所有硬體, 讓一台實體主機, 可以變多台電腦使用, 也可以個別裝不同的作業系統, 各跑各的程式。
(但因為什麼都靠軟體模擬, 連 CPU, 都是, 而且記憶體, CPU 資源, 甚至硬碟資源(可共用), 需求都要很大), 整個作業系統也又重新安裝, 設定, 網路, 使用起來相當耗時耗力), 例如
2008 微軟的 Hyper-V
Oracle 的 VirtualBox
VMware 公司的 VMware
2013 containers 出現了
docker 概念
指令帶著 app 走,
app 帶著環境設定(語言)走,
環境設定帶著 os 走.
(真得嗎?)
所以我們時時刻刻只要有一個 docker 環境:
無需先開 VM,
也無需先安裝 OS,
更無需安裝 app, libs, etc...
直接可以啟動指令或 server daemon or 甚至 database
2020 的今天
你還不心動嗎? 心動不如行動
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
同一台筆電規格, 可以裝 ...
docker is everywhere?
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
docker engine
docker image
docker hub (先申請帳號)
多台主機時用 docker swarm
多台主機時用 kubernetes (所有雲端都支援)
docker engines 到處都是
裝在本機裡
VM 裡
雲端裡
clouds 包括 Google, AWS,
IBM,
scaleway,
Digital Ocean, ...
以前用 docker-machine, 現在不也還可以.
docker 指令教學
docker ps
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
免費的 PWD (Play With Docker)
docker 主機, 免費一次 4 小時
docker run -d --name elstack -p 80:80 -p 9200:9200 blacktop/elastic-stack
5 台 8-核 32GB 免費主機
Dockerize
(docker 化)
什麼是, 把你的 Python 程式 docker 化?
就只有一個檔案, 叫 Dockerfile
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
docker hub
https://cloud.google.com/container-registry/
aws
https://cloud.google.com/container-registry/
Container-Registry
azure
遠端存放 docker images 的地方, 可以是公有的, 也可以是私有的
上載 container 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 hub 下載且執行
$ 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-compose
把幾個 docker 化好的東西, 用一個檔案快速部署
真的只有一個檔案, 叫 docker-compose.yml
一個簡單的 Flask + redis 部署
git clone https://github.com/mingderwang/my-docker-for-python.git
cd my-docker-for-python
docker-compose up -d
Text
Dockerfile
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
app.py
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)
docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
docker-swarm
(就不要再考慮了, 直接選用 k8s)
kubernetes (k8s)
可以單獨開一堂 2 天, 或ㄧ學期的課 (下次再介紹)
Q & A
天天用 docker
By Ming-der Wang
天天用 docker
- 1,428