解决使用docker搭建nginx负载均衡的一系列问题

使用docker搭建nginx负载均衡

一、环境

  • 我用到的是win10家庭版系统,之前在网上了解到,win10专业版系统才有Hyper-v,因此可以用win10专业版的一套安装方法。但是我的是wn10家庭版系统,因此也就要去考虑使用其他办法。

这里我用的是docker toolbox,安装后,通过Docker Quickstart Terminal来连接docker。
安装好后,连接docker.
解决使用docker搭建nginx负载均衡的一系列问题_第1张图片

二、镜像加速

我们镜像加速首先想用daocloud镜像市场来进行加速,但是加速后效果非常不好,于是采用了下面这种方式。

  • 使用网易的镜像加速
    进到docker主机中(这里是名为default的虚拟机系统)
vi /etc/docker/daemon.json
//daemon.json是docker安装后默认没有daemon.json这个配置文件,需要进行手动创建。配置文件的默认路径:/etc/docker/daemon.json一般情况,配置文件 daemon.json中配置的项目参数,在启动参数中同样适用,有些可能不一样(具体可以查看官方文档),但需要注意的一点,配置文件中如果已经有某个配置项,则无法在启动参数中增加,会出现冲突的错误。
//然后在文件中增加网易的加速地址
{
"registry-mirrors":["http://hub-mirror.c.163.com"]
}
  • 之后在Docker Quickstart Terminal中docker-machine restart default.重启docker主机。

三、nginx安装并使用

  1. 安装nginx
    首先,拉取官方镜像
docker pull nginx
  1. 使用nginx的默认配置来启动
docker run --name nginx-test -p 8081:80 -d nginx

四、使用nginx搭建负载均衡

  • 这里用到了三个容器
  • 实现思路:建立三个节点,一个作为负载均衡,另外两个作为后端服务器。我们这里起名nginx-test-web和nginx-test-web3作为后端服务器,nginx-test-loadbalancer作为负载均衡器。端口号分别为8082、8083、8084

1. 配置nginx-test-web
  • 首先创建目录nginx和3个子目录,用于存放后面的文件。
 mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf
 //~代表当前用户的home目录,因此可以到当前windows系统下查看

解决使用docker搭建nginx负载均衡的一系列问题_第2张图片
这里有个关键点:windows下必须使用绝对路径而不是相对路径

//拷⻉容器内 Nginx 默认配置⽂件到刚才创建的 conf ⽬录,可以输⼊ docker ps 命令
//这是之前的命令
docker cp 3fea44f03762[替换成⾃⼰的容器ID]:/etc/nginx/nginx.conf ~/nginx/conf
//改为这个命令
docker cp 3fea44f03762[替换成⾃⼰的容器ID]:/etc/nginx/nginx.conf  C:\Users\WZW0926\nginx/nginx/conf 
  • 下面来部署Docker
docker run -d -p 8082:80 --name nginx-test-web -v ~/nginx/www:/usr/share/nginx/html -v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx/logs:/var/log/nginx nginx
#这是一个命令...
  • 后面就可以修改自己的主页了
cd ~/nginx/www

创建index.html,

vi index.html

按i进入编辑模式,并输入以下内容





nginx-8082


 

我的第⼀个标题

我的第⼀个段落。

然后就可以在浏览器中访问了
解决使用docker搭建nginx负载均衡的一系列问题_第3张图片

2、配置第二台和第三台nginx容器
  • 同样创建目录
mkdir -p ~/nginx3/www ~/nginx3/logs ~/nginx3/conf
mkdir -p ~/nginx4/logs ~/nginx4/conf
  • cp
docker cp 3fea44f03762[替换成⾃⼰的容器ID]:/etc/nginx/nginx.conf C:/Users/WZW0926/nginx3/conf
docker cp 3fea44f03762[替换成⾃⼰的容器ID]:/etc/nginx/nginx.conf C:/Users/WZW0926/nginx4/conf
  • 部署docker
docker run -d -p 8083:80 --name nginx-test-web3 -v ~/nginx3/www:/usr/share/nginx/html -v ~/nginx3/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx3/logs:/var/log/nginx nginx
docker run -d -p 8084:80 --name nginx-test-loadbalancer -v ~/nginx4/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx4/logs:/var/log/nginx nginx

然后修改nginx-test-web3的主页

  • 进入www目录
cd ~/nginx3/www
vi index.html

