【愚公系列】2023年01月 Docker容器 .NET Core应用在Docker中的部署

举报
愚公搬代码 发表于 2023/01/31 21:40:38 2023/01/31
【摘要】 前言Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。.NET 7是微软最新发布的.NET版本,跟前面版本相比速度更快、支持热更新、支持http3、QUIC等特征,包含了很多网络安全新特性。本文介绍如何把.NET...

前言

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

.NET 7是微软最新发布的.NET版本,跟前面版本相比速度更快、支持热更新、支持http3、QUIC等特征,包含了很多网络安全新特性。本文介绍如何把.NET 7快速部署到Docker。

Docker官网:https://www.docker.com/

在这里插入图片描述

一、.NET Core应用在Docker中的部署

1.创建应用

1、创建一个.NET 7的项目

在这里插入图片描述
2、创建项目时,在“其他信息”选项中选择“启用Docker”。创建项目后会自动生成一个Dockerfile文件,这个文件就是创建Docker镜像的配置文件。Dockerfile文件也是必要条件,微软官方已经给你配置好了

在这里插入图片描述
2、运行应用

可以看到单个应用运行成功了
在这里插入图片描述

二、执行生成镜像命令

这边以Ubuntu系统为例进行部署

1.复制项目文件并生成镜像

把整个项目文件复制到ubuntu系统中,在项目目录执行如下命令

docker build -t dotnet7 -f Dockerfile . --network=host
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["WebBaweiDocker.csproj", "."]
RUN dotnet restore "./WebBaweiDocker.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "WebBaweiDocker.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WebBaweiDocker.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebBaweiDocker.dll"]

在这里插入图片描述

结果会提示成功信息:
在这里插入图片描述
输入如下命令查看镜像

docker images

在这里插入图片描述

2.运行镜像

镜像创建完成后就可以创建并运行容器了。默认是80端口,我们这里指定外网访问5000端口(-p 5000:80),容器名称是dotnet7

docker run --name=dotnet7 -p 5000:80 -d dotnet7

在这里插入图片描述

在这里插入图片描述

三、Docker相关知识点

1、dockerfile常用命令解析

1、FROM
基础镜像,FROM 命令必须是 Dockerfile 的首个命令
也就是继承那个镜像
2、LABEL
为镜像生成元数据标签信息
原有指令 MAINTAINER 已经放弃使用,用 LABEL maintainer=“你的邮箱” 替代
3、USER
指定运行容器时的用户名或 UID,后续 RUN 也会使用指定用户
4、VOLUME
定义匿名卷,容器运行时应该尽量保持容器存储层不发生写操作,为了防止运行时用户忘记将动态文件保存的目录挂载为卷,可以事先指定某些目录挂载为匿名卷。这样就不会向容器存储层写入大量数据
5、WORKDIR
用于设置 CMD 指明的命令的运行目录
为后续的 RUN、CMD、ENTRYPOINT、ADD 指令配置工作目录。可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。使用 docker exec -it 进入容器后,默认也会进入到 WORKDIR 指定的目录
容器启动时的⼯作⽬录
6、ENV
指定容器启动时的环境变量(注意,只有在容器启动时,启动脚本能读取到,如果希望其他用户登录到容器也生效的话,需要写入 .bashrc)
设置镜像内的环境变量
7、COPY
COPY 命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统
8、EXPOSE
指定端口转发
9、CMD
设置容器创建是执行的默认命令
支持三种格式,默认会被 docker run 指定的参数覆盖。每个容器只能执行一条 CMD 命令。执行的命令和参数当指定多个时,只有最后一个起效
CMD [“executable”, “参数1”,“参数2”]:使用 exec 方式执行,推荐
CMD command 参数1 参数2:shell 方式执行
CMD [“参数1”,“参数2”]:提供给 ENTRYPOINT 做默认参数
启动容器时执行的shell命令
10、ENTRYPOINT
指定容器的“入口”
支持两种格式,默认不会被 docker run 指定的参数覆盖。可以指定 --entrypoint 参数去覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效
ENTRYPOINT [“executable”, “参数1”,“参数2”]:使用 exec 方式执行
推荐 - ENTRYPOINT command 参数1 参数2:shell 方式执行
指定容器启动脚本
11、HEALTHCHECK
Docker 1.12版本后引入的判断容器运行状态是否正常
12、 ADD
将⼯作⽬录下的某个⽬录或者⽂件copy到镜像的某个路径下
13、ARG
构建环境的环境变量
14、RUN
RUN 命令是 Dockerfile 执行命令的核心部分。它接受命令作为参数并用于创建镜像。每条 RUN 命令在当前基础镜像上执行,并且会提交一个新镜像
执⾏shell 命令

2、build 命令用于使用 Dockerfile 创建镜像

语法
docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
–build-arg=[] :设置镜像创建时的变量;
–cpu-shares :设置 cpu 使用权重;
–cpu-period :限制 CPU CFS周期;
–cpu-quota :限制 CPU CFS配额;
–cpuset-cpus :指定使用的CPU id;
–cpuset-mems :指定使用的内存 id;
–disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
–force-rm :设置镜像过程中删除中间容器;
–isolation :使用容器隔离技术;
–label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
–memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
–no-cache :创建镜像的过程不使用缓存;
–pull :尝试去更新镜像的新版本;
–quiet, -q :安静模式,成功后只输出镜像 ID;
–rm :设置镜像成功后删除中间容器;
–shm-size :设置/dev/shm的大小,默认值是64M;
–ulimit :Ulimit配置。
–tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
–network: 默认 default。在构建期间设置RUN指令的网络模式
实例
使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。
docker build -t runoob/ubuntu:v1 .
使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。
docker build github.com/creack/docker-firefox
也可以通过 -f Dockerfile 文件的位置:
$ docker build -f /path/to/a/Dockerfile .

3、run 创建一个新的容器并运行一个命令

语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

OPTIONS说明:

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-p: 端口映射,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

–name=“nginx-lb”: 为容器指定一个名称;

–dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

–dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h “mars”: 指定容器的hostname;

-e username=“ritchie”: 设置环境变量;

–env-file=[]: 从指定文件读入环境变量;

–cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

–net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

–link=[]: 添加链接到另一个容器;

–expose=[]: 开放一个端口或一组端口

实例

使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

docker run --name mynginx -d nginx:latest

使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。

docker run -P -d nginx:latest

使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

docker run -p 80:80 -v /data:/data -d nginx:latest

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。