Picturesocial | 开发实践:如何在15分钟内将应用容器化

在常见的软件架构体系中,容器无疑是一个技术热点。有些开发者在工作中熟练使用容器技术,有些可能刚刚开始容器之旅。

面对容器使用经验不同的各类开发者,我们希望通过这个系列文章,由浅入深地介绍如何使用容器技术来构建,运维我们的软件应用程序。

贯穿整个系列,我们将持续构建一个名为 Picturesocial 的应用。

它是一个可以分享照片的社交媒体平台。通过 Picturesocial 应用的构建过程,我们将和开发者分享如何选择合适的应用架构心得和实践。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点 这里让它成为你的技术宝库!

图片

在开始之前,我们需要先了解一些关于容器的概念,这样后面的学习会更轻松些。

什么是容器?

请想象你正身处自己梦幻般的客厅:优雅的壁纸、可坐可卧的舒适沙发、精致的咖啡桌和几盏柔和的台灯。一切都如你所愿,但突然间你却不得不搬到另一处毛坯房,并且需要自己装修。所以你想要把卧室,以及客厅设置在邮轮海运的集装箱里。你的完美客厅和卧室就可以跟着你去到世界各地,也可以跟着你在汪洋大海里远航,还可以随着卡车在安第斯山脉中穿行,甚至可以在晴空万里中飞翔 ……

我们所说的容器就是这样一个概念:应用程序、运行时环境、文件系统都按照预先设计的逻辑进行编排打包(好比是你的精致客厅被打包进了集装箱),并在任何支持容器的环境中执行。这种设计让开发者们无比振奋,因为有了容器,应用就有了足够的灵活性,可以自由运行在任何需要它的地方。并且不用对它做任何更改。

应用的容器化,并没有将像数据库或队列管理器这样的依赖打包进去。所以,当我们计划将容器从一个环境转移到另一个环境运行时,应该预留一个位置来存放应用的环境配置,比如数据库连接字符串、时区设置等等。 这一点非常重要:它可以让应用从开发到质量安全审查,再到生产部署等各个阶段都能保持配置一致性。

当应用最终通过安全审查并进行部署时,我们就可以确信它配置了正确的数据库或依赖项。也正因为这种一致性,才不会出现高并发生产环境中的应用意外使用了开发环境的配置,使得整个应用连上了本地数据库,并最终导致所有用户的名字和内容都变成了开发过程中写的那些占位符。

  • {镜像 /Image}:容器镜像是容器解决方案中最重要的部分,因为应用程序及其状态就存在于此。当我们使用Docker构建应用程序及其 Dockerfile 时,就会产生容器镜像。容器镜像就像旧式的 ISO 文件,可以捕获计算机上的各种元素,并且可以在任何地方使用。但与 ISO 相比,容器镜像只包含操作系统组件、库、运行时和应用程序的一小部分,所以体积更小,计算要求也更少。总之,容器镜像允许我们打包应用程序及其依赖项,并可以在任何地方高效运行。
  • {容器 /Container}:当镜像被部署并开始执行时,它就被称为容器。
  • {引擎 /Engine}:容器需要在已经安装了 Docker 的环境中运行。Docker 是通过 API 与其所处的硬件进行通信的,这些 API 就是引擎的一部分。正是因为 Docker 引擎,容器才能获得主机的算力、存储和网络资源。
  • {镜像注册库/Registry}:注册库是提供存放容器镜像的网络服务。它可以存放公共镜像,也允许上传私有镜像。在注册库中存放的镜像可以有最近的版本,也可以有曾经使用过的标签,还可以包含某些元数据信息:1) 镜像上传时间;2) 镜像上传者;3) 镜像拉取时间。所以,我们无法脱离注册库来讨论容器技术,甚至当我们在本地使用容器时,本机就是注册库。
Dockerfile 文件

现在我们已经对容器相关的概念有了一定的了解,接下来再深入了解容器最重要的文件之一:Dockerfile 文件

