天天用 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, ...

公司主機裡

 

還有 Play With Docker (free)

以前用 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

google

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 天, 或ㄧ學期的課 (下次再介紹)

2015/5/28 我已經開始在推廣 k8s 了

 

<<--- 在微軟訓練教室

Docker Taipei - Meetup 社團)

Q & A

mingderwang, 王銘德

 

demo source code repo

 

https://github.com/mingderwang/my-docker-for-python

Made with Slides.com