[web-009]从零开始实现django服务docker部署到阿里云容器并配置负载均衡

## 创建django2.0的虚拟环境

    mkdir ~/.virtualenvs
    virtualenv -p python3 ~/.virtualenvs/python3-django2.0.0
    source ~/.virtualenvs/python3-django2.0.0/bin/activate
    pip3 install django==2.0.0

    

## 创建项目目录

    mkdir stand-django-docker 
    cd stand-django-docker

## 运行虚拟环境

   

source ~/.virtualenv/django_blog/bin/activate

## 创建jango项目demosite

     django-admin startproject demosite
     cd demosite

## 在demosite项目创建一个名为polls的app

    python manage.py startapp polls

  
此时,在当前目录下会出现polls目录## 编辑polls/view.py增加如下代码

import json
import socket

from django.http import HttpResponse

def health(request):
    result = {'status':'ok'}
    result['host_name'] = socket.gethostname()

    return HttpResponse(json.dumps(result))

def home(request):
    result={'/':'home','health/':'health check', 'polls/':'url demo', 'polls/jsondemo':'json demo'}
    return HttpResponse(json.dumps(result))

## 新增polls/urls.py代码如下

from django.contrib import admin
from django.urls import path,include

from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('health', views.health, name='health'),
    path('admin/', admin.site.urls),
    path('polls/', include('polls.urls'))
]

## 在demosite下新增wiews.py代码如下

import json
import socket

from django.http import HttpResponse

def health(request):
    result = {'status':'ok'}
    result['host_name'] = socket.gethostname()

    return HttpResponse(json.dumps(result))

def home(request):
    result={'/':'home','health/':'health check', 'polls/':'url demo', 'polls/jsondemo':'json demo'}
    return HttpResponse(json.dumps(result))

## 修改demossite目录下的urls.py内容如下

from django.contrib import admin
from django.urls import path,include

from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('health', views.health, name='health'),
    path('admin/', admin.site.urls),
    path('polls/', include('polls.urls'))
]

## uwsgi启动服务-在项目根目录增加uwsugi.init文件内容如下

[uwsgi]
chdir=/root/demosite
module=demosite.wsgi
master=True
pidfile=/tmp/firestsite-master.pid
vacuum=True
max-requests=1000
daemonize=/var/log/demosite.log
http-socket = :8000
processes = 2


## 在项目根目录增加启动脚本start_uwsgi_server.sh内容如下

#!/bin/bash
cd /root/demosite/;uwsgi uwsgi.ini;tail -f /dev/null


## docker-在项目根目录增加基础镜像的DockerfileBaseImage文件内容如下:

FROM ubuntu:16.04
MAINTAINER yyy "[email protected]"
RUN apt-get update && apt-get install -y python3-pip uwsgi-plugin-python3 && pip3 install django==2.0.0 && pip3 install uwsgi

## docker-在项目根目录增加app镜像Dockerfile文件内容如下:

FROM bri/u1604-py3-django200-uwsgi:1.0
MAINTAINER yyy "[email protected]"
ADD . /root/demosite
CMD ["/bin/bash","/root/demosite/start_uwsgi_server.sh"]
EXPOSE 8000


## 阿里云 创建swarm集群
- 登录阿里云,选择容器服务,选择集群,选择创建Swarm集群
- 选择再华东2可用区b创建集群
- 新增实例 2台 1核1G的ecs
- 设置ecs的登录密码
- 保留eip
- 选择安装云监控插件
- 选择自动创建负载均衡
- 点击创建集群

## 阿里云 创建 镜像 registry
- 在容器服务选择 镜像与方案
- 选择镜像
- 选择 用户镜像
- 选择 新建镜像
- 创建镜像仓库。注意,容器服务的每一个应用对应一个镜像仓库,仓库设置好了之后,只存储不通版本号的同一个应用的镜像。这一点在阿里云的容器服务文档没有写明。比如,对于pytest这个应用,创建的镜像仓库可以命名 registry.cn-shanghai.aliyuncs.com/t-registry/standard-djanog-web-demo 
- 设置registry的登录密码

## 在本地安装docker,以ubuntu 16.04为例

    sudo apt-get update
    sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    sudo apt-get update
    sudo apt-get install docker-ce -y

## docker-构建基础镜像

docker build -t "bri/u1604-py3-django200-uwsgi:1.0" -f DockerfileBaseImage .