编辑以下内容





nginx-8083


 

我的第个标题

我的第个段落。

然后,在浏览器同样也能看到此页面
解决使用docker搭建nginx负载均衡的一系列问题_第4张图片

  • 下面就是重头戏了!搭建负载均衡

我们之前已经部署了nginx-test-loadbalancer,下面我们修改他的nginx.conf文件内容,路径为C:\Users\用户名\nginx4\conf下。
在nginx.conf中的http节点下加入upstrean节点

upstream backend { #backend为⾃定义名字
  #ip_hash; #开启则代表⽤ip地址的形式来分配,可解决session问题
  server 192.168.99.100:8082 weight=1; #weight越⼤,权重越⾼,被分配的⼏率越⼤
  server 192.168.99.100:8083 weight=1; #本次实验全部在本机,因此⽤了本地的ip,只要相应换成对应的ip或者域名即可
}

下面再在http节点下加入server节点

server {
    location / {
        root html;
        index index.html index.htm;
        proxy_pass http://backend; #backend为之前在nginx.conf中upstream后定义的名字
    }
}

最后,保存退出,重启服务器

docker restart nginx-test-loadbalancer

下面,我们到浏览器里访问,但是、、、、、
无法连接到服务器,服务器拒绝了我们的请求

看到这里,我觉得配置是没有问题的,那问题出现在哪儿呢?

问题解决
  • 我们先到nginx4下查看配置文件nginx.conf
    然后发现了问题…
    解决使用docker搭建nginx负载均衡的一系列问题_第5张图片
    这里写道,.conf文件还有nginx下的conf.d下的所有配置文件,而且!我们在这发现,没有server节点(如果我们不进行配置的话)
    那,咋办!
    下面我们进到容器里面看看吧,我们这都是用的第一个nginx的配置文件,而且第一个使用的是nginx的默认配置,我们进到那个容器里面看看。
  • 进入容器

这里有个很大的坑,我之前从网上看到,/etc/nginx/conf.d,但是,我一直在docker主机(名为default的虚拟机)中去找,找了好久没找到,之后才想明白,这是容器的配置文件,为什么不进容器里看看呢

docker exec -it nginx-test bash

在这里插入图片描述
然后到etc/nginx下看看
在这里插入图片描述
!我们在这里,看到了conf.d,终于。
而之前,我们仅仅看到了nginx.conf文件。
下面,我们看看conf.d下的文件吧
在这里插入图片描述
果然,我们这里看到了default.conf,这也是一个配置文件
解决使用docker搭建nginx负载均衡的一系列问题_第6张图片
千呼万唤试出来
看到了我们的server节点,所以,我们server配置到这儿,才会生效。

  • 下面删掉之前的nginx-test-loadbalancer,我们重新配置!
  • 首先在~/nginx4下新建confd文件夹,然后把default.conf挂载
docker cp 3fea44f03762[替换成⾃⼰的容ID]:/etc/nginx/conf.d /c/Users/WZW0926/nginx4/confd
  • 下面新建docker容器
docker run -d -p 8084:80 --name nginx-test-loadbalancer -v  /c/Users/WZW0926/nginx4/conf/nginx.conf:/etc/nginx/nginx.conf -v /c/Users/WZW0926/nginx4/confd:/etc/nginx/conf.d  nginx   
  • 接着修改default.conf文件
    加入upstream节点
upstream backend {
   server 192.168.99.100:8082 weight=1; 
   server 192.168.99.100:8083 weight=1; 
}
#这里ip换成自己的

server中的location

 location / {
       root   /usr/share/nginx/html;
       index  index.html index.htm;
       proxy_pass http://backend;
   }
  • 下面重启:docker restart nginx-test-loadbalancer

然后就可以了!

做到这,我也发现了另外一个问题:指导书中的空格有问题,导致我之前失败。
于是我又去nginx.conf里面试了试。
修改nginx.conf


user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
 upstream backend {
  server 192.168.99.100:8082 weight=1; 
  server 192.168.99.100:8083 weight=1; 
}
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
       proxy_pass http://backend;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }




}


    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

   # include /etc/nginx/conf.d/*.conf;
}

重启后,可以了
在这里插入图片描述
做到这里,我不尽想说,,,有时候,代码还是需要敲的,不是用来ctrl+v的…

记一次不堪的经历,20200524于凌晨

你可能感兴趣的:(docker,笔记)