.net core 及 pgsql 在 Docker 中部署运行
.net core 及 pgsql 在 Docker 中部署运行
当前运行linux 系统为 : CentOS Stream release 8
.net sdk 7.0、pgsql 12.0 、nginx 1.14.1、docker 24.0.1
在安装前,建议更新系统中依赖包:
sudo yum update
本次所用到的工具主要有:
1、docker:学习;
2 、postgresql 数据库;
3、dotnetcore:SDK环境;
4、.net core 7.0 连接pgsql 的小项目;
5、nginx:服务器代理;
一、docker 学习
Docker 安装运行基础指令:
//按装指令
sudo yum install -y docker-ce docker-ce-cli containerd.io
//启动 docker
sudo systemctl start docker 或 service docker start
//重启 docker
sudo systemctl restart docker 或 service docker restart
//停止 docker
sudo systemctl stop docker 或 service docker stop
//卸载 docker-ce
sudo yum remove docker-ce
//设置开机docker 自启
systemctl enable docker
//查看 docker 版本
docker --version 或 docker -v
//删除安装包
yum remove docker-ce
//删除所有镜像,容器、docker 配置等
rm -rf /var/lib/docker
docker 验证
// 拉取镜像 hello-world 默认已经存在 sudo docker pull hello-world // 执行hello-world sudo docker run hello-world //如果执行之后,控制台显示如下信息,则说明Docker安装和启动成功: [root@user]# docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly. ........
docker 常用指令
//查看容器的挂载配置 docker inspect 容器名称/ID //拉取镜像 docker pull 镜像名 //查看正在运行的容器 -a 查看所有容器: docker ps //进入容器,然后输入 ls 查看所有文件,cd <dir> 可进入子目录 docker exec -it [容器Id/名称] /bin/bash //将容器中的 /wwwroot 目录拷贝到主机 /home/docker/carnieHtml docker cp carnie:/wwwroot /home/docker/carnieHtml //实时查看容器运行日志 docker logs -f [容器Id/名称]
//查看docker network 自定义网络,容器与主机之间相互发现和通信
docker network ls
liunx 常用指令
// 防护墙增加开放端口 sudo iptables -A INPUT -p tcp --dport [端口号] -j ACCEPT
// 防火墙禁用端口 sudo iptables -A INPUT -p tcp --dport [端口号] -j DROP
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports //查看端口规则
// 重启防火墙 sudo systemctl restart firewalld // 查看所有进程及端口 netstat -tulpn
//查看指定端口进程
netstat -tunlp | grep 80
//结束进程
kill -9 进程号
//Linux查看版本当前操作系统发行版信息
cat /etc/issue
cat /etc/redhat-release
//重启系统
reboot
二、docker 下安装 pgsql
2.1 安装postgres
//拉取pgsql 12.0版本的镜像 sudo docker pull postgres:12
//运行 postgres:12
docker run --name pgsql -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD=123456 -v /home/pgdata:var/lib/postgresql/data -d postgres:12-d 将以分离模式运行此容器,以便它在后台运行。
--name 是我们用来创建容器的名称。
-p 会将 PostgreSQL 容器端口 5432 绑定到主机上 5432 端口。127.0.0.1:5432 主机对外访问地址。
-v 将容器中 (/var/lib/postgresql/data) 内的数据库文件夹挂载到(/home/pgdata)
-e 设置环境变量。在这种情况下,PostgreSQL 根密码。
//启动 pgsql
docker start pgsql
2.2 重置 pgsql 管理密码
//进入pgsql 容器 docker exec -it pgsql /bin/sh //登录 pgsql psql -U postgres //修改postgres 登录密码为 654321, 注意需要 ; 结束 ALTER USER postgres WITH PASSWORD '654321';
//通过navicat 修改管理员密码,运行sql ALTER USER postgres WITH PASSWORD '654321'
三、.net core 程序 docker 运行
测试用的 .net core 项目使用的是.net 7.0 + pgsql,请自行准备一个小项目进行发布,可在项目下创建 build.cmd,然后双击执行编译打包;
del /F /S /Q app
dotnet publish -c Release -v m -o .\app
3.1 .net 运行环境安装
//查看现linux 下.net SDK版本 dotnet --list-sdks
//查看现liunx 下 .net runtimes 运行时版本
dotnet --list-runtimes
// 安装.net 的sdk 或 运行时,Sdk 是包含运行时
sudo yum install dotnet-sdk-6.0
sudo yum install dotnet-runtime-6.0
//卸载不需要的skd或运行时
sudo yum remove dotnet-runtime-6.0
sudo yum remove dotnet-sdk-6.0
//由于.net 7 SDK还没提供标准镜像,需从微软官方下载安装
//参考地址:https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-centos
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-7.0
//指定.net 运行sdk,由于服务器上安装了多个 .net 运行时。需要对项目提定运行时。在项目源码目录执行以下指令,会产生一个 global.json 文件
dotnet new globaljson --sdk-version 6.0.18
3.2 .net 项目准备
用vs 打开 .net 项目,在项目中 右键 -> 添加 -> Docker 的支持,会生成一个Dockerfile的文件,默认的信息比较多,目前我就来个最简单的精简版
#运行低包,指定项目的运行环境,这个不要修改
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
#容器中运行的工作目录,会在容器中创建 app 文件夹
WORKDIR /app
#容器要开放的端口,主机访问容器的端口,可以忽略,后期运行时 通过 -p 指定 EXPOSE 5182
#COPY . . 表示将主机Dockerfile 所在文件夹的所有内容,复制到镜像(WORKDIR) /app 目录下
#copy ./app . 表示将主机 Dockerfile 所在相对目录 app 复制到镜像 WORKDIR
COPY . .
#修改 donet 程序默认运行端口为 5182
ENV ASPNETCORE_URLS=http://*:5182
#dotnet 运行程序时,指定 urls 及端口
ENTRYPOINT ["dotnet", "Taichuan.Carnie.Web.dll","--server.urls","http://*:5182"]
3.3 .net 项目打包镜像
首先将 .net 编译后的程序及 Dockerfile 上传到服务器,然后 cd 到对应的目录。
//在打包前建议验证一下dotnet 程序是否要运行,然后访问一下是否正常 dotnet Carnie.Web.dll --urls "http://*:5182"
//打包.net 镜像,测试用的项目 docker build -t carnie . //查看镜像文件列表 docker images //删除镜像 docker rmi 镜像名称/Id
3.4 运行.net 项目镜像
//创建静态资源目录 mkdir /home/docker/carnieHtml mkdir /home/docker/carnieHtml/logs
// -v 挂载多个目录:(挂载后容器目录下的文件不会释放拷贝到主机,相当于将目录 link) // 将容器中的 /app/wwwroot 挂载到主机 /home/docker/carnieHtml 目录 // 将容器中的 /app/logs 挂载到主机 /home/docker/carnieHtml/logs 目录 // --name carnie 表示创建的容器名称 // -p 127.0.0.1:5182:5182 将容器的 5182 端口,隐射到主机 127.0.0.1:5182 端口 // carnie:latest 表示 carnie 镜像名称,latest 镜像 tag docker run --name carnie -v /home/docker/carnieHtml:/app/wwwroot -v /home/docker/carnieHtml/logs:/app/logs -p 127.0.0.1:5182:5182 carnie:latest //启动net 项目容器 docker start carnie //检查是否正常 curl 127.0.0.1:1582
3.5 修改已运行的容器挂载(慎用)
在特殊情况当容器运行后需要在次挂载目录,可以通过xftp 进入 /var/lib/docker/containers/容器Id.
//以下操作我暂未做过验证,有空的时候可以验证一下; //在修改配置文件前,先停止 docker 服务: service docker stop
//修改配置文件,请跟据内容进行修改 config.v2.json 修改 MountPoints hostconfig.json 修改 Binds //修改完后成后启动docker service docker start
四、nginx 网关绑定
4.1 nginx 安装
//安装nginx 指令 yum -y install nginx //nginx 默认使用 80 端口,把防火墙 80 端口开放 firewall-cmd --zone=public --add-port=80/tcp --permanent //重启防火墙 systemctl restart firewalld.service //查看防火墙开放的端口 firewall-cmd --list-all
//开机自动启动
systemctl enable nginx
安装完后,可通过服务器 IP 进行访问: http://129.153.60.192/
4.2 nginx 配置
//查看 nginx 配置文件位置 nginx -t
//新建文件 default.conf,上传到 /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name carnie.mz9.net;
location /
{
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:5182;
}
}
配置保存后重启 nginx
//重启 nginx service nginx restart
sudo systemctl restart nginx
打开浏览器访问:carnie.mz9.net
4.3 nginx 异常处理
//查看日志指令 tail -f /var/log/nginx/error.log //异常信息 2023/06/20 07:33:24 [crit] 267489#0: *1 connect() to 127.0.0.1:5180 failed (13: Permission denied) while connecting to upstream............. //处理方法 setsebool -P httpd_can_network_connect 1 //Redhat从FC3开始,就使用了SELinux来增强安全,如果想要关闭,需要修改/etc/selinux/config文件中的SELINUX=”" 为 disabled ,然后重启。
演示地址:http://pinyin.mz9.net/
五、pm2 的运行.net 程序
5.1 nodejs 的安装
//下载 node,指定版本参考: https://nodejs.org/dist/
wget https://nodejs.org/dist/v14.15.1/node-v14.15.1-linux-x64.tar.xz
//解压 node 到 /usr目录 tar xvf /root/node-v14.15.1-linux-x64.tar.xz -C /usr
//创建node 及 npm 软连接
ln -s /usr/node-v14.15.1-linux-x64/bin/node /usr/local/bin/node
ln -s /usr/node-v14.15.1-linux-x64/bin/npm /usr/local/bin/npm
//强制覆盖试软连接
ln -sf 源地址 目标地址
unlink 取消软连接
//通过 npm 全局安装 pm2
npm i pm2 -g
//创建 pm2 软连接
ln -s /usr/node-v14.15.1-linux-x64/bin/pm2 /usr/local/bin/pm2
//设置Pm2 开机启动
pm2 startup
pm2 save
pm2 -v 查看版本
5.2 pm2 运行.net core 程序
先将程序上传到服务器,在根目录下新增一个 app.json 文件,内容如下:
{ "apps": [ { "name": "pinyin", "script": "dotnet Pinyin.Web.dll", "env": { "ASPNETCORE_ENVIRONMENT": "Development", "ASPNETCORE_URLS": "http://+:5180" } } ] }
//进入程序目录执行运行
pm2 start app.json