以我的经历来看,Dockerfile 就好像是当年我刚参加工作当实习生时所写的东西。当年,我们一些实习生被分配了编写使用说明书的工作,就是写那种既没人读,出问题了也不管用的文档。一边编写,一边阅读手册的经历让我发现,我们写的说明书实用性差的主要问题在于,手册是人写给人看的,由于每个人的表达习惯不同以及阅读能力的局限性,它往往被诟病“描述得不清晰、不准确”。Dockerfile 则是人写给机器读的,所以它一定要写得无比准确,从而避免出现任何解释执行方面的问题。

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app
# Copy everything
COPY . ./
# Restore as distinct layers
RUN dotnet restore
# Build and publish a release
RUN dotnet publish -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build-env /app/out .
EXPOSE 5111
ENV ASPNETCORE_URLS=http://+:5111
ENTRYPOINT ["dotnet", "HelloWorld.dll"]

大部分的 Dockerfile 都会以 FROM 语句开始。这个语句说明了你自己的镜像是基于哪个基础镜像来构建的。举个例子,假如你想要创建一个需要往 Ubuntu 20.04 的实例上写入一个文件的容器,那么你可以选择这样写 FROM 语句:

FROM ubuntu:20.04

从上面的例子我们可以总结出,FROM 语句最基本的部分是它所使用的标签:

ubuntu 是镜像的名称。我们在 Docker Hub 可以找到数以百万的公有镜像来使用,而我们可以直接使用或是基于它们构建自己的镜像;

20.04 是 ubuntu 镜像的版本。从结构上来说,所有位于 “:” 之后的部分都是镜像的标签。你可以通过不同的标签来指定应用的版本、环境、语言等等。从 ubuntu 镜像的 Docker Hub 页面,我们可以找到许多不同的可用标签: https://hub.docker.com/_/ubuntu?tab=description?trk=cndc-detail

Dockerfile 中还有一些重要的命令:

RUN:用于在容器中执行多条 Bash 命令。你可以在同一个 Dockerfile 中多次使用 RUN 语句。

RUN mkdir demo

当这条语句被执行时,会在容器内创建一个名为 demo 的文件夹。

CMD:也可以执行 Bash 命令,但是只可以被使用一次。假如同一个 Dockerfile 中出现了多次,那么只有最后一条会被执行。CMD 只用于为容器提供默认的行为,比如:

CMD ["echo", "Hello World"]

在 Docker 构建时将输出 “Hello World” 这句话。

如果你希望更深入了解 Dockerfile 中的命令,Docker 官方提供的文档会非常有用:

https://docs.docker.com/engine/reference/builder/#cmd?trk=cnd...

如果你想为某种编程语言或是运行时环境找一些样例,可以访问另一则文档:

https://docs.docker.com/samples/?trk=cndc-detailDockerfile

就好比一本食谱,我们可以在任何相似的应用部署中重复使用它们。比如我会在 Picturesocial 所公开给外部的全部接口上使用同样的一个 .NET 6 Dockerfile 模板。

容器注册库 ECR

我们再来深入认识一下亚马逊云科技提供的容器注册库吧。

我们可以使用 Amazon Elastic Container Registry (Amazon ECR) 来存放自己的容器镜像,它们可以是公开的,也可以是私有的。这样做的好处是由 Amazon Identity and Access Management (Amazon IAM) 服务来管理所有对自己镜像的访问,而不是使用来自外部的凭证信息。

上手实践

下面让我们通过一个具体的实验,了解如何将一个 API 容器化,然后推送到 Amazon ECR 中。

准备工作:
  • 注册/登录一个亚马逊云科技账号:

https://signin.amazonaws.cn/signup?request_type=register&nc2=...

  • 如果你正在使用的电脑是 Linux 或 macOS 操作系统的,可以跳过这一条。如果你正在使用 Windows,建议使用 WSL2:

https://docs.microsoft.com/en-us/windows/wsl/install?trk=cndc...

  • 安装 Git:

https://github.com/git-guides/install-git?trk=cndc-detail

  • 在你的电脑上安装 Docker:

https://docs.docker.com/engine/install/?trk=cndc-detail

  • 安装 Amazon CLI 2:

https://docs.amazonaws.cn/cli/latest/userguide/getting-starte...

  • 如果第一次接触 Amazon CLI,或者想要了解怎样配置其凭证信息,我们建议参考下面文档中来配置本地环境:

https://docs.amazonaws.cn/aws/latest/userguide/managing-aws.h...

