文章目录

  • 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

uos部署docker docker uwsgi_后端


正常状态:

uos部署docker docker uwsgi_后端_02


排除方法:

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)

uos部署docker docker uwsgi_django_03

答:主要是因为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 ---

uos部署docker docker uwsgi_python_04

答:主要是uwsgi未发现python环境,检查uwsgi.ini文件中目录路径配置项是否正常,特别是python虚拟环境路径和wsgi-file文件中wsgi.py文件路径是否正确(我就错乱,搞了好久)

注意:uwsgi.ini 配置http=0.0.0.0:8000和socket=0.0.0.0:8000的区别

最终部署效果:

uos部署docker docker uwsgi_docker_05