docker是现在比较流行的容器技术,被誉为轻量级的虚拟机。并且借助众多现有的镜像仓库能够快速构建各种小型服务器。这里我们就利用docker来实现一个简单的nginx反向代理与负载均衡。 由于本人使用的是Win10家庭版,只能使用Docker Toolbox。

1. 运用docker启动nginx

 启动Docker QuickStart Termimal:

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com


Start interactive shell

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$

 查看本地镜像:

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              cd6d8154f1e1        4 weeks ago         84.1MB

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$

发现没有nginx镜像,可以从docker hub中下载:相应的命令

docker search nginx # 搜索镜像
docker pull nginx  # 下载镜像

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker search nginx
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                                                  Official build of Nginx.                        9808                [OK]
jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker con…   1424                                    [OK]
richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable of…   618                                     [OK]
jrcs/letsencrypt-nginx-proxy-companion                 LetsEncrypt container to use with nginx as p…   423                                     [OK]
kong                                                   Open-source Microservice & API Management la…   230                 [OK]
wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
802b00ed6f79: Pull complete
5291925314b3: Pull complete
bd9f53b2c2de: Pull complete
Digest: sha256:9ad0746d8f2ea6df3a17ba89eca40b48c47066dfab55a75e08e2b70fc80d929e
Status: Downloaded newer image for nginx:latest

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              be1f31be9a87        4 days ago          109MB
ubuntu              latest              cd6d8154f1e1        4 weeks ago         84.1MB

下载好nginx后,我们来启动一下:相应的命令

docker run -d -p 8080:80 --name nginxdemo nginx #以nginx镜像启动容器
#参数说明 -d 以后台进程运行 -p 本地端口:容器端口 (端口映射) --name 容器名称
docker ps #显示当前运行的容器
wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker run -d -p 8080:80 --name nginxdemo nginx
77fdd6c77651fcc33386dfd12bc356e376725d45dc65b4f00f6fc93536707f7f

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
77fdd6c77651        nginx               "nginx -g 'daemon of…"   9 seconds ago       Up 8 seconds        0.0.0.0:8080->80/tcp   nginxdemo

现在访问一下: http://192.168.99.100:8080/  (注意此处显示的是虚机的ip地址)

运用docker与nginx实现简单的负载均衡-LMLPHP

这是在docker启动简单的nginx服务示例。

2. docker 的Volume技术

docker的volume是卷的挂载技术,可以简答的理解为共享目录,这样的好处有两点:1. 在宿主机改动文件的同时能够同步到容器中 2. 容器关闭后数据不会丢失

一般我们启动容器后,进入容器的办法:

docker exec -it nginxdemo /bin/bash #进入容器终端
wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker exec -it nginxdemo /bin/bash
root@77fdd6c77651:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@77fdd6c77651:/#

现在我们先停止之前的容器,然后以挂载目录的方式启动容器:

docker stop nginxdemo # 停止当前运行的容器
docker rm nginxdemo # 删除容器
docker run -d -p 8080:80 --name nginx1 -v 虚机目录:容器目录 nginx
wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
77fdd6c77651        nginx               "nginx -g 'daemon of…"   25 minutes ago      Up 25 minutes       0.0.0.0:8080->80/tcp   nginxdemo

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker stop nginxdemo
nginxdemo

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker rm nginxdemo
nginxdemo
wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker run -d -p 8080:80 --name nginx1 -v $PWD/data/nginx/html:/usr/share/html nginx
D:\Program Files\Docker Toolbox\docker.exe: invalid reference format: repository name must be lowercase.
See 'D:\Program Files\Docker Toolbox\docker.exe run --help'.

 这里发现不行,错误显示不能不能包含大写字母。其中$PWD表示当前路径。既然不行,上网查了一下,发现windows下docker启动在一个虚机上,默认为default,需要运用VirtualBox进入虚机,设置共享目录,才能实现目录挂载。

准备共享目录:D:\docker 专门存放需要共享的文件。

打开virtualBox进入虚机Default:

运用docker与nginx实现简单的负载均衡-LMLPHP

 然后配置共享文件:

运用docker与nginx实现简单的负载均衡-LMLPHP

接下来挂载共享文件夹: 

运用docker与nginx实现简单的负载均衡-LMLPHP

 此时发现D:\docker下的文件也出现在/mnt/docker/下了。

接下来我们再来重新实现以下docker的目录挂载:

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker run -d -p 8080:80 --name nginx1 -v /mnt/docker/nginx/nginx1/html:/usr/share/nginx/html -v /mnt/docker/nginx/nginx1/conf.d:/etc/nginx/conf.d nginx
bb7b4e54169aa5c2744332950e52696373ae598601d3a2efe991b6da239beb1a

这次正常启动了,我们先将index.html中 内容改一下:

<html>
	<h1> 这是nginx1</h1>
</html>

访问: http://192.168.99.100:8080/ 

运用docker与nginx实现简单的负载均衡-LMLPHP

 接下来我们实现nginx的反向代理与负载均衡。

2. Nginx反向代理与负载均衡

先分别启动其他两个nginx服务器:映射的端口分别为8081与8082.

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker run -d -p 8081:80 --name nginx2 -v /mnt/docker/nginx/nginx2/html:/usr/share/nginx/html -v /mnt/docker/nginx/nginx2/conf.d:/etc/nginx/conf.d nginx
e2b9346c9d0e189cf38c986589d7c2240c3f89c2eee847fc69ee1412ad3820b2

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker run -d -p 8082:80 --name nginx3 -v /mnt/docker/nginx/nginx3/html:/usr/share/nginx/html -v /mnt/docker/nginx/nginx3/conf.d:/etc/nginx/conf.d nginx
d4facf299dc222c7ef4ba90b6e7bf9218db561f401fe2baa8e1fcf08cca425d9

为了区分,我们分别将nginx2与nginx3的index.html中的内容设置为: 

<html>
	<h1>这是nginx2</h1>
</html>
<html>
	<h1>这是nginx3</h1>
</html>

然后更改nginx1容器中的nginx的配置,默认更改/etc/nginx/conf.d/default.conf中的文件即可,这里只更改nginx1中的文件

# 这里定义的是服务器组
upstream wbh{
	server 192.168.99.100:8081; #这里设置的容器映射对应的ip地址与端口
	server 192.168.99.100:8082;
}


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; # 启动路径
   #}
	location / {
		proxy_pass http://wbh; # 反向代理
	}

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

进入到nginx1容器中,重新加载nginx:

wbh@wubinghai MINGW64 /d/Program Files/Docker Toolbox
$ docker exec -it nginx1 /bin/bash
root@bb7b4e54169a:/# nginx -s reload
2018/10/07 09:21:57 [notice] 21#21: signal process started
root@bb7b4e54169a:/#

然后我们再来访问:http://192.168.99.100:8080/

运用docker与nginx实现简单的负载均衡-LMLPHP

发现此时显示的是nginx2的页面,但访问者显示的url却依然是nginx1的地址 ,这就是反像代理:即目标服务器对访问者透明。然后我们再刷新一下,会发现显示变成了nginx3的页面,这其实就是最简单的负载均衡,代理服务器nginx1会以轮询的方式将客户的请求转发到nginx2和nginx3服务器上,这一过程对客户透明。

运用docker与nginx实现简单的负载均衡-LMLPHP

 

 

有了docker,以后就不用再费力用Vmware去装虚拟机了,不但能够节约捉襟见肘的资源,还能够提高运行效率。

10-07 17:37