开始准备让我们的应用在 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 --build directory=http://www.likecs.com/home/yangxg/apps/HelloDjango-blog-tutorial autostart=true autorestart=unexpected user=yangxg stdout_logfile=http://www.likecs.com/home/yangxg/etc/supervisor/var/log/hellodjango-blog-tutorial-stdout.log stderr_logfile=http://www.likecs.com/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完美!至此,我们的博客已经稳定运行于线上,陆陆续续会有更多的人来访问我们的博客,让我们来继续完善它的功能吧!
『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~