目 录CONTENT

文章目录

docker安装与简单的分布式项目搭建

FatFish1
2024-12-09 / 0 评论 / 0 点赞 / 76 阅读 / 0 字 / 正在检测是否收录...

docker概述

docker - 容器技术的优秀应用,通过命令简单启动一个虚拟容器,从而提供项目运行的虚拟环境,通过一个容器就可以完成一个项目的部署和管理,而多个容器在一个物理节点上启动,可以实现互不干涉的部署和管理

kubernetes(k8s) - 容器云是以容器为资源分割和调度的基本单位的,封装整个软件运行时环境,为开发者和系统管理员提供用于构建、发布、运行分布式应用的平台。kubernetes基于docker构建,目的就是提供容器之间的资源共享与隔离、网络、存储、集群、高可用等相关能力,使一个云服务可以快速被搭建起来。说白了k8s是一个容器组的管理方案

与k8s相似的docker应用是docker-compose,也比较好用

docker安装与简单的分布式项目搭建

docker安装

使用如下命令安装docker,别用snap install,因为snap的安装了没法执行systemctl restart docker命令,也不能配置mirror

apt install docker

可以通过以下命令确认docker安装情况,如果没有root权限可以要加sudo申请权限

docker info
docker version

启动一个最简单的容器

使用以下命令启动一个最简单容器:

docker run ubuntu echo “Hello World”

在容器中启动一个ubuntu系统的镜像,command部分是输出Hello World,输出完成后就会销毁容器。

启动一个服务栈

构造一个redis集群+Django+haproxy+ubuntu的服务栈

下载服务栈镜像

使用docker pull依次下载redis、Django、haproxy、ubuntu,如果因为网络问题下载不动,可以考虑修改下镜像源:

etc/docker目录下面创建daemon.json文件

sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ]
}
EOF
// 重启daemon守护进程和docker
systemctl daemon-reload
systemctl restart docker
这里如果restart不生效,可以先stop再start
systemctl stop docker.socket
systemctl stop docker
systemctl start docker
// 查看镜像源生效
docker version

依次启动服务

redis部署

首先在目录里面创建redis.conf文件,内容如下:

# /opt/tycloud/redis/master/data/redis.conf
daemonize yes  # 保持redis后台启动
pidfile /var/run/redis.pid

# /opt/tycloud/redis/slave-1/data/redis.conf
daemonize yes
pidfile /var/run/redis.pid
slavefor master 6379  # 配置从属redis的主从关系

# /opt/tycloud/redis/slave-2/data/redis.conf
daemonize yes
pidfile /var/run/redis.pid
slavefor master 6379

使用如下命令启动

docker run -it -d --name redis-master -v /opt/tycloud/redis/master/data:/data redis /bin/bash
docker run -it -d --name redis-slave1 --link redis-master:master -v /opt/tycloud/redis/slave1/data:/data redis /bin/bash
docker run -it -d --name redis-slave2 --link redis-master:master -v /opt/tycloud/redis/slave2/data:/data redis /bin/bash

注意以下几个参数:

  • 使用-d代表启动一个守护进程让容器持续工作,否则启动redis后退出bash,没有指令的话,容器将自动exit0

  • 使用--link name:alias代表通信连接,配置后进入/etc目录执行cat hosts可以看到,增加了一行映射

  • /bin/bash是一个常用的命令,它的作用是启动一个交互式的Bash shell。Bash是一种常见的Unix shell,它提供了一个命令行界面,可以让用户与操作系统进行交互

启动后加载redis配置

redis-server /data/redis.conf

这里如果出现了memory overcommit相关异常,可以在master节点上面修改/etc/sysctl.conf文件,追加vm.overcommit_memory = 1追加命令如下:

cat >> sysctl << EOF 回车
vm.overcommit_memory = 1 回车
EOF 回车

同时直接执行:

sysctl vm.overcommit_memory=1

这样可以避免重启

redis配置并且加载conf后,可以通过如下方法验证:

# 进入master配置数据
docker exec -it masterid bash
redis-cli  # 启动redis控制台
set master isMaster
get master

# 在slave查询数据
docker exec -it slaveid bash
redis-cli
get master

Django部署

然后启动下面的服务

