今天來介紹一下 Docker 的指令與操作。當我們在執行 Docker Image 時,會將所有的相關元件和應用程式都放在一起,然後在佈署時隨著應用程式一同放進執行程式中。而建立 imag 的方法就是透過 Dockerfile:
Container 內部的各種系統資源都是寫在 Dockerfile 這個 Container 設定檔中,以下示範如何使用 Dockerfile 建立一個 Image 。
首先建一個資料夾,然後再寫一個簡單的 hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "<p>Hello, World!</p>"
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0', port=8888)
然後將環境 requirements.txt 給列出來,當然你也可以將詳細的版本寫上去,我這裡沒寫就是了。
Click
Flask
itsdangerous
Jinja2
MarkupSafe
Werkzeug
再來就是建立 Dockerfile
# 設定執行環境,這裡用官方的 Python 執行環境作為基本的 Docker 影像
FROM python:3.7.3-stretch
# 設定工作目錄為 /app
WORKDIR /app
# 複製本機檔案到 Image 裡
COPY requirements.txt ./
COPY hello.py ./
# 安裝 requirements.txt 中所列的必要套件
RUN pip install -r requirements.txt
# 讓 88 連接埠可以從 Container 外部存取
EXPOSE 88
# 當 Container 啟動時,執行 hello.py
CMD python hello.py
之後下指令建立 image
--no-cache 是不使用cache,避免 build 到未修改前的 Dockerfile。
-t 是 tag 的意思,預設是latest, . 則是當前目錄
docker image build -t dockerfile_test . --no-cache
我們可以在image name 後方自行加上自己想要的 tag 來註明版本差異,例如:
docker image build -t dockerfile_test:v1 . --no-cache
顯示 image 清單,察看 image 是否有被成功建立:
docker image ls
執行 image ,建立 container :
-d 是讓 Container 進入背景執行,-p 是為了將主機的 Port 綁定到 Container 的 Port 上。
docker run -d -p 88:8888 dockerfile_test
如果成功的話,就能看到0.0.0.0:88 或 127.0.0.1:88 看到hello world了!
查看所有 Container 清單
-a 其實就是all的意思。
docker container ls -a
查看 Container log
docker container logs <Container id>
進入 Container 內操作
docker exec -it <Container-id> /bin/bash
刪除 image:
docker rmi <image-id>
如果你想刪除的 image 內的 Container 還在運作的話,Docker 會告入你無法刪除,並提醒你該 image 內的運作 Container 的 id
先刪掉 Container 就能順利移除該 image 了。
刪除 Container:
docker container stop <Container-id>
docker container rm <Container-id>
如果你在建立 image 時都沒有加 tagname 的話,新建的 image 的 tag 都會是 latest ,而舊的 image tag 會由 latest 變成 none。
docker強制批量刪除none的image(慎用)
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi
今天就介紹到這裡,明天來介紹另一種將環境分開的套件管理系統 ── Anaconda。