需要解決的主要問題:如何在宿主機修改代碼,在容器中實時刷新代碼效果。
解決方案就是VOLUME,掛載。具體操作方式也有多種,本文通過編寫compose文件的方式來實現掛載。
本文假設讀者已經了解Docker的基礎知識:鏡像、容器的概念,Docker的基本操作。
筆者使用docker的思想是:鏡像作為材料,Compose作為藍圖,通過修改藍圖來生成分別適用於開發、測試、生產環境的容器。
鏡像是一個相對比較固定的部分。
具體實踐是:Dockerfile來生成鏡像,鏡像包含運行時的必要條件(庫依賴、源碼之類)。Compose來決定運行時的環境(容器連接、掛載、環境變量等)。
以flask項目為例。
新建一個目錄叫 flask-demo, 這個目錄將存放我們的項目源碼和Dockerfile文件。
$ mkdir flask-demo
$ cd flask-demo
新建一個flask項目
在flask-demo里創建一個目錄叫hello,並創建flask項目放於該目錄。
現在的目錄結構是這樣的
flask-demo
- hello # 這里就是flask項目
- app.py
- .....
app.py文件如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
通過Dockerfile創建新鏡像
創建一個鏡像,該鏡像包含web源碼和web的依賴。
在flask-demo目錄里,創建Dockerfile文件
Dockerfile
FROM python
RUN apt-get update
RUN pip install flask
WORKDIR /app
COPY ./hello /app/hello
ENTRYPOINT FLASK_APP=/app/hello/app.py flask run -h 0.0.0.0 -p 80
EXPOSE 80
生成鏡像
# build一個名為flask-demo的鏡像
$ docker build -t flask-demo ./
# 運行flask-demo鏡像. 將宿主機的5000端口映射到容器的80端口
$ docker run -p 5000:80 flask-demo
現在,瀏覽器輸入 http://localhost:5000 就可以看到正常運行的網頁了。
那么,證明我們的鏡像是OK的了。
但是,現在宿主機修改代碼,容器是不會刷新的,因為容器里面的代碼只是一份拷貝。
現在,我們來編寫compose文件
還是在flask-demo目錄里,新建文件docker-compose.yml
docker-compose.yml
version: "3"
services:
flask-demo:
build: ./
ports:
- "5000:80"
volumes:
- ./hello:/app/hello #將容器里面的/app/hello掛載到宿主機的./hello目錄
environment:
- FLASK_ENV=development # 指定開發環境,修改代碼會實時刷新項目
(如果Dockerfile和docker-compose.yml有相同的字段配置,那么會優先采用docker-compose.yml的配置。)
現在來測試一下我們的compose文件。
【記得把剛才運行的容器停止了】
執行以下命令來運行容器
$ docker-compose up
現在,瀏覽器輸入 http://localhost:5000 就看到正常運行的網頁了。
然后修改flask項目的app.py並保存,刷新瀏覽器,你會發現內容實時刷新了。
