用Docker开发Django

我正在尝试为使用Docker的Django Web应用程序创build自己的开发环境。
我的问题是我应该如何设定它的发展?

  1. 我已经创build了一个使用Django开发服务器和db的Dockerfile ,这很好吗? 还是应该使用独立的容器与专用的Web和数据库服务器?
  2. 我应该如何创build新的迁移? 比方说,我使用-v将代码安装到容器中,对模型的更改需要创build新的迁移,因此,是否应该使安装可写,并使用容器内的创build迁移? 还有什么其他的select?
  3. 我正在考虑向Dockerfile添加一条RUN指令,在迁移没有改变时, Dockerfile将应用迁移以便使用caching。 这是一个很好的做法吗?

我几乎只用Docker来开发Python(Flask dev)。 除非你使用PyCharm,否则Virtualenvs很烦人。

 FROM python:3.6 # Install requirements RUN pip install django==VERSION \ package==version ADD . /code WORKDIR /code CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] 

并在运行

 $ docker build -t IMAGE_NAME . $ docker run -it \ -p 8000:8000 \ --mount src=$(pwd),target=/code,type=bind \ -e DEBUG=1 \ IMAGE_NAME 

将主机设置为0.0.0.0非常重要,因为localhost不在容器主机文件中。 --mount-e DEBUG=1的组合将允许您利用热更改的变化。 您可能需要更改manage.py

 DEBUG = os.getenv('DEBUG') or 0 

这是我在做Flask开发时使用的。

编辑有点意识到这并不能回答你所有的问题

我总是做多容器,所以我可以换出DB后端,如果我这么请。

 version: '3' services: web: build: . ports: - "8000:8000" environment: - DEBUG=1 volumes: - type: bind source: . target: /code db: # This is the host name image: postgress:10.1 environment: - POSTGRESS_USER=USERNAME - POSTGRESS_PASSWORD=PASS - POSTGRESS_DB=DBNAME volumes: - data:/var/lib/postgresql/data volumes: data: 

您需要在此示例data声明一个命名卷,并且您可以通过…查看它存储的位置。

 $ docker volumes inspect data 

我之前陈述的docker run命令基本上被重写入了撰写文件(因为docker-compose只是调用底层的api)。 你可以通过Docker CLI在后台实际启动postgress容器,而不是使用compose,但是compose使得使用多个容器更容易。 由于没有明确定义的networking,容器只需创build一个默认networking并绑定到它。 您的数据库容器的主机名称是db或您决定调用该服务的任何内容。 所以在你的python文件中,你需要使用它作为连接的主机名。

至于迁移去,我认为你应该只是在Web容器中执行它们。 我真的没有做任何Django的开发,但如果它类似Flask迁移我会认为这是事实。

 $ docker exec -it web_container_name/hash /bin/bash root@web_container_hash# python manage.py makemigrations root@web_container_hash# python manage.py migrate 

编辑2

当这些命令运行时,它应该创build你的迁移,因为/code实际上是绑定到你的本地目录将它们保存到本地机器。