用Docker搭建web开发环境

安之偌素 2020-02-24

需要解决的主要问题:如何在宿主机修改代码,在容器中实时刷新代码效果。

解决方案就是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并保存,刷新浏览器,你会发现内容实时刷新了。

相关推荐