9/12/2020 Taiwan Python 讀書會
10pm 開始
Ming-der Wang, 王銘德
(適合 Python/Docker 初學者)
docker run -ti --rm -v ${HOME}:/root -v $(pwd):/git alpine/git
vi Dockerfile
docker build -t mingder78/git .
docker run -ti --rm -v ${HOME}:/root -v $(pwd):/git mingder78/git
docker login
docker push mingder78/git
* docker 底層是 Linux OS
* 所以需懂 Linux 指令
* 網路的基本概念
每一行都是
指令 + 內容 (可以用 \ 跳行)
FROM python:2.7
RUN mkdir /app
WORKDIR /app
COPY main.py /app/main.py
EXPOSE 5000 CMD ["python", "main.py"]
FROM
RUN
WORKDIR
ADD
EXPOSE CMD
VOLUME
ENV
COPY
LABEL
ENTRYPOINT
ONBUILD RUN
docker build -t mingder78/my_app:v1 .
在 Dockefile 的同一個目錄下, 執行以下 docker build 指令
當下目錄 (.)
tag 標註 (-t)
< docker id >/< app >:< tag >
(不能用大寫英文字母)
docker run -p 8080:5000 mingder78/my_app:v1
在 Dockefile 的同一個目錄下, 執行以下 docker build 指令
將 docker engine 的 8080 導到此 container 的 port 5000
用 docker images 指令可以找到你現在 docker engine 裡所有的 images
(容器可以轉 port 到不同之 docker engine 的 port)
docker engine
container (172.17.0.9)
container (172.17.0.8)
container (172.17.0.7)
container (172.17.0.6)
conatiner (172.17.0.5)
conatiner (172.17.0.4)
container (172.17.0.3)
IP: 192.168.1.100
6379
5000
9200
8080
8080
8081
5601
192.168.1.100:9200
192.168.1.100:5601
192.168.1.100:443
192.168.1.100:80
192.168.1.100:8080
192.168.1.100:5002
192.168.1.100:6379
docker run -p 443:8081 ...
web
瀏覽器
其他 1024 ~ 65535 port 隨便你用, 但有些已經是知名 App 常用的 port了, 例如 Flask 用 5000
(容器可以掛載一堆本地端資料夾)
例如: docker run -it -v $PWD/rules:/usr/share/elastalert/rules ...
用 docker 執行一個 nginx 網站, 但所有網頁資料, 並不是放在 docker images 裡, 而是要執行時, 才將網頁的內容目錄, 分享到 container 肚子裡.
好處是: 網頁內容可以修改, 而 docker images 不需重新 build.
因為 docker container 刪除時, 所有 container 裡的目錄和所有檔案(資料) 全部消失.
所以, 如果我們開一個資料庫 container, 如何把資料庫的實體(目錄) 保持放在 container 外部目錄.
好處是: 資料不會消失
* 利用 volume 概念
可以是 docker engine 的某些目錄
或是用 docker volume 產生的共用 volumes
* 還可以設定 container 對該目錄或檔案的權限
docker engine (volume: xxx)
container (/data)
container (/app/data.csv)
container (/xxx/test.csv)
conatiner
conatiner
container
./data
/test/data.csv
(兩支以上相關的 apps 需要同時執行, 利用
docker-compose.yml 檔案來描述其內容)
如果 docker-compose.yml 有好幾個, 可以用 -f 指定, 例如
docker-compose -f chainlink-sgx.docker-compose.yml up
(如果無法執行 docker-compose, 再安裝)
也可以用 pip3 安裝
pip3 install docker-compose
(一次全部 services 一起執行) docker-compose up docker-compose up -d (在背後執行) docker-compose up --build (Dockerfile 重新 build) docker-compose down
docker-compose down -v (連 volume 一起刪除)
docker-compose ps (看目前所有 services 狀態)
(僅用於單一 serivce)
docker-compose start docker-compose stop
docker-compose pause docker-compose unpause
docker-compose logs -f (看該 service 的 logs)
它是 YAML 格式
2001 年發明
強調這種語言以數據做為中心,而不是以標記語言為重點
幾乎所有語言都可以讀寫, 例如 Python 則透過 PyYAML 套件
pip install PyYAML
docker-compose.yml 會用到
kubernetes 也會用到
{ "hr": 65, "avg": 0.278, "rbi": 147 }
hr: 65 # Home runs
avg: 0.278 # Batting average
rbi: 147 # Runs Batted In
{'avg': 0.278, 'hr': 65, 'rbi': 147}
{ "hr": 65, "avg": 0.278, "rbi": 147 }
['Mark McGwire', 'Sammy Sosa', 'Ken Griffey']
- Mark McGwire
- Sammy Sosa
- Ken Griffey
[ "Mark McGwire", "Sammy Sosa", "Ken Griffey" ]
[{'avg': 0.278, 'hr': 65, 'name': 'Mark McGwire'}, {'avg': 0.288, 'hr': 63, 'name': 'Sammy Sosa'}]
-
name: Mark McGwire
hr: 65
avg: 0.278
-
name: Sammy Sosa
hr: 63
avg: 0.288
[ { "hr": 65, "avg": 0.278, "name": "Mark McGwire" }, { "hr": 63, "avg": 0.288, "name": "Sammy Sosa" } ]
-
name: Mark McGwire
hr: 65
avg: 0.278
-
name: Sammy Sosa
hr: 63
avg: 0.288
# Ranking of 1998 home runs
---
- Mark McGwire
- Sammy Sosa
- Ken Griffey
# Team ranking
---
- [name , hr, avg ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa , 63, 0.288]
* 可以有註解 (#)
* 可以多檔, 寫在一檔裡 (---)
* 兩種 array 寫法都可以, [], -
(但 (-) 減號比較常用)
* 字串可無需用 (') 或 ('') 引號
---
id: 1
name: Ming-der Wang
scores: [99,100,36]
# Ranking of 1998 home runs
---
- Mark McGwire
- Sammy Sosa
- Ken Griffey
# Team ranking
---
- [name , hr, avg ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa , 63, 0.288]
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"]
version: '3' services: web: build: . command: npm run serve ports: - "5000:5000" volumes: - .:/code environment: FLASK_ENV: development redis: image: "redis:alpine"
去 docker hub, 或 container registry 找 images
version: '3' services: web: build: . command: --config x ports: - "5000:5000" volumes: - dbdata:/db
volumes:
dbdata:
volumes 不一定是目錄
可以是 docker volume
depends_on: 會等另一個 service 起來後才開始 run,
所以 redis: 會先起來, 後才開始執行 web:
version: '3' services: web: build: . command: --config x ports: - "5000:5000" volumes: - .:/code depends_on: - redis redis: image: "redis:alpine"
web: service 在 frontend 網路“段" 執行
需定義 networks:
version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code
networks: frontend:
networks: default: external: name: frontend
(請用 git 把 Python 程式跟 Dockerfile 都放在同一目錄管理)
可 fork 參考 https://github.com/mingderwang/my-docker-for-python
(能把你的 jupyter 檔案一起放入更好)
提示: 利用 docker -v ...
Ming-der Wang (王銘德)