用docker部署django应用

转自:https://tomming233.github.io/2017/04/24/%E7%94%A8docker%E9%83%A8%E7%BD%B2django%E5%BA%94%E7%94%A8/

正式开始

在完成上述学习之后,相信大家对Docker都有了一定的了解, docker官方提供了docker-compose来方便快捷地定义和运行多个 Docker 容器的应用, 接下来就让我来一步一步介绍如何用Docker来部署博客应用吧.

1. 目录创建

说明:

  • 项目地址
  • blog目录是任意包含Dockerfile的django项目代码
  • init_admin.py 文件是用于创建管理员用户的(当然我们理应从环境变量中读出账号密码等敏感信息, 这里为了方便, 我便直接硬写入了, 毕竟只是用来练习的嘛:) )
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    django-with-docker/
    ├── blog
    │   ├── app
    │   │   ├── admin.py
    │   │   ├── apps.py
    │   │   ├── forms.py
    │   │   ├── __init__.py
    │   │   ├── migrations
    │   │   │   ├── 0001_initial.py
    │   │   │   ├── 0002_suggest.py
    │   │   │   └── __init__.py
    │   │   ├── models.py
    │   │   ├── static
    │   │   │   ├── css
    │   │   │   │   ├── blog-home.css
    │   │   │   │   ├── bootstrap.css
    │   │   │   │   └── bootstrap.min.css
    │   │   │   ├── fonts
    │   │   │   │   ├── glyphicons-halflings-regular.eot
    │   │   │   │   ├── glyphicons-halflings-regular.svg
    │   │   │   │   ├── glyphicons-halflings-regular.ttf
    │   │   │   │   ├── glyphicons-halflings-regular.woff
    │   │   │   │   └── glyphicons-halflings-regular.woff2
    │   │   │   └── js
    │   │   │   ├── bootstrap.js
    │   │   │   ├── bootstrap.min.js
    │   │   │   └── jquery.js
    │   │   ├── templates
    │   │   │   └── blog
    │   │   │   ├── about.html
    │   │   │   ├── base.html
    │   │   │   ├── category.html
    │   │   │   ├── comment.html
    │   │   │   ├── detail.html
    │   │   │   ├── index.html
    │   │   │   ├── pagination.html
    │   │   │   ├── search.html
    │   │   │   └── thanks.html
    │   │   ├── templatetags
    │   │   │   ├── __init__.py
    │   │   │   └── paginate_tags.py
    │   │   ├── tests.py
    │   │   ├── urls.py
    │   │   └── views.py
    │   ├── blog
    │   │   ├── __init__.py
    │   │   ├── settings.py
    │   │   ├── urls.py
    │   │   └── wsgi.py
    │   ├── Dockerfile
    │   ├── init_admin.py
    │   ├── LICENSE
    │   ├── logs
    │   │   ├── dberror.log
    │   │   ├── django.log
    │   │   └── faillog.log
    │   ├── manage.py
    │   ├── README.md
    │   └── requirements
    │   ├── dev.txt
    │   ├── prod.txt
    │   └── test.txt
    ├── docker-compose.yml
    ├── nginx
    │   ├── Dockerfile
    │   ├── nginx.conf
    │   └── sites-enabled
    │   └── django_project
2. 编写Dockerfile.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
version: ‘2’
services:
web:
restart: always
# 指定镜像创建源目录,在其根目录中必须包含Dockerfile
build: ./blog
# 多行命令
command: bash -c “python3 manage.py makemigrations &&
python3 manage.py migrate &&
python3 init_admin.py &&
/usr/local/bin/gunicorn –bind 0.0.0.0:8000 blog.wsgi:application -w 2″
# 端口映射(host:container)
ports:
– “8000:8000”
# 指定你要挂载的容器卷,路径可任意
volumes:
– /code
# 指定要进行相互间通信的容器名
links:
– db
– redis
nginx:
restart: always
build: ./nginx/
ports:
– “80:80”
# nginx容器挂载在与web容器相同的容器卷上
volumes_from:
– web
links:
– web:web
db:
restart: always
image: postgres:latest
volumes:
– /var/lib/postgresql/data
redis:
restart: always
image: redis:latest
volumes:
– /data
3. 编写Dockerfile
  • django应用中的Dockerfile
    1
    2
    3
    4
    5
    6
    7
    8
    FROM python:3
    ENV PYTHONUNBUFFERED 1
    RUN mkdir /code
    WORKDIR /code
    ADD requirements/prod.txt /code/
    RUN pip install -r prod.txt -i http://mirrors.aliyun.com/pypi/simple/ –trusted-host mirrors.aliyun.com
    ADD . /code/
    RUN python manage.py collectstatic –noinput
  • nginx目录中的Dockerfile
    1
    2
    3
    FROM tutum/nginx
    RUN rm /etc/nginx/sites-enabled/default
    ADD sites-enabled/ /etc/nginx/sites-enabled

说明: 为什么不从nginx官方镜像中下载呢? 因为官方镜像中不包含siges-enabled以及sites-avaliable两个文件你需要重新配置, 这里我们下载前辈已经配置好的镜像.

4. 编写.env文件以及nginx配置文件:
  • env中是一些有关数据库相关变量配置:
    1
    2
    3
    4
    5
    DB_NAME=postgres
    DB_USER=postgres
    DB_PASS=postgres
    DB_SERVICE=postgres
    DB_PORT=5432
  • nginx配置文件如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    server {
    listen 80;
    server_name 0.0.0.0;
    charset utf-8;
    # 指定静态文件分流
    location /static {
    alias /code/static;
    }
    location / {
    proxy_pass http://web:8000; # web 即为容器名
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }
5. 大功告成

OK, 配置终于结束了, 接下来, 首先创建镜像, 输入命令docker-compose build, 稍等片刻, 然后运行相关容器, 输入命令docker-compose up.

最后, 让我们在浏览器中输入地址0.0.0.0, 此时你便可以看到网站成功运行了!

6. 参考资料

木易的技术记录 » 用docker部署django应用

顶 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

置顶文章