我们会学习如何将一个用 C# 开发的 .NET 6 API 容器化封装。这个 API 将会把我们通过参数传递过去的文字返回。同时,此 API 还会作为 Picturesocial 所有 API 的模板来使用。这样从本地开发调试进展到云端部署时不再需要修改编排方案、脚本、依赖项,并且当应用的代码发生变化时,这些不相关项能保持一致性。这也是我们整个应用容器化的主要原因。

我们在 GitHub 上创建了一个仓库 https://github.com/aws-samples/picture-social-sample?trk=cndc-detail, 里面包含了完成接下来这些步骤需要用到的代码。在开始之前,请确保克隆后的分支切换到了 “ep1”。

  • 首先,克隆上述基础代码仓库。里面包含了此 API 需要的所有文件,以及一个稍后会用于创建容器镜像的 Dockerfile 文件。
git clone https://github.com/aws-samples/picture-social-sample --branch ep1
  • 克隆完成后,我们打开新创建的目录。为了能够让后面的步骤进展顺利、代码执行无误,请时刻记得将这个目录作为我们的工作目录。

cd picture-social-sample/HelloWorld

  • 在进入后续步骤之前,我们需要先确保 Docker 正确安装并且正在运行中。我们尝试执行下面的代码,如果没有问题应该会看到输出了 “Docker version 20.10”(由于 Docker 引擎持续更新中,并且在不同平台上你看到的版本号及后缀可能略有差异)。
  • 当我们查看 Dockerfile 文件,会发现和刚才分享的完全一致的文件结构。放心修改和尝试,比如试试这些更改:
  1. 添加一行在构建阶段中输出 “Hello World” 的语句。

RUN echo "Hello World"

  1. 将 WORKDIR 从 app 改为 api,记得将后面第 2、11、12 行用到 app 的部分也改为 api。
  • 接下来,开始构建容器的镜像。我们需要用 docker build 命令说明要执行的操作,然后用 -t 选项指明镜像的名字。镜像的名字参考此前提到的 imageName:tagName 结构,如果我们没有写 tagName 的部分,Docker 默认会使用 latest。最后还要加上 Dockerfile 所处的目录。由于我们现在的工作目录正是项目根目录,所以只需要使用 . 指代。

docker build -t helloworld:latest .

  • 我们注意到一个细节。如果正在使用基于 Apple Silicon 芯片的 MacBook 系列电脑,那么这个命令会有些许不同。我们要通过一个选项要求 Docker 将镜像构建成可以在 AMD64 体系结构的系统中执行。
docker buildx build —platform=linux/amd64 -t helloworld:latest .

现在,就可以在本地通过 docker run 命令启动容器了。使用 -d 选项能够让容器以后台服务形式运行,-p 选项可以将容器的端口与主机进行映射。此前在 Dockerfile 中我们制定了容器会使用 5111 端口,所以这里我们将同一个端口号进行映射执行。

docker run -d -p 5111:5111 helloworld:latest
  • 执行完上面的命令后,我们可以打开浏览器然后访问 http://localhost:5111/api/HelloWorld/johndoe?trk=cndc-detail, 屏幕上应该会显示 “Hello johndoe”。可以更改 URL 中的 johndoe 为其他值来试试看。既然我们获得了预期的输出,那就说明容器运转正常,接下来就可以进一步将其上传到 Amazon ECR 了。
  • 接下来我们要在 Amazon ECR 创建一个名为 “helloworld” 的私有容器注册库:
aws ecr create-repository --repository-name helloworld
  • 随后我们要得到刚创建的注册库的全限定域名 (FQDN),以便后续步骤中用来标记限定仓库的名称。这样一来,就能让 Docker 明确我们会将这个镜像名用于远程注册库,而不是使用现在正运行在本地开发环境中的镜像名。这个项目中我们创建的 Amazon ECR 位于 us-east-1 区域,所以你可以根据这些信息构造出完整的 FQDN 字符串:
[aws account id].dkr.ecr.[aws region].amazonaws.com
#for example for account id: 777777777777 on region: us-east-1
777777777777.dkr.ecr.us-east-1.amazonaws.com
  • 现在已经知道了注册库的 FQDN,我们需要登录 Docker 控制台。参考下面的命令,别忘了把 Amazon 账户 ID 和区域信息替换(或是直接使用刚才得到的 FQDN)。登录 Docker 后,本地环境就具备了向 Amazon ECR 推送镜像的权限。
