Docker虛擬容器學習筆記(三):完整流程
還沒安裝Docker的讀者請先透過,Docker虛擬容器學習筆記(一):嘗試看看Docker,一文,進行操作。並且讀過Docker虛擬容器學習筆記(二):概念與指令,了解基本知識。
修改自:https://blog.gtwang.org/virtualization/docker-basic-tutorial/3/
Dockerfile
用來定義內部抽象資源與外部實體資源的對應關係
在一個空目錄中,建立一個檔名為 Dockerfile
的文字檔,內容如下:
# 以Python3執行環境作為Docker Image基礎
FROM python:3# 設定工作目錄為 /app
WORKDIR /app# 複製目前目錄下的內容,放進 Docker 容器中的 /app
ADD . /app# 安裝 requirements.txt 中所列的必要套件
RUN pip install -r requirements.txt# 讓 80 連接埠可以從 Docker 容器外部存取
EXPOSE 80# 定義環境變數
ENV NAME World# 當 Docker 容器啟動時,自動執行 app.py
CMD ["python", "app.py"]
Dockerfile
需要用到另外兩個檔案,分別為 requirements.txt
與 app.py
,app.py
就是我們自己撰寫的 Python 應用程式,而 requirements.txt
則是相依套件的列表,請在同一個目錄中建立這兩個檔案。requirements.txt
的內容為:
Flask
Redis
app.py
是自己開發的應用程式,這裡我們實做一個簡單的網頁伺服器,並連接到內部的 Redis 資料庫,其完整的內容如下:
from flask import Flask
from redis import Redis, RedisError
import os
import socket# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)app = Flask(__name__)@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>" html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
建立 Docker 應用程式
建立好 Dockerfile
、requirements.txt
與 app.py
三個檔案之後,我們就可以使用 docker
指令來自動建立 Docker 影像(image):
docker build -t friendlyhello .
-t
參數是用來指定 Docker 影像(image)的名稱。
建立好的 Docker 影像(image)會儲存在 Docker 的影像庫中,使用 docker
來查詢目前可用的 Docker 影像(image):
docker images
執行 Docker 應用程式
建立好 Docker 影像(image)之後,接著就可以直接執行了:
docker run -p 4000:80 friendlyhello
這裡我們使用 -p
參數將 Docker 內部應用程式的 80
連接埠對應到 host 機器上的 4000
連接埠。執行之後,會出現這樣的輸出訊息:
* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
在 Docker 中的程式是開啟 80
這個連接埠,透過 Docker 對應到外部
host 機器上的 4000
連接埠,而這時候我們就可以開啟瀏覽器,打開本機的 4000
連接埠,連線至 Docker 中的應用程式:
http://localhost:4000按下 Ctrl + c 即可中止程式。
如果想要讓 Docker 程式以背景的方式執行,可以加上 -d
參數:
docker run -d -p 4000:80 friendlyhelloc5b69c3c387c497023a407ae99f0670789933dd618fbc8251bf7330d32fc4b5d
透過 docker
的 ps
指令來查詢目前正在執行的 Docker 應用程式:
docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5b69c3c387c friendlyhello "python app.py" About a minute ago Up About a minute 0.0.0.0:4000->80/tcp unruffled_kowalevski
使用 docker
的 stop
指令,停止指定的 Docker 應用程式
docker stop c5b69c3c387c
分享 Docker 影像
Docker Cloud 網站,可以讓使用者上傳自己製作的 Docker 影像(image),分享給其他人下載,類似 GitHub。
首先請到 Docker Cloud 網站註冊一個帳號(它是免費的),然後在自己的系統上使用 docker
指令登入:
docker login
直接輸入 Docker Cloud 帳號與密碼登入。
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: 12345678
Password: 12345678
Login Succeeded
在上傳影像之前,我們要先把自己製作的 Docker image掛上正式名稱,習慣上 Docker 的影像(image)名稱會以這樣的格式命名:
username/repository:tag
username
是自己的帳號名稱, repository
與 tag
則是自己命名的套件庫與標籤名稱,建議使用比較有意義的字眼來命名,例如 guozhaowang/gtwang-demo:part1
。
使用 tag
指令將 Docker image標上指定的名稱:
docker tag friendlyhello guozhaowang/gtwang-demo:part1
接著再看一下目前的 Docker 影像(images)列表:
docker images
上傳Docker 影像:
docker push guozhaowang/gtwang-demo:part1
在其他台電腦中直接使用這個 Docker 影像(image):
docker run -p 4000:80 guozhaowang/gtwang-demo:part1
執行時 Docker 會自動從套件庫中下載需要的 Docker 影像(image)來執行。
不管使用者在哪裡執行這個 Docker Image,Docker都會自動下載應用程式所需要的執行環境(例如 Python)與 requirements.txt 所列的套件,使用者只需要準備基本的 Docker 環境即可。