第九节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。

浙公网安备 33010602011771号