aspNetCore +Linux+Docker +nginx 部署

第一步:Linux服务器安装Docker容器

            常用命令:sudo apt install Docker (Ubuntu)

                             sudo nmp install docker (centOS)

          Docker的官方文档:https://docs.docker.com/

1.开始安装:首先执行命令安装所需的包:sudo yum install -y yum-utils \device-mapper-persistent-data \lvm2

2.设置稳定的存储库:sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo

3.安装:sudo yum install docker-ce

4.启动:sudo systemctl start docker

5.验证是否成功: sudo docker version

6.安装结果:

这里是官方安装过程:https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce-1

参考 文档:https://www.runoob.com/docker/ubuntu-docker-install.html

安装.Net Core

参考资料::https://www.cnblogs.com/noahji/p/8947151.html

我们要运行.Net Core的项目,自然要安装.Net Core的环境啦。这里微软提供了大部分Linux版本的安装方案,我使用的是Ubuntu16.04,所以以下代码是针对这个系统版本的,如果你使用的是其他版本可以参考(https://docs.microsoft.com/en-us/dotnet/core/linux-prerequisites?tabs=netcore2x

// 注册微软产品Key为被信任的
$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
$ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg

// 设置所需要的版本主机包
$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
// APT支持Https
$ sudo apt-get install apt-transport-https
$ sudo apt-get update

// 安装.Net Core SDK
$ sudo apt-get install dotnet-sdk-2.0.3

// 检查安装是否成功
$ dotnet --version

Net 5.0

wget https://packages.microsoft.com/config/ubuntu/21.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb

sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-5.0

官网

https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu

发布测试项目

 创建Demo

因为是Demo项目,所以就在用户根目录下创建一个文件夹,将该文件夹作为项目的根目录。

5.1 创建项目

$ cd ~/
$ mkdir helloworld
$ cd helloworld
$ dotnet new mvc

5.2 发布项目

$ dotnet restore
$ dotnet publish -c Release

5.3 运行发布好的程序

通过上面的截图我们发现,发布完的程序和在PC平台上的差不多,是在bin/Release的目录下。我们先移动到这个目录,然后用"dotnet"命令运行这个Demo

$ cd bin/Release/netcoreapp2.0/publish/
$ dotnet helloworld.dll

执行命令以后,终端会如上图所示。这个时候就说明程序已经跑起来了。倒数第二行则说明了,程序默认的端口号是5000。这个时候我们就可以通过服务器IP+端口号5000访问这个网站了。(注:如果是外网访问,需要在防火墙打开5000端口的权限。这个就不在本文中扩展了。)

笔者是通过开启另一个终端来测试程序是否正常的,结果如下:

// 通过wget请求网站
$ wget http://localhost:5000

守护进程部署

走到这一步,有不少同学就发现了。现在的程序是需要我们始终打开终端才能保证网站可以被访问的,那接下来我们要做的就是将这个网站部署成一个自定义服务。让网站可以在后台进程中运行。

6.1 准备运行目录

按照Linux部署习惯,我们在var目录下创建一个www文件夹,并将刚才发布的Demo放到该目录下

$ cd /var
$ sudo mkdir www
$ cd www
$ sudo mkdir helloworld
$ cd helloworld
$ sudo cp -r ~/helloworld/bin/Release/netcoreapp2.0/publish/* .

6.2 创建服务配置文件

$ cd /etc/systemd/system/
$ sudo touch dotnet-helloworld.service

6.3 编写服务配置文件

$ sudo vi dotnet-helloworld.service

先通过vi进入该文件(注:vi是Linux下最常用的文本编辑器之一,如果对vi不了解,可以自行百度,这里就不扩展了)。进入编辑后,将以下代码写入配置文件

[Unit]
Description=DotNet Core HelloWorld Running on Ubuntu

[Service]
WorkingDirectory=/var/www/helloworld                             // 工作目录,这里我们写的是刚才创建的网站工作目录
ExecStart=/usr/bin/dotnet /var/www/helloworld/helloworld.dll     // 服务的实际执行命令
Restart=always
RestartSec=10
SyslogIdentifier=dotnet-example
User=root                                                // 已docker_user的身份启动
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

上面这段配置文件我是参考微软官方的部署文档写的(文档链接

6.4 启动服务

$ sudo systemctl enable dotnet-helloworld.service
$ sudo systemctl start dotnet-helloworld.service

$ sudo systemctl restrat dotnet-hellowrld.service

6.5 检查服务状态

$ sudo systemctl status dotnet-helloworld.service

删除服务

sudo update-rc.d ServiceName remove

sudo rm dotent.service:

还有一个比较好用的命令,查看**端口:

sudo netstat -lnp | grep ** 

sudo lsof -i:5000

查看启动那些服务

service --status-all

杀死进程

sudo kill -9 (PID)

sudo update-rc.d ServiceName remove

给工作目录权限  sudo chmod 777

以上如果不好用 可以采用一下方法

安装  supervisor

sudo apt-get install supervisor

安装完成之后,在 /ect/supervisor/conf.d/ 目录下新建一个配置文件(touch HelloWebApp.conf),取名为 HelloWebApp.conf

打开HelloWebApp.conf (vim HelloWebApp.conf),写入如下命令:

[program:HelloWebApp]
command=dotnet HelloWebApp.dll  #要执行的命令
directory=/home/yxd/Workspace/publish #命令执行的目录
environment=ASPNETCORE__ENVIRONMENT=Production #环境变量
user=www-data  #进程执行的用户身份
stopsignal=INT
autostart=true #是否自动启动
autorestart=true #是否自动重启
startsecs=1 #自动重启间隔
stderr_logfile=/var/log/HelloWebApp.err.log #标准错误日志
stdout_logfile=/var/log/HelloWebApp.out.log #标准输出日志

配置好以后 (:wq保存退出),需要重新加载一下配置

sudo supervisorctl shutdown && sudo supervisord -c /etc/supervisor/supervisord.conf

或者你可以直接重启 Supervisor:

sudo service supervisor stop
sudo service supervisor start

Supervisor 常用命令

supervisorctl shutdown #关闭所有任务

supervisorctl stop|start program_name

supervisorctl status #查看所有任务状态

//查看具体错误

sudo supervisorctl tail mywebapp stderr

遇到问题

问题一:unix:///var/run/supervisor/supervisor.sock no such file

解决方案

sudo chmod 777 /run

sudo chmod 777 /var/log

问题二:Unlinking stale socket /var/run/supervisor/supervisor.sock

解决方案

unlink /var/run/supervisor/supervisor.sock

问题三:Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.

ps aux | grep supervisord

kill - 9 进程ID

卸载:

sudo apt purge supervisor

whereis supervisord

查找supervisord在哪

root@jdu4e00u53f7:~# whereis supervisord
supervisord
: /usr/local/bin/supervisord

rm -rf /usr/local/bin/supervisord

Nginx反向代理

做到这里,.Net Core项目的部署已经差不多了。接下来我们就通过Nginx进行反向代理。

 

 

 安装Nginx

// 安装命令
$ sudo apt-get install nginx

// 完成安装后检查安装是否成功
$ nginx -v

 配置反向代理

 

最新版本nginx配置是由4个文件构成:

  1. conf.d:用户自己定义的conf配置文件
  2. sites-available:系统默认设置的配置文件
  3. sites-enabled:由sites-available中的配置文件转换生成
  4. nginx.conf:汇总以上三个配置文件的内容,同时配置我们所需要的参数

// 移动到Nginx配置文件夹
$ cd /etc/nginx/conf.d/

// 创建代理配置文件
$ sudo touch helloworld.conf

// 编辑配置文件
$ sudo vi helloworld.conf

// 配置内容
server {
    listen 80;

location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

// 测试配置
$ sudo nginx -t

// 重新加载配置
$

sudo nginx -s reload

来自 <https://www.cnblogs.com/noahji/p/8947151.html#step_7>

注:这里有一个小坑,Nginx有一个默认配置文件,文件路径在:/etc/nginx/sites-available下。文件名是default。如果访问的时候打开的不是上面这个网站,那需要到这个配置文件下,把所有的配置都注释掉,再重新reload一下Nginx。

当完成这一步后,我们就可以在浏览器里直接输入服务器的IP地址来访问Demo网站了。

以上参考地址:https://www.cnblogs.com/noahji/p/8947151.html

安装docker

 https://blog.csdn.net/weixin_30784945/article/details/94980579?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.21.3001.4242

第一步 卸载

8.1 卸载旧版本Docker

因为Ubuntu系统可能自带Docker,所以在安装新版Docker前先将旧版的Docker清楚干净

$ sudo apt-get remove docker \
docker-engine \
docker.io

 

 

1. 删除某软件,及其安装时自动安装的所有包

sudo apt-get autoremove docker docker-ce docker-engine  docker.io  containerd runc

2. 删除docker其他没有没有卸载

dpkg -l | grep docker

  dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P # 删除无用的相关的配置文件

3.卸载没有删除的docker相关插件(结合自己电脑的实际情况)

 

 

sudo apt-get autoremove docker-ce-*

4.删除docker的相关配置&目录

 sudo rm -rf /etc/systemd/system/docker.service.d
 sudo rm -rf /var/lib/docker

5.确定docker卸载完毕

docker --version

来自 <https://www.cnblogs.com/shmily3929/p/12085163.html>

 

 

# step 1: 安装必要的一些系统工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

# step 2: 安装GPG证书 curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# Step 3: 写入软件源信息 sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

 

# Step 4: 更新并安装Docker-CE sudo apt-get -y update sudo apt-get -y install docker-ce

#最后测试是否安装成功

docker version

sudo systemctl start docker

sudo systemctl enable docker

systemctl status docker

直接在项目目录下添加Dokerfile,这里没有用自带的doker支持

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base #.net 5基础镜像,很明显没有了那个core WORKDIR /app #设置工作目录

COPY . /app #这里是将当前目录下的文件拷贝到 镜像 /app 目录下面 ##EXPOSE 8586 #暴露出去的端口,这里我们通过程序里面监听不使用这个配置 ##使用国内镜像源

 # 用gdi+绘制的功能就需要安装这个包支持

RUN apt-get update && apt-get install -y libgdiplus && apt-get clean && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll # 运行 CMD命令

ENTRYPOINT ["dotnet", "FtCap.Mvc.Web.dll"]

docker build -t dockerdemo001 .

 #(注意最为英文句号,表示在当前目录下搜索Dockerfile文件),如果没有报错基本就创建成功了

docker images

 #检查一下看看名称是否对如果是 none就解决问题删了重来 ,删除 docker rmi <ID>

 

-t ---指定镜像名称 小写

命令结尾处 . ---表示build上下文为当前目录,默认情况下docker会使用在上下文的根目录下找到Dockerfile文件

启动容器

docker run --name dockerdemowww -p 8586:8585 -d dockerdemo001 #如果没有报错基本上没啥问题

参数分解:

-d ,表示在后台以守护态(daemonized)形式运行容器

-p 外部端口与内部容器端口映射。外部端口:内部端口

--name 指定容器的名称。当然可以不指定,默认会为我们创建

最后一个参数 dockerdemo001 就是我们刚创建的镜像名称

查看并运行发布的程序

docker ps #查看正在运行的docker容器,如果有说明已经启动成功,没有看看 docker ps -a ,是否存在,存在尝试 docker start <容器名称> 启动
#测试请求网站,如果成功就完成了docker上的部署
curl -i "http://127.0.0.1:8586"
#外网访问开放防火墙端口
ufw allow 8586

局域网访问,成功!

资料地址:https://www.cnblogs.com/daxiongblog/p/14293833.html

容器开机启动

在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启:

docker run --restart=always

如果已经启动了则可以使用如下命令:

docker update --restart=always <CONTAINER ID>

查看日志

 

docker logs --since 30m 容器ID

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值