from flask import Flask
app = Flask(__name__) @app.route("/") def hello(): return "hello docker" if __name__ == "__main__": app.run(host="0.0.0.0", port="5000") # 使用0.0.0.0 這樣才可以保證其他地址可以方位。 端口和Dockerfile 中的 EXPOES 的端口, 保持一致
這是一段py的代碼。 運行之后會在 127.0.0.1:5000的端口上。
把他搞成一個image。 所以我們需要python解釋器。 我用的 python3.7.7
創建一個Dockerfile
FROM python:3.7.7 # 我這個image使用的 base image是 python:3.7.7 再docker hub上可以找到 LABEL maintainer="這是一個py3.7的東西" # 一個注釋 RUN pip install flask # 需要下載 flask的第三方包
COPY app.py /app/ # 將app.py 這個文件 添加到我這個image的 根目錄下的app目錄之下。(app 沒有會自動創建) WORKDIR /app # 指定后面的CMD 或者 ENTRYPOINT 命令的,工作目錄
EXPOSE 5000 # 將我們這個運行的容器的 5000 端口向外暴漏 CMD ["python", "app.py"] # 執行命令
### COPY 這里要注意一下子,
COPY app.py /app 這樣子是 將app.py 這個文件 復制到 / 根目錄下。並且起名 app
COPY app.py /app/ 這樣才是將app.py 這個文件復制到 app 這個目錄下。 (沒有的目錄 在docker build時, 會自動創建)
目錄結構:
-python-flask
- app.py
- Dockerfile
[miller@docker4 python-flask]$ docker build -t caijiwandocker/flask-hello-world . # 最后面的 . 意思就是當前目錄。
構建完成之后, 我們就得到了一個 image , 運行起來
[miller@docker4 python-flask]$ docker run caijiwandocker/flask-hello-world
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
程序會在這里 夯住。 可以看到運行的端口在 127.0.0.1:5000
[miller@docker4 python-flask]$ docker run -d caijiwandocker/flask-hello-world # -d 后台運行。
a6ba341c83c2e86b36e993073aa6739b5d7bcabad9d6b52a8e2152aabc7409ed
[miller@docker4 python-flask]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6ba341c83c2 caijiwandocker/flask-hello-world "python3 app.py" About a minute ago Up About a minute 5000/tcp naughty_robinson
如果希望, 其他的電腦也可以進行訪問的話。 就需要將docker 容器拋出的 端口, 和我們安裝docker的主機上的端口, 做一個映射。
[miller@docker4 python-flask]$ docker run -d -p 8080:5000 caijiwandocker/flask-hello-world
如此就是 將主機上的 8080 端口, 和 docker 容器拋出的5000端口做一個映射。
這樣當我們訪問安裝 的docker主機 的8080 端口的時候, 就直接訪問了 docker 容器中的 flask app這個 web 應用的5000端口了。
ps:如果docker的主機, 是一個雲主機或者什么服務器把, 只要他又有公有的 ip 地址。 那么我們就可以通過 共有ip:8080 從而訪問到 docker容器中開啟的
這個web 服務了。 即使這個容器拋出的是5000端口。
(一般 容器拋出啥, 就映射啥。 方便。 這里只是為了體現一下區別。)