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
评论区