第一步: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个文件构成:
- conf.d:用户自己定义的conf配置文件
- sites-available:系统默认设置的配置文件
- sites-enabled:由sites-available中的配置文件转换生成
- 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