aws ecr get-login-password --region us-east-1 \
    | docker login --username AWS \
    --password-stdin [aws account id].dkr.ecr.[aws region].amazonaws.com
  • 此时,现在我们可以推送镜像了。但要记得先根据 FQDN 修改要推送的镜像的名字再推送到 Amazon ECR。
docker tag helloworld:latest [aws account id].dkr.ecr.[aws region].amazonaws.com/helloworld:latest

docker push [aws account id].dkr.ecr.[aws region].amazonaws.com/helloworld:latest

到了这里,说明已经成功了!恭喜成功容器化了自己的首个应用!

我们会持续更新这个系列内容,包括容器编排服务 (Container Orchestrator),是什么以及为什么我需要使用容器编排服务….

希望你开心工作,认真生活~

请持续关注 Build On Cloud 微信公众号,了解更多面向开发者的技术分享和云开发动态!

往期推荐

#Generative AI 新世界

#开发者生态

#亚马逊的开源文化

文章作者:

Ana Cunha、Jose Yapur,

Developer Advocate, Amazon Web Services

文章译者:

郑予彬

亚马逊云科技资深开发者布道师

图片

文章来源:
https://dev.amazoncloud.cn/column/article/648c1546f3f2f7504c1f114b?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/323360.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读 CIDR17】Self-Driving Database Management Systems

Self-Driving Database Management Systems MySummary ABSTRACT 之前的advisory tools来帮助DBA处理系统调优和物理设计的各个方面,都仍然需要人类对数据库的任何更改做出最终决定,并且是在问题发生后修复问题的反动措施reactionary measures 。 An …

Batch Normalization、Layer Normalization代码实现

目录 前言批量正则化-BN层正则化-LN 前言 BN(Batch Normalization)首次提出与论文,主要目的是为了解决训练深层神经网络慢的问题。我们可以神经网络整体可以看成一个高阶的复杂函数,通过训练优化它的参数,可以用于拟合各种复杂的数据分布。一…

[易语言]使用易语言部署yolov5-7.0的图像分类模型

【官方框架地址】 GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite 【算法介绍】 YOLO(You Only Look Once)系列算法是一种在计算机视觉领域广泛应用的目标检测算法,而YOLOv5是该系列中的…

数据结构初阶之排序

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞,评论,收藏。 一起努力,共赴大厂。 目录 一.前言 二.选择排序 …

智能安全帽识别系统简析

在工业安全领域,安全帽识别系统的重要性不言而喻。这种系统利用先进的图像识别技术,确保工地上每位工人都佩戴安全帽,从而大幅提升工作场所的安全性。本文旨在探讨这一系统的工作原理、应用范围以及面临的挑战。 安全帽识别系统的工作原理 智…

GPT图解大模型是怎样构建的

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作…

0基础学java-day25(JDBC 和数据库连接池)

