因为在这段时间里,总是需要为项目更换新的服务器,每次手动配置django环境已经是熟练得不要不要了。尽管已经达到一个相当熟练的状态,整个项目在全新的服务器中部署下来还是需要一两个小时,而且都是重复性的劳动,为了更好地迁移项目,我选择尝试用docker和docker-compose来创建和启动容器,实现尽可能方便地一键式部署。
在实际的生产中,一个项目需要定义数量总多的docker容器,并且容器之间有着错综复杂的依赖关系,手动创建和配置复杂的容器关系,效率会很低下。docker-compose可以定义容器集群编排,可以在不同的服务器上一键式复用配置。
1. ubuntu安装dockerubuntu中自带了低版本的docker,需要先卸载旧版本,再安装最新的版本
# 卸载旧版本 apt-get remove docker docker-engine docker.io containerd runc # 安装依赖 apt update apt-get install ca-certificates curl gnupg lsb-release # 安装GPG证书 curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # 写入软件源 add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # 安装新版本 apt-get install docker-ce docker-ce-cli containerd.io
在安装后需要对docker进行换源,使用国内镜像源提高下载速度
vim /etc/docker/daemon.json # 未配置过时,该文件不存在,往其中加入下面内容
# 加入内容
{
"registry-mirrors": ["https://y0qd3iq.mirror.aliyuncs.com"]
}
# 重启docker,让其生效
systemctl restart docker
最后可以通过下面命令判断是否修改成功
docker info | grep -i Mirrors -A 1
输出结果里有加入的镜像源,即修改成功
2.docker-compose安装# 下载docker-compose curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # 增加执行权限 sudo chmod +x /usr/local/bin/docker-compose # 查看是否安装成功 docker-compose --version3.docker-compose
在我使用的项目中使用django+uwsgi+nginx+mysql,在项目中编排了3个容器:
- django+uwsgi容器:python后端框架和处理动态请求
- mysql容器:数据库框架
- **nginx容器:**处理静态资源请求
其实整个docker-compose最重要的就是docker-compose.yml核心编排文件,我的编排文件是在这篇大神文章的基础上修改的,你可以根据自己项目里需要的东西数量不同来修改你的编排文件,无论是增加容器还是减少容器。
# 进入docker-compose.yml所在文件夹,输入以下命令构建镜像 sudo docker-compose build # 查看已生成的镜像 sudo docker images # 启动容器组服务,这里启动后会一直运行,不能关闭,这里可以推荐nohup或者tmux让命令一直运行 sudo docker-compose up # 查看运行中的容器 sudo docker ps
总的来说,在完成你的编排文件和各个容器所需要的配置文件后,使用docker-compose构建镜像和启动容器组服务,就可以省去一系列的环境配置,单独配置环境还可以出现各种坑,但是在docker中却是不存在,一切都是顺通无阻。
当然更重要的是排错,在写配置文件是会出现一系列的问题,所以最重要的是排错,排错要好好的看日志文件中的报错,下面列举了一些我遇上的错误
出现的错误uwsgi启动错误并不会停止进程,但是此时如果你通过端口去访问的话会出现的错误502 Bad Gateway,这个时候需要去日志中查看失败的信息,日志文件在你的配置文件uwsgi.ini中项daemonize就是uwsgi的错误日志路径,而绝大多数的错误都是由于该配置文件内容的错误导致
- 端口占用
probably another instance of uWSGI is running on the same address (0.0.0.0:8000). bind(): Address already in use [core/socket.c line 769]
错误原因是重复使用uwsgi uwsgi.ini命令,8000端口已经被占用,使用命令pkill -f uwsgi -9关闭所有uwsgi的进程,在bash中可以通过使用命令ps -ef查看所有进程。
- module设置错误
--- no python application found, check your startup logs for errors ---
主要是由于配置文件uwsgi.ini中的module设置的问题,module=project_name.wsgi:application这里的project_name一定要和自己项目根目录下包含setting.py的文件夹名字相同,原配置是绝对路径的也需要改为module=project_name.wsgi:application
小结整篇文章是在大江狗的文章的配置基础上修改实现Docker部署Django由浅入深系列(下): 八步部署Django+Uwsgi+Nginx+MySQL+Redis
学习之路无尽头!!!



