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服务示例。
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:
然后配置共享文件:
接下来挂载共享文件夹:
此时发现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/
接下来我们实现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/
发现此时显示的是nginx2的页面,但访问者显示的url却依然是nginx1的地址 ,这就是反像代理:即目标服务器对访问者透明。然后我们再刷新一下,会发现显示变成了nginx3的页面,这其实就是最简单的负载均衡,代理服务器nginx1会以轮询的方式将客户的请求转发到nginx2和nginx3服务器上,这一过程对客户透明。
有了docker,以后就不用再费力用Vmware去装虚拟机了,不但能够节约捉襟见肘的资源,还能够提高运行效率。