使用 Docker 让部署 Django 项目更加轻松( 四 )


首先安装必要依赖:
$ sudo yum install -y yum-utilsdevice-mapper-persistent-datalvm2然后添加仓库源:
$ sudo yum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.repo最后安装 Docker:
$ sudo yum install docker-ce docker-ce-cli containerd.io启动 Docker:
$ sudo systemctl start docker(境外服务器忽略)设置 Docker 源加速(使用 daocloud 提供的镜像源),否则拉取镜像时会非常慢
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io在 docker 中运行一个 hello world,确认 docker 安装成功:
$ sudo docker run hello-worlddocker 安装成功了,还要安装一下 docker-compose 。其实是一个 python 包,我们直接通过 pip 安装就可以了:
$ pip install docker-compose为了避免运行一些 docker 命令时可能产生的权限问题,我们把系统当前用户加入到 docker 组里:
$ sudo usermod -aG docker ${USER}添加组后要重启一下 shell(ssh 连接的话就断开重连) 。
万事俱备,只欠东风了!
开始准备让我们的应用在 docker 容器里运行 。由于之前我们把应用部署在宿主机上,首先来把相关的服务停掉:
# 停掉 nginx,因为我们将在容器中运行 nginx$ sudo systemctl stop nginx# 停掉博客应用$ supervisorctl stop hellodjango-blog-tutorial -c ~/etc/supervisord.conf接下来拉取最新的代码到服务器,进入项目根目录下,创建线上环境需要的环境变量文件:
$ mkdir .envs$ cd .envs$ vi .production将线上环境的 secret key 写入 .production 环境变量文件,
DJANGO_SECRET_KEY=2pe8eih8oah2_2z1=7f84bzme7^bwuto7y&f(#@rgd9ux9mp-3保存并退出 。
回到项目根目录,运行 build 命令构建镜像:
$ docker-compose -f prodcution.yml build然后我们可以开始启动根据构建好的镜像启动 docker 容器,不过为了方便,我们的 docker 进程仍然由 supervisor 来管理,我们修改一下博客应用的配置,让它启动时启动 docker 容器 。
打开 ~/etc/supervisor/conf.d/hellodjango-blog-tutorial.ini,修改为如下内容:
[program:hellodjango-blog-tutorial]command=docker-compose -f production.yml up --builddirectory=/home/yangxg/apps/HelloDjango-blog-tutorialautostart=trueautorestart=unexpecteduser=yangxgstdout_logfile=/home/yangxg/etc/supervisor/var/log/hellodjango-blog-tutorial-stdout.logstderr_logfile=/home/yangxg/etc/supervisor/var/log/hellodjango-blog-tutorial-stderr.log主要就是把之前的使用 Gunicorn 来启动服务换成了启动 docker 。
修改 ini 配置 要记得 reread 使配置生效:
$ supervisorctl -c ~/etc/supervisord.conf> reread> startdocker 容器顺利启动,访问我们的博客网站 。抛掉镜像编排的准备工作,相当于我们只执行了一条构建容器并启动容器的命令就部署了我们的博客应用 。如果换台服务器,也只要再执行一下镜像构建和启动容器的命令,服务就又可以起来!这就是 docker 的好处 。

由于开发 django 用的最多的 IDE Pycharm 也能很好地集成 Docker,我现在开发工作已经全面拥抱 Docker 了,前所未有的体验,前所未有的方便和稳定,一定要学着用起来!
HTTPS
最后,由于 Nginx 在新的容器里运行,所以需要重新申请和配置 https 证书,这和之前是一样,只是此前 Nginx 在宿主机上,这次我们在容器里运行 certbot 命令 。编排 nginx 镜像时已经安装了 certbot,直接执行命令即可,在 docker 容器内执行命令如下:
我们首先通过 docker ps 命令查看正在运行的容器,记住 nginx 容器的名字,然后使用 docker exec -it 容器名 命令的格式在指定容器内执行命令,所以我们执行:
$ docker exec -it nginx certbot --nginx根据提示输入信息即可,过程和上一节在宿主机上部署一模一样,这里不再重复 。
自动化部署
fabric 无需修改,来尝试本地执行一下:
pipenv run fab -H server_ip --prompt-for-login-password -p deploy完美!至此,我们的博客已经稳定运行于线上,陆陆续续会有更多的人来访问我们的博客,让我们来继续完善它的功能吧!
参考资料
[1]HelloGitHub-Team 仓库: https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial
[2]Docker 的官方文档: https://docs.docker.com/install/




推荐阅读