目录
前言
🚀 云端部署新体验,C# Web API遇上Git Docker,828 B2B企业节特惠来袭!Flexus X实例,为您的C#应用提供强大支撑,结合Git版本控制与Docker容器化部署,实现代码高效管理与无缝迁移。即刻行动,让您的Web服务更加稳定、高效,领跑数字化转型之路!
🐳本实验深入演示了如何在Ubuntu环境中,利用Git进行版本控制管理代码,并通过Docker技术自定义构建镜像,从而实现项目从代码到应用的快速构建、打包与部署流程。这一流程不仅提升了开发效率,还确保了环境的一致性与可重复性。
环境准备
购买服务器配置
本次实验使用的是 Flexus云服务器X实例 服务器。
在性能设置中我选择了自定义模式,使用了4vCPUs | 12GiB,镜像我选用的是最高版本的ubuntu
打开xshell,使用购买的服务器的公网IP地址,和设置的密码,连接上我们的服务器。
项目部署
项目准备(Dockerfile文件)
我这里以c#为例,新建一个 .net8.0 的 Web API项目
这个新建的官网的webApi项目自带一个接口weatherforecast接口,可以获取到最近的天气,因为本篇主要目的是如何使用git+docker在服务器上发布,因此不做太多改动。本地启动一下,成功访问到,我们稍后将这个程序部署到服务器上。
因为我们后面采用Git方式来发布应用,因此在gitee上新建仓库,将代码上传上去。
在项目路径下新建一个Dockerfile文件,内容如下(根据自己的解决方案名称、构建环境,如.net 6.0、7.0等版本,亦或是其他语言,对以下代码就行调整,本部署方式适用于其他编程语言或其他版本的.net)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "WebApplication1.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]
这段Dockerfile用于构建一个ASP.NET Core应用程序的Docker镜像
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
:从Microsoft Container Registry (MCR) 拉取ASP.NET Core 8.0的官方运行时镜像作为基础镜像,并将其标记为base
。这个镜像包含了运行ASP.NET Core应用程序所需的一切,但不包含构建工具。
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
:从Microsoft Container Registry拉取ASP.NET Core 8.0的官方SDK镜像,用于构建应用程序。这个镜像包含了构建.NET应用程序所需的一切工具。
通过这种方式,Dockerfile利用了Docker的多阶段构建特性,确保了构建过程中只包含必要的工具(在构建阶段使用SDK,在最终镜像中仅包含运行时),从而减小了最终镜像的大小。
Git部署并拉取代码
安装Git
打开终端,然后输入以下命令来安装Git
sudo apt update
sudo apt install git
配置Git用户信息
在安装Git后,建议配置你的用户名和电子邮件地址。这些信息将用于你的Git提交,并帮助你识别代码更改的源头。
git config --global user.name "你的名字"
git config --global user.email "你的邮箱地址"
SSH密钥
虽然你可以通过HTTPS URL克隆仓库,但使用SSH密钥可以更安全地访问你的仓库。
检查是否已存在SSH密钥:
ls -al ~/.ssh
如果控制台输入结果像我一样
.ssh
文件夹是存在的,没有看到 id_rsa
和 id_rsa.pub
文件,说明没有包含任何SSH密钥。那么你需要生成一个新的SSH密钥对。
chmod 700 /root/.ssh
//更改 /root/.ssh 目录的权限,700 意味着只有目录的所有者
ssh-keygen -t rsa -b 4096 -C "你的邮箱地址"
命令执行后,它会询问你“Enter file in which to save the key (/root/.ssh/id_rsa):”,这是在询问你希望将生成的私钥保存在哪个文件中。默认情况下,它会建议你保存在 /root/.ssh/id_rsa
直接按回车键,它会接受默认的文件名 /root/.ssh/id_rsa
来保存私钥
接下来,会要求你输入一个密码(passphrase)来保护私钥。这是一个可选步骤,如果你不想设置密码,只需再次按回车键即可跳过此步骤
再次输入ls -al ~/.ssh,可以看到.ssh目录下已经生成id_rsa.pub等文件了。
输入以下命令,公钥内容将被输出到终端,然后我们复制这些内容。
cat /root/.ssh/id_rsa.pub
这里以gitee为例,我们将公钥添加到安全设置的SSH公钥中。
添加完成后我们就可以在控制台执行命令将我们的项目代码克隆下来了。
安装docker
Docker在Ubuntu上依赖一些软件包,需要先行安装。
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
添加Docker GPG密钥
这是为了验证从Docker仓库下载的软件包的完整性。
#官方 GPG key (可能国内访问会存在问题)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 阿里源(推荐使用)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
添加Docker官方软件源
接下来,需要将Docker的官方软件源添加到你的Ubuntu系统中。运行以下命令(根据你的Ubuntu版本,$(lsb_release -cs)
会自动替换为你的Ubuntu代号,如focal
、jammy
等):
#Docker官方源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#阿里apt源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
再次更新软件包列表
添加完软件源后,再次运行更新命令以确保你的软件包列表是最新的:
sudo apt update
sudo apt-get update
安装docker
#安装最新版本的Docker
sudo apt install docker-ce docker-ce-cli containerd.io
#查看Docker版本
docker version
#查看所有容器
docker ps -a
项目运行
构建镜像
cd到我们使用git拉下来的项目,如下,包含Dockerfile的目录下
执行命令构建一个新的 Docker 镜像
docker build -t auth .
构建成功后执行 docker images 查看镜像,如下我名称为auth的镜像已经构建完成。
运行容器
docker run -d -p 8080:8080 --restart=always --name auth auth
-d
: 这个标志表示以“分离模式”运行容器,也就是说,容器会在后台运行。你不会直接看到容器的输出,除非你使用 docker logs
命令或其他方法来查看。
-
p 8080:8080
: 这个参数用于端口映射。它将容器内的 8080 端口映射到宿主机的 8080 端口上。这样,任何发送到宿主机 8080 端口的请求都会被转发到容器的 8080 端口上。
--restart=always
: 这个参数指定了容器的重启策略。always
表示无论何时容器停止运行(无论是因为退出还是Docker守护进程重启),Docker 都会自动重启这个容器。
运行完成后可以执行docker ps 查看容器:
新增安全组
打开服务器控制台,找到我们当前的服务器,点击名称。
进去到详情后,切换到安全组页面,点击配置规则。
在入方向规则下,点击添加规则,然后加入我们项目的端口号。
访问接口
查看我们的服务器的ip地址
打开浏览器,访问我们项目的接口,成功获取到信息。
更新发布
接下来我们将接口调整一下,改为返回一个hello word!
提交代码
回到服务器控制台,执行 git pull 拉取最新代码
使用更新后的代码重新构建Docker镜像。运行与之前相同的docker build
命令
docker build -t auth .
停止并删除旧的容器。
docker stop auth
docker rm auth
使用更新后的镜像启动一个新容器。
docker run -d -p 8080:8080 --restart=always --name auth auth
刷新一下我们的浏览器,页面中返回的信息是 hello word!