.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

 

posted @ 2023-06-02 11:24  皓月青峰  阅读(240)  评论(0编辑  收藏  举报