基于docker-compose部署Django项目
书接上回,项目搞定,在本地也是运行正常的,接下来的工作就是要部署到服务器上了。之前我部署网站一般都是借助宝塔来部署,宝塔确实挺好用,但是,缺少灵魂。那段时间刚好在尝试使用docker完成一些工作,所以刚好选择了docker-compose来进行部署
部署过程
docker-compose编排文件
要使用docker-compose进行部署,首先自然是要编写docker-compose的编排文件
新建一个docker-compose.yml
文件,在这个文件的第一行写上
version: "3"
来声明版本。
接下来,声明数据卷和网络
volumes:
db_vol:
redis_vol:
media_vol:
static_vol:
networks: # 自定义网络(默认桥接), 不使用links通信
nginx_network:
driver: bridge
db_network:
driver: bridge
redis_network:
driver: bridge
volumes
下的若干项为定义的数据卷,即docker挂载在宿主机的数据卷,在后续可以对这些数据卷进行操作,从而实现docker与宿主机的数据通信。对于上述代码中的数据卷,从上到下依次时:数据库、redis、多媒体资源、静态资源。
networks
下的若干项为定义的网络,均使用桥接模式,可近似理解为处于某个网络下的若干组件存在于一个局域网之中,局域网中的各个组件可以通过网络进行通信。
最后,需要定义各个用到的服务,代码如下:
services:
redis:
image: redis:latest
command: redis-server /etc/redis/redis.conf
networks:
- redis_network
volumes:
- redis_vol:/data
- ./compose/compose_py_dev/redis/redis.conf:/etc/redis/redis.conf
ports:
- "6380:6379"
restart: always
db:
image: mysql:5.7
env_file:
- ./Code/.env
networks:
- db_network
volumes:
- db_vol:/var/lib/mysql:rw
- ./compose/compose_py_dev/mysql/conf/my.cnf:/etc/mysql/my.cnf
- ./compose/compose_py_dev/mysql/init:/docker-entrypoint-initdb.d/
ports:
- "3307:3306"
restart: always
web:
build: ./Code
expose:
- "8000"
volumes:
- ./Code:/var/www/html/Code
- static_vol:/var/www/html/Code/static
- media_vol:/var/www/html/Code/resources
- ./compose/compose_py_prod/uwsgi:/tmp
- whoosh:/var/www/html/Code/PersonalBlog/whoosh_index
networks:
- nginx_network
- db_network
- redis_network
depends_on:
- db
- redis
restart: always
tty: true
stdin_open: true
nginx:
build: ./compose/compose_py_dev/nginx
ports:
- "80:80"
- "443:443"
expose:
- "80"
volumes:
- ./compose/compose_py_dev/nginx/nginx.conf:/etc/nginx/conf.d/nginx.conf
- ./compose/compose_py_dev/nginx/ssl:/usr/share/nginx/ssl
- ./compose/compose_py_dev/nginx/log:/var/log/nginx
- static_vol:/usr/share/nginx/html/static
- media_vol:/usr/share/nginx/html/resources
networks:
- nginx_network
depends_on:
- web
restart: always
对于上述使用到的各个配置项,其作用如下表:
配置项 | 功能 |
---|---|
image | 容器所使用的镜像及版本 |
command | 启动容器的命令 |
networks | 指定存在的网络 |
volumes | 配置数据卷挂载 |
ports | 端口映射 |
restart | 当出现问题时的重启策略 |
启动与其他杂项
使用如下命令即可借助docker-compose来启动相关服务
docker-compose up -d
也可以通过-f
参数来指定要运行的yml文件
docker-compose -f xxx.yml up -d
启动服务后,可以通过docker ps
查看已运行的容器,也可以通过docker logs
来查看某个容器的日志。
正确启动后,需要通过云服务商配置域名、安全策略等,即可通过域名来访问网站。
问题记录
发表新博客后,HayStack更新文章索引失败
在本地部署时,未发现此问题。部署至云服务器后,发现每次发表新文章,haystack并不能正常更新文章索引,导致搜索功能并不能正常使用。
此问题的原因在于容器内部索引文件的所有者设置错误,通过chown
等命令更改目录所有者即可正常运行。
报错:502 Bad Gateway
报此错误并不代表是nginx出了错误,往往是代码运行报错,此时应通过docker logs
查看代码容器运行日志并进行排查。
总结
在三天打鱼两天晒网中搞定了这一套东西。感受还是颇丰的,写代码的时候感觉很多bug都被处理掉了,随着近期较为“深度”的使用才发现小问题还是不断的。写代码时没有添加日志功能,导致有时定位错误还是很困难的,足以显示日志的重要性。
后续想把这个项目作为一个“盒子”,如果没有什么其他项目的话,就给它换语言换框架,加个前后端分离,再试着用k8s部署下,圆满。