一、环境准备
1.VirtualBox安装CentOS7
https://blog.csdn.net/github_38313789/article/details/804675882.CentOS7安装Docker
https://blog.csdn.net/github_38313789/article/details/80468597
二、构建自定义的nginx镜像
1.我们去DockerHub上寻找Nginx相关的官方镜像版本号
2.自定义的Nginx的Dockerfile编写
$ sudo mkdir /root/mynginx //在root目录下创建mynginx目录
$ cd /root/mynginx //进入mynginx目录
$ sudo yum -y install vim* //为CentOS7安装vim编辑器(已安装可以不用执行)
$ vim Dockerfile //使用vim创建并编辑Dockerfile文件
在vim编辑器中输入如下代码
FROM nginx:stable-alpine
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]
按Esc后输入:wq保存并退出vim编辑器
3.编写最简单的nginx.conf
$ cd /root/mynginx //进入mynginx目录
$ vim nginx.conf //创建并编辑
在vim编辑器中输入如下代码
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;
upstream webapi{ server 192.168.1.23:8081; server 192.168.1.23:8082; server 192.168.1.23:8083; }
server {
listen 80; location / { proxy_pass http://webapi; } } }
按Esc后输入:wq保存并退出vim编辑器
4.根据我们自己编写的Dockerfile构建nginx镜像
进入mynginx目录,确保目录中有Dockerfile和nginx.conf两个文件
$ cd /root/mynginx
$ ls
构建nginx镜像,镜像名我定义为mynginx,注意最后有一个空格 和 点
$ docker build -t mynginx .
查看刚刚生成的镜像
$ docker image ls
三、构建自定义的.Netcore2.0环境镜像
1.Dockerfile编写
$ mkdir /root/mydotnet
$ vim Dockerfile
在vim编辑器中输入如下代码
FROM microsoft/aspnetcore:2.0
WORKDIR /publish
EXPOSE 5000
ENV ASPNETCORE_URLS http://*:5000
CMD ["dotnet"]
2.构建镜像
$ cd /root/mydotnet
$ docker build -t mydotnet .
四、编写一个返回Hello World!的WebApi
五、将项目发布的publish文件夹上传到CentoOS7上的/root目录中
1.右键打开SFTP
2.进入 root目录,确保等会上传的文件直接会上传到root目录下
3.直接将publish文件夹拖入此窗口就行了(但是得确保publish文件夹所在路径没有中文)
4.切换回CentOS7-64控制台,查看是是否上传成功
进入publish查看里面文件是否完整
六、使用docker-compose.yml运行多容器实现负载均衡
1.安装Docker Compose
1)官方安装文档
https://docs.docker.com/compose/install/#install-compose
2)安装步骤
运行此命令下载Docker Compose
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
将文件变为可执行文件
sudo chmod +x /usr/local/bin/docker-compose
测试安装是否成功
$ docker-compose --version
3)卸载compose的命令
$ rm /usr/loacl/bin/docker-compose
2.编写docker-compose.yml文件
$ cd /root/mydotnet
$ vim docker-compose.yml
在vim编辑器中输入下面代码
version: '3'
services:
webapi-01:
image: mydotnet
container_name: mydotnet-8081
restart: always
volumes:
- /root/publish:/publish
ports:
- "8081:5000"
command: dotnet Hello.dll
webapi-02:
image: mydotnet
container_name: mydotnet-8082
restart: always
volumes:
- /root/publish:/publish
ports:
- "8082:5000"
command: dotnet Hello.dll
webapi-03:
image: mydotnet
container_name: mydotnet-8083
restart: always
volumes:
- /root/publish:/publish
ports:
- "8083:5000"
command: dotnet Hello.dll
nginx:
image: mynginx
container_name: mynginx-container
restart: always
ports:
- "80:80"
3.开放宿主机(即CentOS7的)8081,8082,8083端口
$ systemctl start firewalld
$ firewall-cmd --zone=public --add-port=8081/tcp --permanent
$ firewall-cmd --zone=public --add-port=8082/tcp --permanent
$ firewall-cmd --zone=public --add-port=8083/tcp --permanent
$ firewall-cmd --reload
4.重启docker服务,关闭并移除所有容器,防止已启动的容器占用端口
$ service docker restart
$ docker stop $(docker ps -a -q)
$ docker rm $(docker ps -a -q)
5.运行Docker Compose
在docker-compose.yml所在目录执行命令
$ cd /root/mydotnet
你自己选择前台运行还是后台运行,我选择的是前台运行
出现下图界面表示3个.net项目实例和1个nginx实例,一共四个容器均运行成功$ docker-compose up //前台运行
$ docker-compose up -d //后台运行
6.测试使用nginx做负载均衡的3个dotnet项目实例是否可正常使用
$ ip addr
浏览器输入宿主机ip,F5刷新,每次都能出现Hello Worl!表示成功!
七、那到底nginx起作用了没有呢?下面我们来做个测试解答!
我们要测试是否nginx成功实现了负载均衡,
就是要看每次我们刷新浏览器发请求是否被nginx成功转发到不同的.net项目实例所在容器,
而这里我们是通过8081,8082,8083端口来区分不同实例。
因为我们在配置nginx.conf的时候 使用的是默认的轮询转发机制,
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除,
所以当请求来的时候,nginx每次都会将当次请求转发给不同的 .net项目实例。
那我们就将8082端口封掉,那么在nginx将请求转发到8082端口时会报错禁止访问,并且nginx会自动将请求再次转发到8083端口保证请求转发成功,则表示nginx实现了负载均衡起作用了!
实验步骤:
1.ctrl+c停止当前正在运行的4个容器
$ firewall-cmd --zone=public --remove-port=8082/tcp --permanent //关闭8082端口
$ firewall-cmd --reload //使上述命令生效
$ firewall-cmd --zone=public --query-port=8082/tcp //查询8082端口是否已经关闭
2.必须要重启Docker服务,否则启动Docker容器时会报错,详细原因参考
https://blog.csdn.net/tiandaochouqin99/article/details/77367912
$ service docker restart //重启Docker服务
$ docker stop $(docker ps -a -q) //关闭所有容器
$ docker rm $(docker ps -a -q) //移除所有容器,防止端口被占用
$ cd /root/mydotnet //进入docker-compose.yml所在文件夹
$ docker-compose up //运行docker compse
3.浏览器输入宿主机ip,并多次刷新页面进行测试
我们看到nginx的确将请求转发到8082端口了,只是失败了而已,所以至此我们证明了nginx起作用了