## docker-构建app镜像

docker build -t "bri/standart-django-demosite:1.0" .


## 登录远程registory

docker login --username=jjzsx registry.cn-shanghai.aliyuncs.com

需要密码。

## 打远程tag

docker tag 425bcb0c61c2 registry.cn-shanghai.aliyuncs.com/t-registry/standard-djanog-web-demo

## 推送镜像

docker push registry.cn-shanghai.aliyuncs.com/t-registry/standard-djanog-web-demo


## 阿里云 创建应用
- 容器服务,选择应用,选择集群,创建应用
- 设置 应用名称、应用版本、部署集群、更新测略、使用镜像创建
- 选择镜像,用户镜像,t-registry/standard-djanog-web-demo
- 选择版本,因为只提交了一个1.0,因此只有1.0版本,选择它
- 容器数量 选择2个
- restart 勾选always
- 端口映射 主机端口8000 映射 容器端口 8000
- 根据具体情况设置更多的参数
- 创建服务

## 阿里云 检查服务运行状态

集群两台宿主机11.13.6.18和16.1.17.12,在浏览器打开11.13.6.18:8000/health和16.1.17.12/health,能看到返回json是ok的,且主机名分别不同,表明两个服务都启动了且正常运行。

# 容器服务的路由配置

## 端口映射

第一种是端口映射。容器在宿主机中运行,容器的端口和主机的端口进行映射,那么,访问主机的端口,就会访问到容器的端口。

比如,swarm集群的两台ecs的ip地址是11.13.6.18和16.1.17.12。

配置端口映射,主机端口8000 --> 容器端口8000。那么,11.13.6.18:8000和16.1.17.12:8000都能访问。

端口映射的缺点,同一个服务有多台容器,如果用端口映射的接口,没有负载均衡,挂了就麻烦了。


## 简单路由配置

在http/https的7层协议负载均衡。[阿里云文档](https://help.aliyun.com/document_detail/25984.html?spm=5176.2020520152.203.88.278b16dd8sFq7H)最详细。

如果使用简单路由,可以按照如下方式配置

- 端口映射选项,主机端口是空的,不做配置,表示使用随机端口,容器端口是8000
- 简单路由配置选项,容器端口是8000,域名是http://pytest.jjzsx.com。
- 在云解析,给jjzsx.com增加一条A记录,主机记录是pytest,对应的ip地址是容器集群的负载均衡ip地址,也就是13.16.2.1。
- 然后点击右上角更新。
- 更新完毕,在浏览器打开http://pytest.jjzsx.com/,能看到json数据表明成功。

对简单路由的解释:浏览器访问 http://pytest.jjzsx.com/,根据dns,请求被 路由到 负载均衡 13.16.2.1,负载均衡 把请求转发 后端的两个ecs,后端两个ecs 把请求 转发 到了各自容器acsrouting服务,acsrounting服务知道pytest在两个ecs随机端口,把请求转发给ecs的随机端口,ecs的随机端口把请求转发给pytest的容器服务。在这个流程上,负载均衡,ecs,acsrouting,pytest服务,都是多点负载均衡,所以是安全的。

注意:在端口映射这块,也可以指定主机和容器的端口映射,但事倍功半,没什么好处,反而有不必要的麻烦。


## 自定义负载均衡配置
需要单独购买一个负载均衡,将容器端口端口和这个自定义负载均衡进行关联。

## 使用容器集群创建时的默认负载均衡创建监听

默认负载均衡,在创建时,会自动创建一个tcp:80到tcp:9080的监听,这个监听是负载均衡到容器集群ecs的。每个ecs的9080端口,实际上是ecs里的acsrouting在主机上的端口映射。

可以在负载均衡创建新的监听。比如:在容器集群启动服务pytest,这个服务有两个容器,分别部署再两台ecs上,这两个容器和ecs的端口映射都是8080。那么,在负载均衡上可以建议一个监听,监听端口是8001,后端服务器是集群的两台ecs,后端服务器的端口是8080(也就是pytest跟ecs的映射端口)。

当监听建立后,在浏览器访问负载均衡的ip和对应端口,也就是http://13.16.2.1:8001/health,多次刷新,能看到两个容器的host_name,这就表明服务是成功的。

猜你喜欢

转载自blog.csdn.net/u011539200/article/details/82910541
今日推荐