因为在这段时间里,总是需要为项目更换新的服务器,每次手动配置django环境已经是熟练得不要不要了。尽管已经达到一个相当熟练的状态,整个项目在全新的服务器中部署下来还是需要一两个小时,而且都是重复性的劳动,为了更好地迁移项目,我选择尝试用docker
和docker-compose
来创建和启动容器,实现尽可能方便地一键式部署。
在实际的生产中,一个项目需要定义数量总多的docker容器,并且容器之间有着错综复杂的依赖关系,手动创建和配置复杂的容器关系,效率会很低下。docker-compose
可以定义容器集群编排,可以在不同的服务器上一键式复用配置。
1. ubuntu安装docker
ubuntu中自带了低版本的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 --version
3.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
学习之路无尽头!!!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。