iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0

今天來介紹一下 Docker 的指令與操作。當我們在執行 Docker Image 時,會將所有的相關元件和應用程式都放在一起,然後在佈署時隨著應用程式一同放進執行程式中。而建立 imag 的方法就是透過 Dockerfile:

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。


上一篇
Day 13 Docker 安裝
下一篇
Day 15 conda 介紹與使用
系列文
新手也想開始認識機器學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言