Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-3-Django项目实例
使用 Django
我们现在将使用 Compose 配置并运行一个 Django/PostgreSQL 应用。在此之前,先确保 Compose 已经安装。
1.通过编辑 Dockerfile文件来指定 Docker 容器要安装内容:
FROM python:2.7 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/
以上内容指定应用将使用安装了 Python 以及必要依赖包的镜像
2.在 requirements.txt文件里面写明需要安装的具体依赖包名:
Django
psycopg2
3.构建docker-compose.yml文件将把所有的东西关联起来
它描述了应用的 构成(一个 web 服务和一个数据库)、使用的 Docker 镜像、镜像之间的连接、挂 \载到容器的卷,以及服务开放的端口:
db: image: postgres //db服务使用的镜像 web: build: . //即本地的Dockerfile文件 command: python manage.py runserver 0.0.0.0:8000 //容器启动时运行的命令 volumes: - .:/code //挂载的数据卷 ports: - "8000:8000" //映射的端口 links: //连接的db容器 - db
4.然后就可以使用 docker-compose run命令启动一个 Django 应用了
Compose 会先使用 Dockerfile为 web 服务创建一个镜像,接着使用这个镜像在容器里运行下面的指令
userdeMacBook-Pro:django user$ docker-compose run web django-admin.py startproject docker_composeexample .
Starting django_db_1 ... done
然后就会生成下面红圈圈起来的部分文件和文件夹:
5.开始使用该Django:
1)首先,我们要为应用设置好数据库的连接信息。用以下内容替换 docker_composeexample/settings.py文件中 DATABASES = ...定义的节点内容:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'postgres', 'USER': 'postgres', 'HOST': 'db', 'PORT': 5432, } }
这些信息是在 postgres Docker 镜像固定设置好的。 然后,运行 docker-compose up:
userdeMacBook-Pro:django user$ docker-compose up django_db_1 is up-to-date Starting django_web_1 ... done Attaching to django_db_1, django_web_1 db_1 | The files belonging to this database system will be owned by user "postgres". db_1 | This user must also own the server process. db_1 | db_1 | The database cluster will be initialized with locale "en_US.utf8". db_1 | The default database encoding has accordingly been set to "UTF8". db_1 | The default text search configuration will be set to "english". db_1 | db_1 | Data page checksums are disabled. db_1 | db_1 | fixing permissions on existing directory /var/lib/postgresql/data ... ok db_1 | creating subdirectories ... ok db_1 | selecting default max_connections ... 100 db_1 | selecting default shared_buffers ... 128MB db_1 | selecting dynamic shared memory implementation ... posix db_1 | creating configuration files ... ok db_1 | running bootstrap script ... ok db_1 | performing post-bootstrap initialization ... ok db_1 | db_1 | WARNING: enabling "trust" authentication for local connections db_1 | You can change this by editing pg_hba.conf or using the option -A, or db_1 | --auth-local and --auth-host, the next time you run initdb. db_1 | syncing data to disk ... ok db_1 | db_1 | Success. You can now start the database server using: db_1 | db_1 | pg_ctl -D /var/lib/postgresql/data -l logfile start db_1 | db_1 | **************************************************** db_1 | WARNING: No password has been set for the database. db_1 | This will allow anyone with access to the db_1 | Postgres port to access your database. In db_1 | Docker's default configuration, this is db_1 | effectively any other container on the same db_1 | system. db_1 | db_1 | Use "-e POSTGRES_PASSWORD=password" to set db_1 | it in "docker run". db_1 | **************************************************** db_1 | waiting for server to start....2018-12-17 10:29:34.186 UTC [45] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" db_1 | 2018-12-17 10:29:34.202 UTC [46] LOG: database system was shut down at 2018-12-17 10:29:33 UTC db_1 | 2018-12-17 10:29:34.207 UTC [45] LOG: database system is ready to accept connections db_1 | done db_1 | server started db_1 | db_1 | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/* db_1 | db_1 | waiting for server to shut down....2018-12-17 10:29:34.279 UTC [45] LOG: received fast shutdown request db_1 | 2018-12-17 10:29:34.282 UTC [45] LOG: aborting any active transactions db_1 | 2018-12-17 10:29:34.284 UTC [45] LOG: background worker "logical replication launcher" (PID 52) exited with exit code 1 db_1 | 2018-12-17 10:29:34.285 UTC [47] LOG: shutting down db_1 | 2018-12-17 10:29:34.302 UTC [45] LOG: database system is shut down db_1 | done db_1 | server stopped db_1 | db_1 | PostgreSQL init process complete; ready for start up. db_1 | db_1 | 2018-12-17 10:29:34.392 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 db_1 | 2018-12-17 10:29:34.392 UTC [1] LOG: listening on IPv6 address "::", port 5432 db_1 | 2018-12-17 10:29:34.395 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" db_1 | 2018-12-17 10:29:34.407 UTC [54] LOG: database system was shut down at 2018-12-17 10:29:34 UTC db_1 | 2018-12-17 10:29:34.412 UTC [1] LOG: database system is ready to accept connections web_1 | /usr/local/lib/python2.7/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>. web_1 | """) web_1 | /usr/local/lib/python2.7/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>. web_1 | """) web_1 | Performing system checks... web_1 | web_1 | System check identified no issues (0 silenced). web_1 | web_1 | You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. web_1 | Run 'python manage.py migrate' to apply them. web_1 | December 17, 2018 - 11:03:22 web_1 | Django version 1.11.17, using settings 'docker_composeexample.settings' web_1 | Starting development server at http://0.0.0.0:8000/ web_1 | Quit the server with CONTROL-C.
这个 web 应用已经开始在你的 docker 守护进程里监听着 5000 端口了(如果你有使用 boot2docker ,执行 boot2docker ip,就会看到它的地址)。
你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 docker-compose up后,在另外一个终端运行以下命令即可:
userdeMacBook-Pro:django user$ docker-compose run web python manage.py syncdb Starting django_db_1 ... done /usr/local/lib/python2.7/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>. """) Unknown command: 'syncdb' Type 'manage.py help' for usage.
错误原因:在Django 1.9及未来的版本种使用migrate代替syscdb,所以将syscdb改为migrate即可:
userdeMacBook-Pro:django user$ docker-compose run web python manage.py migrate Starting django_db_1 ... done /usr/local/lib/python2.7/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>. """) Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying sessions.0001_initial... OK