文章目录
- 0. [django + mysql + uwsgi + celery + redis部署开发]
- 1. docker权限报错
- 报错提示:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/info: dial unix /var/run/docker.sock: connect: permission denied`
- 2. 部署docker + Django + uwsgi项目
- uwsgi.ini文件配置
- nginx.conf配置
- Dockerfie文件配置
- docker相关命令
- 3. 遇到的报错
- 报错1:查看容器状态一直是:`Exited (0) 4 seconds ago`,且docker exec提示`Error response from daemon: Container ... is not running`,正常应该是`up`
- 报错2:进入docker容器后启动服务,页面请求无效,使用curl url报错Internal Server Error或者curl: (52) Empty reply from server
- 报错3:再次在docker中直接python命令启动服务报错:`django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)")`
- 报错4:再次在docker中使用uwsgi启动服务报错:`--- no python application found, check your startup logs for errors ---`
0. django + mysql + uwsgi + celery + redis部署开发
1. docker权限报错
报错提示:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/info: dial unix /var/run/docker.sock: connect: permission denied`
解决办法1:sudo + docker命令
解决办法2:将当前用户加入到docker用户组
sudo groupadd docker
sudo gpasswd -a $USER docker
newgrp docker
docker ps
2. 部署docker + Django + uwsgi项目
uwsgi.ini文件配置
[uwsgi]
# 使用Nginx连接时使用,Django程序所在服务器地址(docker + nginx uwsgi_pass 127.0.0.1:8000; include uwsgi_params; 只能通过nginx转发才能访问)
socket=0.0.0.0:8000
# 直接做web服务器使用,Django程序所在服务器地址(proxy_pass http://127.0.0.1:8000;nginx转发端口和直接宿主机ip端口都可以访问)
;http=0.0.0.0:8000
# 项目目录,manage.py 同级目录
chdir=/home/python/crm_django/crm_management
# 项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=/home/python/crm_django/crm_management/crm_management/wsgi.py
# 进程数
processes=2
# 线程数
threads=2
# uwsgi服务器的角色
master=True
# 存放进程编号的文件
pidfile=/home/python/crm_django/crm_management/uwsgi.pid
# 日志文件
daemonize=/home/python/crm_django/crm_management/uwsgi.log
# 指定依赖的虚拟环境
virtualenv=/home/python/Python-3.8.6/bin/crm_test/
# 静态文件,先执行python manage.py collectstatic ,setting中指定静态文件STATIC_ROOT=os.path.join(BASE_DIR, 'static')
static-map=/static=/home/python/crm_django/crm_management/static
;uwsgi --ini uwsgi.ini 启动uwsgi
;uwsgi --stop uwsgi.pid 关闭uwsgi 若报错,执行ps -ef|grep uwsgi 将pid写进uwsgi.pid再执行
;uwsgi --reload uwsgi.pid 重启uwsgi 若报错,执行ps -ef|grep uwsgi 将pid写进uwsgi.pid再执行,注意只有开启uwsgi才能重启
nginx.conf配置
server {
# 监听8001端口
listen 8001;
# 本机
server_name localhost;
# 默认请求的url
# 开启404
proxy_intercept_errors on;
error_page 404 403 500 502 503 504 /404.html;
location = /404.html {
# 放错误页面的目录路径
root /home/python/crm_django/crm_management/static;
}
# 静态文件
location /static {
root /home/python/crm_django/crm_management;
if ($request_filename ~* .*\.(?:js|css)$)
{expires 7d;}
}
location / {
include /usr/local/nginx/conf/uwsgi_params;
#设置请求头,并将头信息传递给服务器端(获取用户真实ip)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#请求转发到uwsgi服务器
#proxy_pass http://127.0.0.1:8000;
uwsgi_pass 127.0.0.1:8000;
include uwsgi_params;
}
}
Dockerfie文件配置
FROM python:3.8.6
#MAINTAINER cc
RUN mkdir -p /code1/crm_django
WORKDIR /code1/crm_django/
ADD . /code1/crm_django/
RUN pip3 install -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip3 install -r /code1/crm_django/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --no-deps --no-dependencies --trusted-host pypi.tuna.tsinghua.edu.cn
# 推荐使用脚本辅助启动,直接CMD uwsgi --ini uwsgi.ini很坑
CMD ["chmod","+x","/code1/crm_django/start.sh"]
CMD ["sh","-c","/code1/crm_django/start.sh"]
docker相关命令
构建docker镜像:
docker build -t crm_django:v1 .
运行docker镜像,启动容器
docker run --privileged -it -d -p 8000:8000 --name crm_django crm_django:v1 /bin/bash
# -i: 以交互模式运行容器,通常与 -t 同时使用;
# -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
# -d 后台运行
# -–privileged 加权限
# -p 宿主机端口:容器端口 开放容器端口到宿主机端口
# /bin/bash可以带上多个脚本,以逗号隔开脚本名称
进入容器:
docker exec -it ed2ae3d901ab /bin/bash
查看所有容器:
docker ps -a
删除容器:
docker rm 容器id
# 删除所有无效容器
docker rm $(docker ps -qf status=exited)
查看所有镜像:
docker images
删除镜像:(先删容器,再删镜像)
docker rmi 镜像id
# 删除所有无效镜像
docker rmi -f $(docker images | grep "<none>" | awk "{print $3}")
查看容器日志:
docker logs 容器id
启动、停止、重启指定容器:
docker start/stop/restart 容器id
3. 遇到的报错
报错1:查看容器状态一直是:Exited (0) 4 seconds ago
,且docker exec提示Error response from daemon: Container ... is not running
,正常应该是up
正常状态:
排除方法:
1. docker logs 容器日志,查看日志报错;
2. docker run 加上-it /bin/bash,删除容器镜像+重新构建;
3. 只有up状态才能查看容器日志和进入容器,所有1/2两步还不能解决问题建议采用shell脚本启动服务进行调试
报错2:进入docker容器后启动服务,页面请求无效,使用curl url报错Internal Server Error或者curl: (52) Empty reply from server
排除方法:
python manage.py runserver 0.0.0.0:8000启动服务,报错SyntaxError: Generator expression must be parenthesized (widgets.py, line 152)
答:主要是因为python3.8.6和django1.11.0版本问题,需要将/usr/local/lib/python3.8/site-packages/django/contrib/admin/widgets.py第150行源码后面的逗号去掉
报错3:再次在docker中直接python命令启动服务报错:django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)")
答:修改django配置文件中DATABASES中port对应的数据库ip,确保docker网络可达mysql数据库
报错4:再次在docker中使用uwsgi启动服务报错:--- no python application found, check your startup logs for errors ---
答:主要是uwsgi未发现python环境,检查uwsgi.ini文件中目录路径配置项是否正常,特别是python虚拟环境路径和wsgi-file文件中wsgi.py文件路径是否正确(我就错乱,搞了好久)
注意:uwsgi.ini 配置http=0.0.0.0:8000和socket=0.0.0.0:8000的区别
最终部署效果: