安之偌素 2020-02-24
需要解决的主要问题:如何在宿主机修改代码,在容器中实时刷新代码效果。
解决方案就是VOLUME,挂载。具体操作方式也有多种,本文通过编写compose文件的方式来实现挂载。
本文假设读者已经了解Docker的基础知识:镜像、容器的概念,Docker的基本操作。
笔者使用docker的思想是:镜像作为材料,Compose作为蓝图,通过修改蓝图来生成分别适用于开发、测试、生产环境的容器。
镜像是一个相对比较固定的部分。
具体实践是:Dockerfile来生成镜像,镜像包含运行时的必要条件(库依赖、源码之类)。Compose来决定运行时的环境(容器连接、挂载、环境变量等)。
以flask项目为例。
新建一个目录叫 flask-demo, 这个目录将存放我们的项目源码和Dockerfile文件。
$ mkdir flask-demo $ cd flask-demo
在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()
创建一个镜像,该镜像包含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并保存,刷新浏览器,你会发现内容实时刷新了。