第九节:docker部署船员项目实操(单节点部署、多节点负载均衡部署、多服务器部署)

一. 环境准备

1. 环境

   服务器:阿里云的 Centos Stream 9.0

   数据库:SQLServer 2014  (位于单独的DB服务器)

   docker环境:27.5.1

 

2  必备镜像

   nginx:最新版

   dotnet:

  mcr.microsoft.com/dotnet/aspnet:9.0

       mcr.microsoft.com/dotnet/sdk:9.0

PS: 上述镜像可以事先下载

 

二. 需求说明

1 案例1

   将船员项目的:2前端+1个Api  都采用docker的方式部署 

   A. Api采用docker容器,自托管的模式部署,端口8003

      镜像名称:crewship1

      容器名称:crewship1_container1

   B. 前端均采用docker中nginx容器部署,船员系统端口8001、船员后台管理端口8002 (1个nginx容器)

      nginx容器名称:crewship1_nginx1

 

2 案例2

 使用docker部署3个API,然后使用nginx负载均衡轮询策略,将请求转发到前面的3个Api端口,然后再部署2个前端项目

   A.  Api部署3个docker容器,服务器的对外端口分别为:8203、8204、8205,至于容器内部的运行端口统一为8203   (意味一个镜像即可,然后基于该镜像启动3个容器)

      镜像名称:crewship3

      3个容器名称:crewship3_container1 、crewship3_container2、crewship3_container3

   B. 新建1个nginx的docker容器,部署两个前端项目,船员系统端口8201、后台管理端口8202

       容器名称:crewship3_nginx1

   C. 新建1个nginx的docker容器,用来负载均衡,监听8208端口,转发请求到8203、8204、8205上,前端项目调用的都是8208端口

       容器名称:crewship3_nginx2

 

 

三. 案例1-实操

1 API部署

(1) 创建目录

   在root目录下新建crewship1文件夹,用来存放api项目和前端项目

  【mkdir /root/crewship1】

(2) 制作“可移植+项目依赖”的发布包,Dockerfile文件如下

#1.依赖两个基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:9.0
FROM mcr.microsoft.com/dotnet/sdk:9.0

#2.制作人
LABEL maintainer="ypf <ypf@qq.com>"

#3.指定程序运行的端口(也可以在项目中通过UseUrls指定, 或者发布容器的时候通过--env ASPNETCORE_URLS=xxx动态指定) 
ENV ASPNETCORE_URLS=http://*:8003

#4.容器对外暴露的端口
EXPOSE 8003

#5.指定默认工作目录
WORKDIR /crewApi

#6. 将当前目录(Dockerfile文件下)的所有文件拷贝到镜像的crewApi工作目录下
COPY . /crewApi/

#7.启动容器的时候执行shell命令:dotnet webapi1.dll,即运行该项目
ENTRYPOINT ["dotnet", "YpfCore.AdminWeb.dll"]

(3)  制作镜像

【docker build -t crewship1 .】

 

(4) 发布容器

【docker run -id --name crewship1_container1 -p 8003:8003 crewship1】  推荐采用下面步骤

扩展---推荐:

容器中的内容无法编辑,这里将配置文件appsettings.json,进行一下数据挂载,挂载在 /root/crewship1/conf/appsettings.json ,下面是新指令

  A. 【touch /root/crewship1/conf/appsettings.json】 创建挂载文件

  B   去发布包中把appsettings.json中的内容复制到这个文件里  【特别注意:不能空文件挂载,必须保证和容器中的文件内容一致,才能启动成功

  C   宿主机目录为:/root/crewship1/conf/appsettings.json , 容器目录根据上述Dockerfile文件,根目录为crewApi,所以 /crewApi/appsettings.json

docker run -id --name crewship1_container1 \
-p 8003:8003 \
-v /root/crewship1/conf/appsettings.json:/crewApi/appsettings.json \
crewship1

 

2 前端部署

(1) 创建nginx的挂载目录 

