通过上次,我们已经搭建起了ubuntu虚拟机的环境。现在我们在此环境上安装下Docker.
1、先创建一个非root用户。
sudo adduser docker_user
设置密码,其他信息直接默认。具体如下:
2、安装.netCore
wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb
安装SDK:
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
检查是否安装成功:
dotnet --version
3、创建应用程序
创建文件目录
sudo mkdir -p /data/sites/demo
// 修改文件夹访问权限
sudo chmod -R 777 /data
//sudo chmod a+rwx /data
//sudo chown -R docker-user:docker-user /data
创建MVC项目
cd ~/
cd /data/sites/demo
dotnet new mvc
查看文件夹下文件,已经有相关项目文件:
编译和发布程序
dotnet restore
dotnet publish -c Release
详细见下图:
查看发布目录下文件,已经生成,具体见下图:
运行已经发布的程序
cd bin/Release/net5.0/publish/
dotnet demo.dll
检查测试程序是否正常运行:
// 通过wget请求网站
wget http://localhost:5000
4、安装成守护进程
首先在var目录下创建www文件夹,并把发布好的应用程序放在该目录下:
sudo mkdir -p /var/www/demo
cd /var/www/demo
sudo cp -r /data/sites/demo/bin/Release/net5.0/publish/* .
拷贝之前发布的项目,具体见下图:
其次,创建服务配置文件
cd /etc/systemd/system/
sudo touch dotnet-demo.service
将创建服务定义文件dotnet-demo.service,具体见下图:
接着,编辑服务配置文件,具体命令如下:
sudo vi dotnet-demo.service
打开文件如下图:
进入编辑页面,输入以下内容,具体可以参考:
https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.1&tabs=aspnetcore2x,
https://swimburger.net/blog/dotnet/how-to-run-a-dotnet-core-console-app-as-a-service-using-systemd-on-linux 两个网址。注意中间的备注信息,格式不正确会影响到服务的正常部署。
[Unit]
Description=DotNet Core Demo Running on Ubuntu
[Service]
WorkingDirectory=/var/www/demo
# systemd will run this executable to start the service
ExecStart=/usr/bin/dotnet /var/www/demo/demo.dll
Restart=always
RestartSec=10
# to query logs using journalctl, set a logical name here
SyslogIdentifier=dotnet-example
# Use your username to keep things simple.
# If you pick a different user, make sure dotnet and all permissions are set correctly to run the app
# To update permissions, use 'chown yourusername -R /srv/HelloWorld' to take ownership of the folder and files,
# Use 'chmod +x /srv/HelloWorld/HelloWorld' to allow execution of the executable file
User=docker-user
# This environment variable is necessary when dotnet isn't loaded for the specified user.
# To figure out this value, run 'env | grep DOTNET_ROOT' when dotnet has been loaded into your shell.
# Environment=DOTNET_ROOT=/opt/rh/rh-dotnet31/root/usr/lib64/dotnet
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
编辑结束,按ESC 键 跳到命令模式,然后输入退出命令:
:wq
保存文件并退出vi 编辑。
注意:如果打开编辑无法保存,需要给当前用户赋当前文件夹权限,可以参考以下命令:
sudo chmod -R 777 /etc
当然,也可以使用别的方式编辑,比如是用vim编辑。
现在,可以启动服务了,具体命令如下:
systemctl daemon-reload
如果中间调整过服务定制文件,请使用下面命令重新加载:
sudo systemctl enable dotnet-demo.service
sudo systemctl start dotnet-demo.service
执行后命令窗体见下图:
启动服务有可能会报以下错误:
sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
原因是sudoers文件夹权限问题.具体解决办法如下:
pkexec chmod 555 /etc/sudoers
pkexec chmod 555 /etc/sudoers.d/README
最后,我们检查下我们安装好的服务状态:
sudo systemctl status dotnet-demo.service
服务启动过程中遇到的两个错误及解决办法:
1、code=exited, status=217/USER
用户配置错误,更改文件中的用户,重新加载,启动后正常。
2、code=exited, status=1/FAILURE
配置文件中动态库路径有错,调整后,重新加载,启动后正常。