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端口。
(一般 容器抛出啥, 就映射啥。 方便。 这里只是为了体现一下区别。)