本例中会用到的额外服务有mysql,rabbitmq。部署中有一些需要特别注意的地方也会给大家说一说。
1.创建专属网络
开始前先创建一个专用的虚拟网络:
brick@brick:~$ docker network create django_web
后面的服务都会使用这个专属网络进行通信,主机名就是域名地址,通信地址直接填主机名,docker提供了域名解析,所以我settings.py的数据库以及rabbitmq配置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'my_database',
'HOST':'django_mysql',
'PORT': 3306,
'USER':'admin',
'PASSWORD':'123456',
}
import djcelery
djcelery.setup_loader()
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
BROKER_URL = 'amqp://admin:123456@rabbitmq:5672'
2.部署Mysql
拉取mysql镜像
- 拉取mysql镜像
brick@brick:~$ docker pull registry.docker-cn.com/library/mysql
Using default tag: latest
latest: Pulling from library/mysql
802b00ed6f79: Already exists
30f19a05b898: Pull complete
3e43303be5e9: Pull complete
94b281824ae2: Pull complete
51eb397095b1: Pull complete
54567da6fdf0: Pull complete
bc57ddb85cce: Pull complete
d6cd3c7302aa: Pull complete
d8263dad8dbb: Pull complete
780f2f86056d: Pull complete
8e0761cb58cd: Pull complete
7588cfc269e5: Pull complete
Digest: sha256:038f5f6ea8c8f63cfce1bce9c057ab3691cad867e18da8ad4ba6c90874d0537a
Status: Downloaded newer image for registry.docker-cn.com/library/mysql:latest
- 部署mysql服务
brick@brick:~$ docker run -d -p 3307:3306 --network django_web --name django_mysql -v $PWD/db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_USER=admin -e MYSQL_PASSWORD=123456 mysql:latest
# 说明下参数意义
# -p 映射端口:docker内部端口: 端口映射,只有将容器端口映射到外部,外部才能访问
# -e 环境变量,指定一些服务内读取的变量,以初始化服务,这里的变量意义从字面上不难理解
# --network 指定容器所在网络,需要互相访问的容器记得指定到同一个网络!
# --name 容器名,这个名字在同一个容器网络里是可以直接当成域名访问的!
- 测试
mysql -uroot -P3307 -p -e "show databases;"
Enter password:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
记得创建自己要用的数据库 create database
3.部署Rabbit MQ
因为项目用到了djcelery定时任务,所以需要部署Rabbit MQ
- 拉取rabbit mq镜像
brick@brick:~$ docker pull registry.docker-cn.com/library/rabbitmq:management
management: Pulling from library/rabbitmq
802b00ed6f79: Already exists
84fe35f04ebe: Pull complete
72a118dc68c2: Pull complete
51c199718697: Pull complete
e74b797281ea: Pull complete
f2b0494f0e3c: Pull complete
d43b5d7d2745: Pull complete
dedfc544656e: Pull complete
ed99f98ab240: Pull complete
422ec57c0d17: Pull complete
85c41b55ab02: Pull complete
8d040d0f68fe: Pull complete
881b91c66b89: Pull complete
06bcf7b1b9c9: Pull complete
Digest: sha256:a4ae5d7965167e593299bbc12298614f4f6e339492be21f245592994128047b9
Status: Downloaded newer image for registry.docker-cn.com/library/rabbitmq:management
- 部署mq服务
brick@brick:~$ docker run -d --network django_web --name rabbitmq -p 25678:25672 -p 15678:15671 -p 15679:15672 -p 4370:4369 -p 5678:5671 -p 5679:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq:management
-
访问ok
-
访问后记得在admin里面,配置一个用户,并且给他授权,django需要用这个用户访问
创建后点击用户名,设置权限
4.部署Django应用
- 获取基础镜像 python2.7
brick@brick:~$ docker pull registry.docker-cn.com/library/python:2.7
2.7: Pulling from library/python
05d1a5232b46: Pull complete
5cee356eda6b: Pull complete
89d3385f0fd3: Pull complete
80ae6b477848: Pull complete
28bdf9e584cc: Pull complete
a0cd6b0afff0: Pull complete
cd4c682e75b6: Pull complete
ac1b7290f23f: Pull complete
5c60877508b0: Pull complete
Digest: sha256:7bcab0fc96ed01ef05ecb52ddb0d9d728927fe1f307205ea8dc5269d2cae9a83
Status: Downloaded newer image for registry.docker-cn.com/library/python:2.7
- 编写部署Django的Dockerfile
# use base python image with python 2.7
FROM python:2.7
# install mysql-client
RUN apt-get update
RUN apt-get install -y mysql-client
# env
ENV RUN_MODE=DEPLOY
# add project to the image
ADD ./my_project/ /app/
# set working directory to /app/
WORKDIR /app/
# install python dependencies
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# RUN server after docker is up
CMD ./start.sh
特别注意:命令 python manage.py runserver 默认监听为本地 127.0.0.1:8000,所以即使通过端口映射出去,外面也无法访问,必须特别指定监听端口为python manage.py runserver 0.0.0.0:8000,监听所有的地址请求,还有就是不要把服务都放在后台运行,如果都放在后台,只使用-d参数的话,docker把命令跑完就会自行退出了,所以我的start.sh如下:
#!/bin/sh
python manage.py celery beat &
python manage.py celery worker &
python manage.py runserver 0.0.0.0:8000 #前台运行
#注意: 这样日志结构会比较乱,你也可以拆成3个容器来跑
- 在Dockerfile所在目录进行构建
$ docker build . -t django_web
Sending build context to Docker daemon 234.1MB
Step 1/8 : FROM python:2.7
---> 4ee4ea2f0113
# 后面balabala省略,就是一顿安装
- 启动django服务
$ docker run -d --network django_web --name django_web -p 8081:8000 django_web
c8732b1a06f0f96eb6249a7cfb2d8f4d54efbc7a776a8f5737b2bf65338eb44b
ok! 大功告成,访问试试看吧