.net core 及 pgsql 在 Docker 中部署运行

发布时间 2023-06-02 11:30:39作者: 皓月青峰

 

.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/名称]

  

 

  liunx 常用指令

// 防护墙增加开放端口
sudo iptables -A INPUT -p tcp --dport [端口号] -j ACCEPT 

// 防火墙禁用端口
sudo iptables -A INPUT -p tcp --dport [端口号] -j DROP 

// 重启防火墙
sudo systemctl restart firewalld

// 查看所有进程及端口
netstat -tulpn

//Linux查看版本当前操作系统发行版信息
cat /etc/issue
cat /etc/redhat-release



  

二、docker 下安装 pgsql

//拉取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.1 重置 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 版本
dotnet --list-sdks

// 安装.net 的sdk 或 运行时,Sdk 是包含运行时
sudo yum install dotnet-sdk-6.0
sudo yum install dotnet-runtime-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

 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 网关绑定

  这是略过nginx  的安装过程,网上有很多安装方式,配置 nginx 绑定域名访问 docker 容器中的 net 项目,端口号 5182

  xftp 进入 nginx 配置目录:/etc/nginx/conf.d/default.conf

 在配置文件中 追加以下绑定代码:
server{
        listen    80;
        server_name    carnie.mz9.net;
            location /
            {
	proxy_http_version 1.1;
	proxy_buffer_size 64k;
            	proxy_buffers   32 32k;
            	proxy_busy_buffers_size 128k;
                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

  打开浏览器访问:carnie.mz9.net


-------------------------------------------------------未完待续----------------------------------------------------------------------

如果您在阅读过程中,遇到一些问题,欢迎留言讨论。

未完待续……