docker run -it -d --name APP1 --link redis-master:db -v /opt/tycloud/Django/App1:/usr/src/app django /bin/bash
docker run -it -d --name APP2 --link redis-master:db -v /opt/tycloud/Django/App2:/usr/src/app django /bin/bash

这里Django与redis-master进行绑定,同时挂载目录

Django是一个便捷开发python的框架,首先exec进容器,安装python的redis依赖,如果安装时出现了证书问题,可以使用--trusted-host把证书读失败的地址加上

pip install redis <--trusted-host pypi.python.org>

这样就可以直接使用python进行redis开发了,首先做个测试,在/etc/hosts里面找到--link命令对redis-master做的ip映射:

python
>> import redis
>> r = redis.Redis(host=”redis-master.ip”)
>> r.get(“master”)

成功获取到了前面redis-cli中set的值。

然后从Django中创建项目文件

cd /usr/src/app
mkdir dockerweb
cd /dockerweb
django-admin.py startproject redisweb
cd redisweb
python manage.py startapp helloworld

这样就基于Django构造出一个python项目框架,从宿主机进入对应的挂载目录后,编写python

vi views.py
from Django.shortcuts import render
from Django.http import HttpResponse

import redis
def hello(request):
    r = redis.Redis(host=’db’, db=0)
    return HttpResponse(r.get(“master”))

这里使用db代替挂载ip,省去了看host的流程,db是--link的时候给的别名

完成views.py后,修改几个配置文件

# vi ../redisweb/setting.py
# Application definition
INSTALLED_APPS = {
    ‘django.contrib.admin’,
    ……
    ‘django.contrib.staticfiles’,
    ‘helloworld’,
}

ALLOWED_HOSTS = [‘*’]  // 修改所有地址可访问

vi ../redisweb/urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
from helloworld.views import hello
urlpatterns = patterns(‘’,
    url(r’^admin/’, include(admin.site.urls)),
    url(r’^helloworld$’, hello),
)

完成后进入pod,python编译加载修改

cd /usr/src/app/dockerweb/redisweb
python manage.py makemigrations
python manage.py migrate

然后启动web项目,app1对应8001端口,app2对应8002

python manage.py runserver 0.0.0.0:8001

haproxy部署

docker run -it -d --name haproxy --link APP1:APP1 --link APP2:APP2 -p 6301:6301 -v /opt/tycloud /HAProxy:/tmp haproxy /bin/bash

启动haproxy容器后,进入宿主机挂载HAProxy目录,添加haproxy.cfg配置

global
	log 127.0.0.1 local0  # 日志通过本机输出,通过local0输出
	maxconn 4096  # 最大连接数
	chroot /usr/local/sbin  # 改变当前工作目录
	daemon  # 以后台形式运行haproxy
	nbproc 4  # 启动4个haproxy实例,但2.5以后这个不支持了,不可添加
	pidfile /usr/local/sbin/haproxy.pid  # pid文件位置
defaults
	log 127.0.0.1  local3  # 日志文件输出定向
	mode http  # {tcp/http/health} 设定启动实例的协议类型
	option dontlognull  # 设置haproxy不记录上级负载均衡发送的用于检测状态没有数据的心跳包
	option redispatch  # 当serverId对应的服务挂掉后,强制定向到其他健康服务器
	retries 2  # 最多重试2次认为服务不可用
	maxconn 2000  # 最大连接数
	balance roundrobin  # 负载均衡选项,roundrobin和source,前者是轮休,后者是固定转发
	timeout connect 5000ms  # 连接超时时间
	timeout client 50000ms  # 客户端连接超时时间
	timeout server 50000ms  # 服务端连接超时时间
listen redis_proxy
	bind 0.0.0.0:6301
	stats enable
	stats uri /haproxy-stats
	    server APP1 APP1:8001 check inter 2000 rise 2 fall 5  # 两个均衡节点
	    server APP2 APP2:8002 check inter 2000 rise 2 fall 5

进入haproxy容器,启动haproxy服务

docker exec -it --user root xxxx  # 注意这里指定用户,否则进去是haproxy用户没权限
cd /tmp
haproxy -f haproxy.cfg

如果要修改haproxy配置文件,需要先停止再重启

apt-get install psmisc
killall haproxy

验证

输入公网ip:6301/helloworld即可看到redis中配置的master的容器id

0

评论区