学习参考自部署.Net6项目到docker

linux配置

docker安装

请参考安装docker

安装.net6镜像

  1. docker pull mcr.microsoft.com/dotnet/aspnet:6.0

创建webapi目录

创建/wwwroot/myproject,将web api程序文件存放在此目录下

  1. mkdir -p /wwwroot/myproject

开放webapi端口

web api预使用8001端口,需要对外开放8001端口,端口配置步骤如下:

防火墙相关命令

  1. # 查看防火墙状态
  2. systemctl status firewalld
  3. # 启动防火墙
  4. systemctl start firewalld
  5. # 重新启动防火墙
  6. firewall-cmd --reload
  7. # 关闭防火墙命令:
  8. systemctl stop firewalld

开放端口

  1. firewall-cmd --zone=public --add-port=8001/tcp --permanent
  2. # 建议同时设置开放portainer的8090端口
  3. firewall-cmd --zone=public --add-port=8090/tcp --permanent

重启防火墙

  1. firewall-cmd --reload
  • 命令含义:
    – zone #作用域
    – add-port=1935/tcp #添加端口,格式为:端口/通讯协议
    – permanent #永久生效,没有此参数重启后失效

    查看端口状态

    1. firewall-cmd --query-port=8001/tcp
    1657700103798.png
    yes 表示已开启 no表示未开启
    配置好开放的端口后,建议重新关闭并停止防火墙服务。
    1. systemctl stop firewalld

    .net程序

    新建webapi

    【1】新建.net6 mvc或webapi项目;

    Dockerfile

    【2】在mvc或webapi项目的根目录下创建Dockerfile文件,并设置为始终复制; ```bash

    See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

添加.net6基础镜像

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base

容器工作目录

WORKDIR /app

可注释EXPOSE EXPOSE

EXPOSE 80 EXPOSE 443

拷贝发布目录下的所有文件到容器的工作根目录

COPY . . (这样写也可以)

COPY ./ ./

如果用System.SqlClient.dll访问数据库,需要加这一句

RUN sed -i ‘s/TLSv1.2/TLSv1.0/g’ /etc/ssl/openssl.cnf

容器入口点

ENTRYPOINT [“dotnet”, “WebApp1.dll”]

  1. <a name="MTbGC"></a>
  2. ### 发布程序包
  3. ![1657699101217.png](https://cdn.nlark.com/yuque/0/2022/png/12561771/1657699105703-70d02406-c228-449a-8634-a28cbc89d22a.png#clientId=u2e952665-d7ab-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=547&id=u2aab3696&margin=%5Bobject%20Object%5D&name=1657699101217.png&originHeight=547&originWidth=1072&originalType=binary&ratio=1&rotation=0&showTitle=false&size=21801&status=done&style=none&taskId=u3c431e61-8abf-44cb-bfcc-9089fd20879&title=&width=1072)<br />将发布后的mvc或webapi项目拷贝到centos服务器的某个文件夹,例如拷贝到之前创建好的/wwwroot/myproject文件夹;<br />![1657699151568.png](https://cdn.nlark.com/yuque/0/2022/png/12561771/1657699157097-0c02e3d5-3fdf-4427-83cf-f6f38f51d0c9.png#clientId=u2e952665-d7ab-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=364&id=u27b4dbdf&margin=%5Bobject%20Object%5D&name=1657699151568.png&originHeight=364&originWidth=402&originalType=binary&ratio=1&rotation=0&showTitle=false&size=21378&status=done&style=none&taskId=ub9f96802-9ee5-41ee-9258-fcbde8014cb&title=&width=402)
  4. <a name="N7Hkr"></a>
  5. ## docker部署
  6. <a name="vYbRc"></a>
  7. ### 构建镜像
  8. 进入到centos服务器的 /wwwroot/myproject 目录,构建一个镜像,镜像名格式为【镜像名:版本号】,比如:dotnet6-demo:0.0.1
  9. ```bash
  10. cd /wwwroot/myproject
  11. docker build -t dotnet6-demo:0.0.1 .

:::warning

  • dotnet6-demo 表示构建的镜像名称,
  • :0.0.1表示镜像版本号,注意镜像名后面有个空格 + 英文点号,表示构建当前路径下的文件 :::

    创建自定义网络

    默认网络docker0,它不能用域名访问,所以要创建自定义网络。

    1. docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

    参数说明: :::warning

  • —driver bridge #表示桥接模式

  • —subnet 192.168.0.0/16 #16表示最多支持65535个ip,可以分配192.168.0.2到192.168.255.255,如果没有指定—subnet参数默认网段为172.17.0.0/16,默认网关为172.17.0.1;
  • —subnet 192.168.0.0/24 #24表示最多支持254个ip,可以分配192.168..0.2到192.168.0.255
  • —gateway #表示docker容器的网关 ::: mynet表示网络名。在docker 中直接 run 创建容器时不加自定义的网络,默认使用网络名为bridge的网络,这是docker0网络,容器之间无法使用容器名相互ping通,只能通过ip相互ping通。
    我们自己定义的网络,容器之间是可以直接通过容器名相互ping通的

    1. docker network inspect mynet

    创建并运行容器

    创建容器格式: :::warning docker run -d —name 容器名 -p 外部端口号:docker容器端口号 —restart=always -v /宿主机目录 : /容器目录 镜像名 ::: 使用自定义网络创建容器(多了个 —net 参数)

    1. docker run -d --name my-dotnet6-demo01 -p 8001:80 --restart=always -v /www-appdata/dotnet6-demo/logs:/logs -v /www-appdata/dotnet6-demo/upload:/upload --net mynet dotnet6-demo:0.0.1

    使用默认网络 docker0 创建容器(生产环境不推荐):

    1. docker run -d --name my-dotnet6-demo01 -p 8001:80 --restart=always -v /www-appdata/dotnet6-demo/logs:/logs -v /www-appdata/dotnet6-demo/upload:/upload dotnet6-demo:0.0.1

    参数说明: :::warning

  • -d #后台运行

  • -p 8001:80 #缩主机端口号:docker端口号
  • -v #数据卷路径,格式:-v /宿主机目录:容器目录)或者(-v /容器目录),可以带多个 -v 参数。
  • —restart=always #dokcer重新启动时也将容器自动启动
  • —net mynet #指定网络名 :::

    查看容器

    1. docker ps

    进入容器

    1. docker exec -it my-dotnet6-demo01 /bin/bash

    设置容器开机自启

    1. docker update --restart=always 容器名字

    取消容器开机自启

    1. docker update --restart=no 容器名字

    访问容器Web API

    访问方式:http://linux宿主机ip:端口号(8001)
    http://192.168.234.133:8001
    5248c5386ed49e2e4f938cbe20ac14f.png