【mkdir -p /root/crewship1/nginx/conf /root/crewship1/nginx/html /root/crewship1/nginx/logs】

【touch /root/crewship1/nginx/conf/nginx.conf】

 

(2) 修改挂载目录下的配置文件

   /root/crewship1/nginx/conf/nginx.conf

注意:root 对应的路径,必须写容器内的路径/usr/share/nginx/html,不能写挂载路径  (详见上述2中的挂载指令中找路径即可)

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    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;

    #web项目
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html/website;   #此处必须是容器内的路径/usr/share/nginx/html,不能写挂载路径
            index  loginIndex.html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    #管理后台项目
     server {
        listen       8002;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html/background_website;   #此处必须是容器内的路径/usr/share/nginx/html,不能写挂载路径
            index  index.html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

(3) 需要把两个前端项目复制到 /root/crewship1/nginx/html

 

(4) 创建nginx容器

  nginx容器需要挂载两个前端项目,所以需要开发容器的两个端口,这里分别为:80、8002 ,然后和宿主机的 8001、8002 端口进行关联

docker run -d \
--name crewship1_nginx1 \
-p 8001:80 \
-p 8002:8002 \
-v /root/crewship1/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /root/crewship1/nginx/html:/usr/share/nginx/html \
-v /root/crewship1/nginx/logs:/var/log/nginx \
nginx

 

(5) 测试

    访问8001端口 、8002端口,均能正常访问两个前端项目。

 

 

四. 案例2-实操

1 API部署

(1) 创建目录

   在root目录下新建crewship3文件夹,用来存放api项目和前端项目

  【mkdir /root/crewship3】

 

(2) 制作“可移植+项目依赖”的发布包

A. Dockerfile文件如下

容器内部的运行端口统一为8203 

#1.依赖两个基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:9.0
FROM mcr.microsoft.com/dotnet/sdk:9.0

#2.制作人
LABEL maintainer="ypf <ypf@qq.com>"

#3.指定程序运行的端口(也可以在项目中通过UseUrls指定, 或者发布容器的时候通过--env ASPNETCORE_URLS=xxx动态指定) 
ENV ASPNETCORE_URLS=http://*:8203

#4.容器对外暴露的端口
EXPOSE 8203

#5.指定默认工作目录
WORKDIR /crewApi

#6. 将当前目录(Dockerfile文件下)的所有文件拷贝到镜像的crewApi工作目录下
COPY . /crewApi/

#7.启动容器的时候执行shell命令:dotnet webapi1.dll,即运行该项目
ENTRYPOINT ["dotnet", "YpfCore.AdminWeb.dll"]

B 配置跨域代码

  appsetting.json中的跨域改为允许8201、8202 端口过来的请求,虽然从8208转发过来的,但根源是 8201、8202

(3)  制作镜像

【docker build -t crewship3 .】

 

(4) 发布容器--需要挂载配置文件

【docker run -id --name crewship3_container1 -p 8203:8203 crewship3】 

【docker run -id --name crewship3_container2 -p 8204:8203 crewship3】 

【docker run -id --name crewship3_container3 -p 8205:8203 crewship3】 

推荐采用下面步骤,进行挂载:

容器中的内容无法编辑,这里将配置文件appsettings.json,进行一下数据挂载,挂载在 /root/crewship1/conf/appsettings.json ,下面是新指令

  A. 创建挂载目录和文件

sudo mkdir -p \
/root/crewship3/conf/8203 \
/root/crewship3/conf/8204 \
/root/crewship3/conf/8205 \
&& sudo touch \
/root/crewship3/conf/8203/appsettings.json \
/root/crewship3/conf/8204/appsettings.json \
/root/crewship3/conf/8205/appsettings.json

  B   去发布包中把appsettings.json中的内容复制到上述3个appsettings.json这个文件里 

  特别注意:不能空文件挂载,必须保证和容器中的文件内容一致,才能启动成功

  C   宿主机目录为:/root/crewship3/conf/8203/appsettings.json , 容器目录根据上述Dockerfile文件,根目录为crewApi,所以 /crewApi/appsettings.json

8203容器

docker run -id --name crewship3_container1 \
-p 8203:8203 \
-v /root/crewship3/conf/8203/appsettings.json:/crewApi/appsettings.json \
crewship3

8204容器 

docker run -id --name crewship3_container2 \
-p 8204:8203 \
-v /root/crewship3/conf/8204/appsettings.json:/crewApi/appsettings.json \
crewship3

8205容器 

docker run -id --name crewship3_container3 \
-p 8205:8203 \
-v /root/crewship3/conf/8205/appsettings.json:/crewApi/appsettings.json \
crewship3

 

 

2 Nginx负载均衡部署

(1) 创建nginx的挂载目录 

【mkdir -p /root/crewship3/nginx_balance/conf /root/crewship3/nginx_balance/html /root/crewship3/nginx_balance/logs】

【touch /root/crewship3/nginx_balance/conf/nginx.conf】

 

(2) 创建nginx容器

  nginx容器用来接收前端项目的请求,监听8208端口,转发请求到8203、8204、8205

docker run -id \
--name crewship3_nginx1 \
-p 8208:8208 \
-v /root/crewship3/nginx_balance/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /root/crewship3/nginx_balance/html:/usr/share/nginx/html \
-v /root/crewship3/nginx_balance/logs:/var/log/nginx \
nginx

 

(3) 修改挂载目录下的配置文件

   /root/crewship3/nginx_balance/conf/nginx.conf

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    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;
    upstream myApiTest {
          server 60.205.120.80:8203;
          server 60.205.120.80:8204;
          server 60.205.120.80:8205;
    }

    server {
        listen       8208;
        server_name  localhost;
        location / {
             proxy_pass http://myApiTest;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

 

(4) 关闭容器,然后重新打开

【docker stop crewship3_nginx1】

【docker start crewship3_nginx1】

PS: 之前nginx.conf中是空的,所以直接创建容器的时候无法启动,这里重新start一下即可。

 

(5) 测试

  多次访问 http://60.205.120.80:8208/  地址,都能正常访问,说明负载均衡成功

 

3 前端部署

(1) 创建nginx的挂载目录 

【mkdir -p /root/crewship3/nginx/conf /root/crewship3/nginx/html /root/crewship3/nginx/logs】

【touch /root/crewship3/nginx/conf/nginx.conf】

 

(2) 拷贝两个前端项目到 /root/crewship3/nginx/html 下

 

(3) 修改挂载目录下的配置文件

   /root/crewship3/nginx/conf/nginx.conf

注意:root 对应的路径,必须写容器内的路径/usr/share/nginx/html,不能写挂载路径  (详见上述2中的挂载指令中找路径即可)

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    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;

    #web项目
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html/website;   #此处必须是容器内的路径/usr/share/nginx/html,不能写挂载路径
            index  loginIndex.html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    #管理后台项目
     server {
        listen       8202;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html/background_website;   #此处必须是容器内的路径/usr/share/nginx/html,不能写挂载路径
            index  index.html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

 

(4) 创建nginx容器

  nginx容器需要挂载两个前端项目,所以需要开发容器的两个端口,这里分别为:80、8202 ,然后和宿主机的 8201、8202 端口进行关联

docker run -d \
--name crewship1_nginx2 \
-p 8201:80 \
-p 8202:8202 \
-v /root/crewship3/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /root/crewship3/nginx/html:/usr/share/nginx/html \
-v /root/crewship3/nginx/logs:/var/log/nginx \
nginx

 

(5) 测试

    访问8201端口 、8202端口,均能正常访问两个前端项目。

    http://60.205.120.80:8201/

    http://60.205.120.80:8202/

 

 

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2025-03-11 15:51  Yaopengfei  阅读(94)  评论(1)    收藏  举报