一、JDBC概述 1 基本介绍 2 简单模拟 package com.hspedu.jdbc.myjdbc;/*** author 林然* version 1.0* 我们规定的 jdbc 接口(方法)*/ public interface JdbcInterface {//连接public Object getConnection() ;//crudpublic void crud();//关闭连接public void close(); }pac…

立白科技集团:研发安全推动数字化蜕变,日化业务再上新高度

立白科技集团成立于1994年,是我国日化行业的领军企业,致力于成为一家“品牌引领、数字经营、富有创新、富有活力”的智慧服务型企业。从2018年开始,立白科技集团加速数字化转型,打造数据和业务中台,并建立toB和toC平台…

小程序学习基础(首页展示)

原理通过首页展示的方式设置一个按钮&#xff0c;然后点击按钮跳转到相应的页面即可。 一 在js中定义一个需要展示页面的数组 二 在页面中使用fou循环来遍历其中的数据&#xff0c;并展示出来 页面代码 <!--index.wxml--> <navigation-bar title"牧原" …

vue3 锚点定位 点击滚动高亮

功能描述 点击导航跳到对应模块的起始位置&#xff0c;并且高亮点击的导航&#xff1b; 滚动到相应的模块时&#xff0c;对应的导航也自动高亮&#xff1b; 效果展示 注意事项 一定要明确哪个是要滚动的盒子&#xff1b;滚动的高度要减去导航栏的高度&#xff1b;当前在导航1…

Redis相关命令详解及其原理

Redis概念 Redis&#xff0c;英文全称是remote dictionary service&#xff0c;也就是远程字典服务。这是kv存储数据库。Redis&#xff0c;包括所有的数据库&#xff0c;都是请求-回应模式&#xff0c;通俗来说就是数据库不会主动地要给前台推送数据&#xff0c;只有前台发送了…

【HarmonyOS4.0】第十篇-ArkUI布局容器组件(二)

三、层叠布局容器&#xff08;Stack&#xff09; 堆叠容器组件 Stack的布局方式是把子组件按照设置的对齐方式顺序依次堆叠&#xff0c;后一个子组件覆盖在前一个子组件上边。 注意&#xff1a;Stack 组件层叠式布局&#xff0c;尺寸较小的布局会有被遮挡的风险&#xff0c; …

JS常用插件 Swiper插件 实现轮播图

Swiper介绍 Swiper 是一款免费以及轻量级的移动设备触控滑块的js框架 中文官网地址: https://www.swiper.com.cn/ 点击查看Swiper演示&#xff0c;里面的功能和样式十分丰富&#xff0c;根据自己的需求选择 中文教程中详细介绍了如何使用Swiper API文档中介绍了各个模块以及参…

计算机导论05-计算机网络

文章目录 计算机网络基础计算机网络概述计算机网络的概念计算机网络的功能计算机网络的组成 计算机网络的发展计算机网络的类型 网络体系结构网络互联模型OSI/RM结构与功能TCP/IP结构模型TCP/IP与OSI/RM的比较 网络地址与分配IP地址构成子网的划分IPv6 传输介质与网络设备网络传…

电脑桌面便签在哪设置?备忘录软件哪个好?

好记性不如烂笔头&#xff01;相信很多打工族在电脑面前办公的时候&#xff0c;都需要随时记录工作中的事项&#xff0c;有的用TXT记录&#xff0c;有的手写笔记&#xff0c;还有一些用电脑桌面便签类软件。而当我们待办事项繁多的时候&#xff0c;手写或文本记录并不能有效帮我…

图解python | 字符串及操作

1.Python元组 Python的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号&#xff0c;列表使用方括号。 元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。 tup1 (ByteDance, ShowMeAI, 1997, 2022) tup2 (1…

老师假期有工资么

老师在享受假期的时候&#xff0c;很多人都会好奇&#xff1a;教师寒暑假会有工资吗&#xff1f; 老师也是劳动者&#xff0c;享有法律规定的各种权益。其中之一就是在规定的工作时间内获得报酬。既然老师在正常工作日上班有工资&#xff0c;那么在假期呢&#xff1f; 实际上…

数字化时代,VR全景展示如何让用户一窥全貌?

数字化时代&#xff0c;VR全景展示为各行各业提供了无限的可能性。随着VR全景技术的逐步普及&#xff0c;VR全景展示以其独特的呈现方式和新颖十足的交互体验&#xff0c;正在不断改变着人们对于展示宣传的理解。 传统的展示方式&#xff0c;通常需要将产品、图文、品牌等元素集…

【计算机组成与体系结构Ⅱ】指令调度与分支延迟(实验)

实验4&#xff1a;指令调度与分支延迟 一、实验目的 1. 加深对指令调度技术的理解。 2. 加深对分支延迟技术的理解。 3. 熟练采用指令调度技术解决流水线中的数据冲突的方法。 4. 进一步理解指令调度技术对CPU性能的改进。 5. 进一步理解延迟分支技术对CPU性能的改进。 二…

企业组网搭建有哪些?

在当今全球化的商业环境中&#xff0c;集团公司必须建立起一个无缝连接的网络&#xff0c;以确保高效的信息传输和资源共享。为实现这一目标&#xff0c;选择可靠而安全的网络组网方案至关重要。本文将介绍几种主要的集团公司网络组网方案&#xff0c;以帮助企业根据其具体需求…