Microsoft Learn: Docker入门教程

2023-05-16

Microsoft Learn: Docker入门教程

  • 1. Introduction
  • 2. What is Docker
  • 3. How Docker images work
  • 4. How Docker containers work
  • 5. When to use Docker containers
  • 6. Summary
  • 参考

1. Introduction

现在的商业团队必须快速发布应用,以便于吸引和留住客户。 出于这种需求,软件开发和支持团队必须始终考虑能够节省时间和成本的解决方案。 理想的解决方案应该能够减少创建和配置部署环境所花费的时间,并简化软件部署过程。

普遍认为,软件容器化(software containerization)技术是一种可以节省时间和降低成本的解决方案。 容器化的一项优势是,无需配置硬件及花费时间安装操作系统和软件来托管部署。容器之间彼此隔离,并且多个容器可以在同一个硬件上运行。 这使得我们可以更加高效地使用硬件,并且可以帮助提升应用程序的安全性。

2. What is Docker

(1)什么是容器?

容器(container)是一种松散隔离的环境,可用于构建和运行软件包。 这些软件包包括在任何计算环境中快速可靠地运行应用程序所需的程序代码及其所有依赖项。我们将这些包称为容器镜像(docker image)

容器镜像是我们用于分发应用程序的单位。

(2)什么是软件容器化?

软件容器化是一种操作系统虚拟化方法,用于在不使用虚拟机 (VM) 的情况下部署和运行容器。 容器可在物理硬件上、云和 VM 中运行,还可以在多个操作系统上运行。

(3)什么是 Docker?

Docker 是一个用于开发、交付(ship)和运行容器的容器化平台(containerization platform)。 Docker 不使用虚拟机,如果要开发和测试应用程序,可以在台式机或笔记本电脑上运行 Docker。 桌面版 Docker 支持 Linux、Windows 和 macOS。 对于生产系统,Docker 适用于服务器环境,包括 Linux 的多种变体和 Microsoft Windows Server 2016 及更高版本。 许多云(包括 Azure)都支持 Docker。

(3)Docker 架构

Docker 平台包含多个用于构建、运行和管理容器化应用程序的组件。

(4)Docker 引擎

The Docker Engine consists of several components configured as a client-server implementation where the client and server run simultaneously on the same host. The client communicates with the server using a REST API, which enables the client to also communicate with a remote server instance.

在这里插入图片描述

The Docker client

Docker 客户端是一个名为 docker 的命令行应用程序,它为我们提供了一个命令行接口 (CLI),用于与 Docker 服务器进行交互。 docker 命令使用 Docker REST API 将指令发送到本地或远程服务器,并作为用于管理容器的主要接口。

The Docker server

Docker 服务器是一个名为 dockerd 的守护进程。 dockerd 守护进程通过 Docker REST API 响应来自客户端的请求,并且可以与其他守护进程进行交互。 此外,Docker 服务器还负责跟踪容器的生命周期。

Docker objects

在进行容器部署时,我们可以根据需要创建并配置多个对象。 这些对象包括网络、存储卷(storage volumes)、插件(plugins)和其他服务对象。

(5)Docker Hub

Docker Hub 是一个软件即服务 (SaaS) Docker 容器注册表(registry)。 Docker 注册表是用于存储和分发容器镜像的存储库。Docker Hub 是 Docker 用于镜像管理的默认公共注册表。

请记住,也可以创建和使用私有 Docker 注册表,或者使用由云服务提供商提供的Docker注册表。 例如,可以使用 Azure 容器注册表来存储容器镜像,以便在多个启用了 Azure 容器的服务中使用。

3. How Docker images work

(1)Software packaged into a container

打包到容器中的软件并不限于开发者构建的应用程序。我们说的软件,是指在容器中运行的应用程序代码、系统软件包、二进制文件、库文件、配置文件和操作系统。

例如,假设我们要开发一个订单跟踪门户,供公司的各个专卖店使用。We need to look at the complete stack of software that will run our web application. 我们要构建的应用程序是一个 .NET Core MVC 应用,并且我们计划使用 Nginx 作为反向代理服务器在 Ubuntu Linux 上部署应用程序。 所有这些软件组件都是容器镜像的组成部分。

(2)What is a container image?

容器镜像是一种包含软件的可移植程序包。它在运行时便成为了我们的容器。容器是镜像在内存中的实例。

容器镜像是不可改变的。 生成镜像后,就无法修改该镜像。 修改镜像的唯一方法是创建新的镜像。这一特性可以保证在生产环境中使用的镜像与在开发环境和质量保证(QA)环境中使用镜像是相同的。

(3)What is the host OS?

主机操作系统(host OS)是运行 Docker 引擎所依赖的操作系统。 只要二进制文件可以直接访问操作系统内核,在 Linux 上运行的 Docker 容器就可以共享主机操作系统内核,而无需容器操作系统。

在这里插入图片描述

但是,在Windows上运行的容器需要容器操作系统。容器依赖于操作系统内核来管理服务,如文件系统、网络管理、进程调度和内存管理服务。

(4)What is the container OS?

在这里插入图片描述

容器操作系统是已打包镜像中所包含的操作系统。 我们可以灵活地在容器中包含不同版本的 Linux 或 Windows 操作系统。 这种灵活性使我们能够获得特定的操作系统功能或安装应用程序可能使用的其他软件。

容器操作系统独立于主机操作系统,我们要在这一环境中部署和运行应用程序。 结合映像的不可变性,这种隔离意味着应用程序开发环境和生产环境是相同的。

(5)What is the Stackable Unification File System (Unionfs)?

可堆叠统一文件系统(Unionfs )用于创建 Docker 镜像。 Unionfs 是一种文件系统,允许以看似合并(merge)内容的方式堆叠(stack)多个目录(称为分支)。 但是,被堆叠的内容在物理上是保持分离的。 Unionfs 允许你在构建自己的文件系统时自由地添加和删除分支。

在这里插入图片描述

例如,假设我们要为之前的 Web 应用构建一个镜像。 我们将 Ubuntu 发行版作为基础镜像叠加到引导文件系统(boot file system)之上。 接着,我们将安装 Nginx 和 我们的Web 应用。 我们有效地将 Nginx 和 Web 应用叠加到原始 Ubuntu 镜像之上。

在通过镜像运行容器之后,会创建一个最终的(final)可写层(writeable layer)。 但是,当容器被销毁时,可写层将被销毁。

(6)What is a base image?

基础镜像(base image)是使用 Docker scratch 镜像的一种镜像。 scratch 镜像是一种空容器镜像,不会创建文件系统层。 该镜像假设要运行的应用程序可以直接使用主机操作系统内核。

(7)What is a parent image?
父级镜像(parent image)是在创建镜像时所使用的起始容器镜像,即可以基于父级镜像来创建自己的镜像。

例如,我们将使用已基于 Ubuntu 的镜像,而不是从头开始创建镜像,然后再安装 Ubuntu。 我们甚至可以使用已经安装好 Nginx 的镜像。 父级镜像通常包含一个容器操作系统。

(8)What is the main difference between base and parent images?

这两种类型的镜像都可以用于创建可重复使用的镜像。 但是,基础镜像使我们能够更好地控制最终映像的内容。 这是因为,镜像是不可改变的,只能对镜像进行添加操作而不能进行删减操作。

(9)What is a Dockerfile?
Dockerfile 是一种文本文件,其中包含用于生成和运行 Docker 镜像的指令。 Dockerfile对镜像的以下方面进行了定义:

  • 用于创建新镜像的基础镜像或父级镜像
  • 用于更新基础操作系统和安装其他软件的命令
  • 要包含的程序,例如已开发好的应用程序
  • 要公开的服务,例如存储和网络配置
  • 要在启动容器时运行的命令

让我们从一个Dockerfile示例中来看看这些方面是怎么定义的。 假设我们要为 ASP.NET Core 网站创建一个 Docker 镜像,则Dockerfile 可以这样写:

# Step 1: Specify the parent image for the new image
FROM ubuntu:18.04

# Step 2: Update OS packages and install additional software
RUN apt -y update &&  apt install -y wget nginx software-properties-common apt-transport-https \
  && wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \
  && dpkg -i packages-microsoft-prod.deb \
  && add-apt-repository universe \
  && apt -y update \
  && apt install -y dotnet-sdk-3.0

# Step 3: Configure Nginx environment
CMD service nginx start

# Step 4: Configure Nginx environment
COPY ./default /etc/nginx/sites-available/default

# STEP 5: Configure work directory
WORKDIR /app

# STEP 6: Copy website code to container
COPY ./website/. .

# STEP 7: Configure network requirements
EXPOSE 80:8080

# STEP 8: Define the entry point of the process that runs in the container
ENTRYPOINT ["dotnet", "website.dll"]

回忆一下,我们之前提到过,Docker 镜像使用 unionfs。 在生成最终的容器镜像时,这些步骤中的每一步都会创建一个缓存的容器镜像。 这些临时镜像会叠加在上一步生成的镜像之上,并在所有步骤完成后表现为单个镜像。

最后,请注意最后一个步骤,即步骤 8。 文件中的 ENTRYPOINT 表示当我们从镜像运行容器时,将要执行的进程。

(10)How to manage Docker images

构建好的Docker镜像是存储在计算机上的大文件,我们需要工具来管理这些镜像文件。

可以通过 Docker CLI 来管理镜像,包括构建、列出、删除和运行镜像。 我们使用 docker 客户端来管理 Docker 镜像。 客户端不直接执行命令,它会将所有指令发送到 dockerd 守护进程。

(11)How to build an image

我们使用 docker build 命令来构建 Docker 镜像。 假设我们使用之前的 Dockerfile 定义来构建一个镜像。 以下示例演示了 build 命令的使用:

docker build -t temp-ubuntu .

由 build 命令生成的输出如下:

Sending build context to Docker daemon  4.69MB
Step 1/8 : FROM ubuntu:18.04
 ---> a2a15febcdf3
Step 2/8 : RUN apt -y update && apt install -y wget nginx software-properties-common apt-transport-https && wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb && dpkg -i packages-microsoft-prod.deb && add-apt-repository universe && apt -y update && apt install -y dotnet-sdk-3.0
 ---> Using cache
 ---> feb452bac55a
Step 3/8 : CMD service nginx start
 ---> Using cache
 ---> ce3fd40bd13c
Step 4/8 : COPY ./default /etc/nginx/sites-available/default
 ---> 97ff0c042b03
Step 5/8 : WORKDIR /app
 ---> Running in 883f8dc5dcce
Removing intermediate container 883f8dc5dcce
 ---> 6e36758d40b1
Step 6/8 : COPY ./website/. .
 ---> bfe84cc406a4
Step 7/8 : EXPOSE 80:8080
 ---> Running in b611a87425f2
Removing intermediate container b611a87425f2
 ---> 209b54a9567f
Step 8/8 : ENTRYPOINT ["dotnet", "website.dll"]
 ---> Running in ea2efbc6c375
Removing intermediate container ea2efbc6c375
 ---> f982892ea056
Successfully built f982892ea056
Successfully tagged temp-ubuntu:latest

请注意输出中列出的步骤。 执行每个步骤时,都会向正在生成的映像添加一个新层。

另请注意,我们将执行多个命令以安装软件和管理配置。 例如,在步骤 2 中,我们将运行 apt -y updateapt install -y 命令来更新操作系统。 这些命令在为该步骤创建的正在运行的容器中执行。 命令运行后,将删除中间容器。 底层的(underlying)缓存镜像被保存在主机上,并且不会被自动删除。 这样可以确保后续的构建过程能够重复使用这些镜像,从而缩短构建时间。

(12)What is an image tag?

镜像标签(image tag)是用于标识镜像版本号的文本字符串。

在之前构建镜像的示例中,请注意最后一个构建消息Successfully tagged temp-ubuntu: latest。 在构建镜像时,我们使用 -t 命令选项来命名和标记(可选)镜像。 在我们的示例中,我们使用 -t temp-ubuntu 来命名镜像,而生成的镜像名称被标记为 temp-ubuntu: latest。 如果未指定一个标签,则会默认将镜像标记为 latest

单个镜像可以有多个标签。 按照习惯,应该为最新版本的镜像添加一个latest标签和一个描述该镜像版本号的标签。 当发布新版本的镜像时,可以重新分配 latest 标签以引用新镜像。

以下是另一个示例。 假设要使用 .NET Core 示例 Docker 镜像。 在这里,有四个平台版本可供选择:
mcr.microsoft.com/dotnet/core/samples:dotnetapp
mcr.microsoft.com/dotnet/core/samples:aspnetapp
mcr.microsoft.com/dotnet/core/samples:wcfservice
mcr.microsoft.com/dotnet/core/samples:wcfclient

(13)How to list images

Docker 软件会在计算机上自动配置本地镜像注册表。 可以使用 docker images 命令查看此注册表中的所有镜像。

docker images

示例输出:

REPOSITORY   TAG          IMAGE ID       CREATED          SIZE
tmp-ubuntu   latest       f89469694960   14 minutes ago   1.69GB
tmp-ubuntu   version-1.0  f89469694960   14 minutes ago   1.69GB
ubuntu       18.04        a2a15febcdf3   5 weeks ago      64.2MB

从示例中可以看到,一个镜像可以拥有多个标签。 虽然镜像的标签不同,但是其ID 是相同的。

因此,镜像的名称或标签可能会有歧义,而镜像 ID 是用于标识和管理镜像的有效方法。

(14)How to remove an image

可以使用 docker rmi 命令从本地 docker 注册表中删除镜像,指定要删除的镜像的名称或 ID。 此示例使用镜像名称删除示例 Web 应用的镜像:

docker rmi temp-ubuntu:version-1.0

如果镜像有一个正在运行的容器,则不能删除该镜像。 docker rmi 命令将返回一条错误消息,其中列出了依赖于该镜像的容器。

4. How Docker containers work

(1)How to manage Docker containers

Docker 容器具有生命周期,我们可以对容器的状态进行管理和跟踪。

在这里插入图片描述

  • 使用 run 命令运行容器。 还可重启已在运行的容器。 重启容器时,容器将收到一个 termination 信号,以允许任何正在运行的进程在容器的内核终止之前正常关闭。
  • 容器在暂停(paused)、停止(stopped)或终止(killed)之前将被视为处于运行(running)状态。 但是,容器也可能会自行退出运行状态。 当正在运行的进程完成或者进程进入错误状态时,容器可以自行退出。
  • 使用 pause 命令来暂停正在运行的容器。 此命令会暂停容器中的所有进程。
  • 使用 stop 命令来停止正在运行的容器。stop 命令通过向正在运行的进程发送 termination 信号来正常关闭该进程。 进程关闭后,容器的内核将终止。
  • 使用 kill 命令发送kill 信号来终止容器。 正在运行的进程不会捕获 kill 信号,只有容器的内核才会捕获kill 信号。 因此,该命令将强制终止容器中正在运行的进程。
  • 最后,使用 remove 命令来删除处于停止状态的容器。 删除容器后,将销毁存储在容器中的所有数据。

(2)How to view available containers

若要查看正在运行的容器,请使用 docker ps 命令。 若要查看容器的所有状态,请传递 -a 参数。

示例如下:

docker ps -a

示例输出:

CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS     NAMES
d93d40cc1ce9  tmp-ubuntu:latest  "dotnet website.dll …"  6 seconds ago  Up 5 seconds        8080/tcp      happy_wilbur
33a6cf71f7c1  tmp-ubuntu:latest  "dotnet website.dll …"  2 hours ago    Exited (0) 9 seconds ago   adoring_borg

注意输出中的以下三个方面:

  • IMAGE列中列出的镜像名称。 在本例中,该名称为 tmp-ubuntu: latest。 请注意,你可以从同一镜像创建多个容器。This feature is a powerful management feature that you use to enable scaling in your solutions.
  • STATUS列中列出的容器状态。 在本例中,一个容器正在运行,一个容器已退出。 容器的状态通常是容器运行状况的第一指标。
  • NAMES列中列出的容器名称。 除了第一列中的容器 ID 之外,容器还会有一个名称。 在本例中,由于没有为每个容器显式提供名称,因此,Docker 为容器提供了随机名称。 使用run命令的 --name 选项可以显示地为容器提供名称。

(3)Why are containers given a name?

借助此功能,可从同一个镜像运行多个容器实例。 容器名称是唯一的,这意味着,如果指定了某一名称,则不能重复使用该名称来创建新的容器。 重复使用特定名称的唯一方法是删除之前的容器。

(4)How to run a container

若要启动容器,请运行 docker run 命令。 只需按名称或 ID 指定要运行的镜像,即可从镜像启动容器。 通过此方式启动的容器提供了交互式的体验。

使用-d选项可以使容器在后台运行。

docker run -d tmp-ubuntu

在此示例中,该命令仅返回新容器的 ID。

指定要运行的镜像后,Docker 将查找该镜像,从该镜像加载容器,并执行指定为入口点的命令。 之后就可以对容器进行管理。

(5)How to pause a container
使用docker pause 命令来暂停容器的运行,

docker pause happy_wilbur

该命令将暂停容器中正在运行的所有进程。 docker unpause 命令将取消挂起指定容器中的所有进程。

(6)How to restart a container
使用docker restart命令来重新运行一个容器,

docker restart happy_wilbur

容器会收到 stop 命令,然后是 start 命令。 如果容器未响应 stop 命令,将发送 kill 信号。

(7)How to stop a container

使用docker stop 命令来停止一个正在运行的容器,

docker stop happy_wilbur

stop 命令会将 termination 信号发送到容器和容器中正在运行的进程。

(8)How to remove a container
使用docker rm 命令来删除一个已经停止的容器,

docker rm happy_wilbur

删除容器后,将销毁容器中的所有数据。 因此在考虑存储数据时,始终将容器视为临时容器是非常重要的。

(9)Docker container storage configuration

如前文所述,如果容器中的应用程序需要存储数据,应该始终将容器视为临时容器。

假设我们的跟踪门户应用程序在其根目录的子文件夹(即直接到容器的文件系统)中创建了一个日志文件。 当应用将数据写入日志文件时,系统会将数据写入可写容器层。

虽然该方法可以工作,但遗憾的是,它存在一些缺点:

  • 容器存储是临时的

    日志文件不会在容器实例之间存留。 例如,假设你停止并删除容器。 当你启动新容器实例时,新实例将基于指定的镜像,而以前的所有数据将会丢失。 请记住,删除容器时,容器中的所有数据都会被销毁。

  • 容器存储与底层主机耦合

    容器与底层主机耦合时,很难从容器访问或移动日志文件。 必须连接到容器实例来访问该文件。

  • 容器存储驱动程序性能较低

    容器实现了一个存储驱动程序,以允许应用写入数据。 此驱动程序引入额外抽象来与主机操作系统内核通信,比直接写入主机文件系统的性能要低。

容器可以使用两种选项来保存数据。 第一种选项是使用卷(volumes),第二种选项则是绑定挂载(bind mounts)。

(10)What is a volume?

A volume is stored on the host filesystem at a specific folder location. Choose a folder where you know the data isn’t going to be modified by non-Docker processes.

Docker 通过运行 docker volume create 命令创建和管理新的卷(volume)。 此命令可以作为Dockerfile 定义的一部分,这意味着你可以在容器创建过程中创建卷。 在第一次尝试将卷装载(mount)到容器中时,如果该卷不存在,则 Docker 将创建该卷。

卷存储在主机文件系统的目录中。Docker 将装载并管理容器中的卷。 装载后,这些卷与主机是隔离开的。

多个容器可以同时使用相同的卷。 当容器停止使用卷时,卷不会被自动删除。

在本例中,你可以在容器主机上创建一个目录,并在创建跟踪门户容器时将此卷装载到容器中。 当跟踪门户记录数据时,你可以通过容器主机的文件系统访问保存的日志文件。 即使删除了容器,你仍可以访问此日志文件。

(11)What is a bind mount?

绑定挂载(bind mount)在概念上与卷相同,但是,你可以在主机上装载任何文件或文件夹,而不是使用特定的文件夹。 你还希望主机可以更改这些挂载中的内容。与卷一样,在绑定挂载时,如果主机上不存在,则系统将创建它。

与卷相比,绑定挂载虽然性能更高,但是功能有限,它依赖于主机上具有特定的文件夹结构。

使用容器时,卷应该作为首选的数据存储策略。

(12)Docker container network configuration

默认的Docker 网络配置允许在 Docker 主机上隔离容器。这一特性,使你能够构建和配置可以彼此进行安全通信的多个应用程序。

Docker 提供了三种预配置(pre-configure)的网络配置:

  • 桥接(Bridge)
  • 主机(Host)
  • 无(none)

根据容器的网络要求,可以选择要应用的网络配置。

(13)What is the bridge network?

在启动容器时,如果没有指定任何其他网络配置,则默认使用桥接网络配置。 此网络是容器使用的内部专用网络,它将容器网络与 Docker 主机网络隔离。

桥接网络中的每个容器都分配有一个 IP 地址和子网掩码,主机名默认为容器名称。 连接到默认桥接网络中的不同容器,可以通过容器的 IP 地址互相访问。 桥接网络不允许使用主机名在容器之间进行通信。

默认情况下,Docker 不会发布任何容器端口。若要在容器端口和 Docker 主机端口之间启用端口映射(port mapping),请使用 Docker 端口 --publish 标志。

publish 标志可以有效地配置一个防火墙规则来映射端口。

在本例中,浏览到80的客户端可以访问你的跟踪门户应用。必须将端口 80 从容器映射到主机上的可用端口。 你在主机上打开了端口 8080,因此可设置如下标志。

--publish 8080:80

任何浏览到 Docker 主机 IP 和8080端口的客户端都可以访问该跟踪门户应用。

(14)What is the host network?

通过主机网络(host network),你可以直接在主机网络上运行容器。该配置在网络层面有效地消除了主机与容器之间的隔离。

在本例中,假设你决定将网络配置更改为主机网络选项。现在,仍然可使用主机 IP 访问跟踪门户应用,但是可以使用已知的80端口,而不是映射的端口。

需要注意的是,容器只能使用未被主机使用的端口。

(15)What is the none network?

若要禁止容器使用网络,请使用网络选项。

(16)Operating system considerations

请记住,不同桌面操作系统上的 Docker 网络配置选项存在差异。 例如,使用桥接网络时,Docker0 网络接口在 macOS 上不可用;Windows 和 macOS 桌面版均不支持使用主机网络配置。

这些差异可能会影响开发者配置用于管理容器开发的工作流。

5. When to use Docker containers

我们已经看到,Docker 提供了许多特性供我们使用。在这里,我们将探讨 Docker 向开发和运营团队提供的好处。 此外,我们还将介绍 Docker 可能并非最佳选择的一些场景。

这些方面将帮助你确定 Docker 是否是一种适合你的容器化策略。

回忆一下,之前我们讲到过,我们的团队在开发和发布订单跟踪门户应用时遇到了许多挑战。 他们正寻求一种解决方案,以便:

  • 轻松管理托管环境
  • 保证连续交付软件
  • 确保高效使用服务器硬件
  • 应用程序具有可移植性

Docker 便是应对这些挑战的解决方案。 让我们来看一下目前所介绍的所有优点。

Docker benefits

使用Docker具有以下几个方面的好处:
(1)Efficient use of hardware

运行容器不需要使用虚拟机 (VM) 。 正如我们所见,容器依靠主机内核来实现文件系统、网络管理、进程调度和内存管理等功能。
在这里插入图片描述

与 VM 相比,我们发现,VM 需要安装操作系统来为 VM 中正在运行的应用程序提供内核功能。 请记住,VM 操作系统也需要磁盘空间、内存和 CPU 时间。 通过消除 VM 和额外的操作系统要求,可以释放主机上的资源,并将其用于运行其他容器。

(2)Container isolation

Docker 容器提供了安全特性,可在同一主机上同时运行多个容器,而不会相互影响。 正如我们所见,我们可以配置数据存储和网络配置,以便隔离容器或在特定容器之间共享数据和连接。

让我们将此功能与使用 VM 进行比较。

在这里插入图片描述

假如我们有一个运行两个 VM 的物理主机。 我们有三个需要彼此独立运行的应用程序。 我们决定将第一个应用部署到 VM 1,将第二个应用部署到 VM 2,以便将这两个应用彼此隔开。 如果我们现在选择安装第三个应用程序,则需要安装另一个 VM。

(3)Application portability

容器几乎可在任何地方运行,包括桌面、物理服务器、VM 和云中。利用该运行时兼容性,可以轻松在不同环境之间移动容器化的应用程序。

由于容器是轻型的,因此它们不会像 VM 那样在启动或关闭时速度缓慢。因此,可以顺利且快速地重新部署和使用其他部署方案,如扩展或缩减。

(4)Application delivery

借助 Docker,我们可以将容器用作分发应用程序的单位。 这一概念可确保我们具有开发者团队和运营团队使用的标准化容器格式。开发者可以专注于开发软件,而运营团队可以专注于部署和管理软件。

在开发团队发布一版应用程序后,我们便可以在部署系统的每个步骤中使用容器。 容器非常适合用于持续集成,并且可以加快从构建到生产的时间。

(5)Management of hosting environments

我们在容器的内部配置应用程序的环境。由于这种包含关系,我们的运营团队可以更加密切地灵活管理应用程序的环境。我们的团队可以监视操作系统更新,应用一次安全补丁,并根据需要对容器进行更新。

此外,我们的团队还可以在不影响其他容器的情况下管理要安装、更新和删除的应用程序。每个容器都是隔离开的,并且其资源限制的分配与其他容器是分开的。

(6)Cloud deployments

Docker 容器是 Azure 容器化服务中使用的默认容器体系结构,在许多其他云平台上均受支持。
例如,可以将 Docker 容器部署到 Azure 容器实例、Azure 应用服务和 Azure Kubernetes 服务。以上的每个选项都提供了不同的特性与功能。
例如,通过 Azure 容器实例,你可以专注于设计和构建应用程序,没有管理基础设施(infrastructure)的开销。 当需要安排多个容器时,可以通过 Azure Kubernetes 服务轻松部署和管理大规模容器部署。

When not to use Docker containers

正如我们所见,Docker 容器为我们提供了许多好处。 请记住,容器不一定能满足你的所有需求。 需要注意以下几个方面:

(1)Security and virtualization

容器提供了一定程度的隔离。 但是,容器共享单个主机操作系统内核,这可能是一个缺点。
此外,我们还需要考虑存储和网络等配置方面的问题,确保我们考虑到了所有安全性方面。 例如,默认情况下,所有容器都将使用桥接网络,并且可以通过 IP 地址相互访问。
并非所有应用程序都将受益于容器化。在这些情况下,使用 VM 可能更为合适。

(2)Service monitoring

管理应用程序和容器比传统的 VM 部署更加复杂。通过日志记录功能,我们可以了解正在运行的容器的状态。 但是,我们很难监视有关容器内部运行中的服务的更详细信息。

例如,Docker 为我们提供了 docker stats 命令。 此命令返回有关容器的信息,例如 CPU 使用百分比、内存使用百分比、写入磁盘的 I/O、发送和接收的网络数据以及分配的进程 ID。 此信息作为即时数据流很有用,但是,由于不会存储数据,因此不会进行聚合。 我们必须安装第三方软件,以便在一段时间内捕获有意义的数据。

6. Summary

我们的目标是帮助你评估 Docker 容器是否适合你的业务流程。 我们介绍了 Docker 容器带来的一些优势,还探究了 Docker 不适用的一些情况。

你要寻找这样的一种容器化解决方案:只需很少配置或无需更改配置,即可在每个环境中提供最大的兼容性。 我们发现,Docker 是一种不错的解决方案,它使我们能够创建应用程序及其所有依赖项的快照。 然后,我们在开发、测试和生产环境中部署这一快照。

最后,Azure 提供了各种部署选项来托管 Docker 容器。在 Azure 中,容器可与其他 Azure 服务集成,从而拓展产品功能或与其他服务交换数据。

参考

Introduction to docker containers

本教程是对微软 Docker 入门文档的翻译,仅供学习交流使用。如有侵权,请联系删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Microsoft Learn: Docker入门教程 的相关文章

  • Cinder详解

    文章目录 理解cindercinder架构cinder apicinder volumecinder schedulervolume providercinder DB cinder设计思想 理解cinder 操作系统得到存储空间一般有两种
  • shell:重启&&关机

    文章目录 shutdownhaltpoweroffrebootinitsync shutdown 关机重启命令 shutdown h 10十分钟后关机shutdown h 0马上关机shutdown h now马上关机shutdown c取
  • 基于docker的Jenkins-Gitlab-Ansible实现自动化部署

    环境准备 安装docker xff0c 略 拉取Jenkins Gitlab镜像 docker pull jenkins docker pull gitlab ce 部署 Jenkins 生成Jenkins span class token
  • SSH远程登录出现的常见问题与解决方法

    运维工程师经常会使用ssh远程登录主机 ssh的使用并不复杂 xff0c 但是也有可能会遇到各种各样的错误 xff0c 我在本篇博文中总结了一些常见的ssh报错信息与解决方法 Connection refused 可能原因 xff1a 网络
  • 从两个角度理解Kubernetes基本概念

    想要理解Kubernetes集群首先要思考两个问题 xff1a 它是由什么组成的 它是怎样工作的 而想要搞清楚这两个问题我们可以在两个不同的层面寻找答案 从物理层面看 从直观的层面来看 xff0c Kubernetes将多个物理机或虚拟机汇
  • 基于CentOS 7.6搭建Kubernetes 1.17.3集群demo

    本demo仅涉及基本的Kubernetes功能实践与介绍 xff0c 无高可用配置 部署版本为当前时间阿里开源镜像站提供的最新版本1 17 3 文章目录 部署环境安装准备域名解析关闭SELinux和防火墙配置yum源时间同步禁用swap加载
  • 为Kubernetes部署dashboard组件

    dashboard是Kubernetes社区中一个很受欢迎的开源项目 xff0c 它可以为使用者提供一个可视化web界面来进行Kubernetes的管理和使用 环境信息 组件版本Kubernetesv1 17 3dashboardv2 0
  • linux UIO驱动实践

    linux UIO驱动实践 环境搭建platform 设备驱动UIO驱动 环境搭建 Ubuntu20地址 虚拟机安装与配置见博客开头 xff1a 驱动虚拟环境搭建记录 一直以为用镜像直接安装的Ubuntu没有内核源码 xff0c 不能用来编
  • STM32F429+FreeRTOS队列 串口DMA双缓存数据接收

    前言 最近做项目需要用到数据大量数据处理的应用场景 xff0c 本来想使用串口空闲中断 43 DMA传输 43 FreeRTOS队列的方式接收数据 xff0c 然而实际使用中发现效果不理想 xff0c 经常丢包 最后查明原因为在空闲中断频繁
  • 世界上最经典的25句话

    1 记住该记住的 xff0c 忘记该忘记的 改变能改变的 xff0c 接受不能改变的 2 能冲刷一切的除了眼泪 xff0c 就是时间 xff0c 以时间来推移感情 xff0c 时间越长 xff0c 冲突越淡 xff0c 仿佛不断稀释的茶 3
  • Makefile详解——从入门到精通

    转自ChinaUnix xff0c 作者gunguymadman xff0c 陈皓 链接地址 xff1a http www chinaunix net jh 23 408225 html 陈皓 CSDN 博客 xff1a http blog
  • FreeRTOS事件标志组与事件标志位使用

    事件标志位 事件位用于指示事件是否发生 也叫做事件标志位 可用位表示 xff1a 当信息收到且准备好处理时 xff0c 设置为1 xff1b 当没有收到信息且等待处理时 xff0c 设置为0 事件标志组 事件标志组是一组事件位 xff0c
  • 结合图片看常用串口通信UART

    结合图片看常用串口通信UART UART是一种通用串行数据总线 xff0c 用于异步通信 该总线双向通信 xff0c 可以实现全双工传输和接收 在嵌入式设计中 xff0c UART用于主机与辅助设备通信 xff0c 如汽车音响与外接AP之间
  • 浅谈面向对象设计思想,以及在Linux内核中的体现

    面向对象编程 xff08 OOP xff09 xff0c 是一种设计思想或者架构风格 OO语言之父Alan Kay xff0c Smalltalk的发明人 xff0c 在谈到OOP时是这样说的 xff1a OOP应该体现一种网状结构 xff
  • STM32F4移植FreeRTOS

    在之前的文章 xff1a FreeRTOS全解析 2 源码结构与移植 中我们已经讲解过FreeRTOS移植的方法 xff0c 并且给出了一个在ARM9上移植的例子 xff0c 今天再来看一个例子 xff1a 板子的芯片为STM32F407
  • 彻底掌握FreeRTOS中的任务

    FreeRTOS是个操作系统 xff0c FreeRTOS的任务 task 其实就是像我们电脑中的一个独立程序 xff0c 表现在源码中 xff0c 其实就是一个函数 本文从学会使用任务 task 到理解逐步深入 参考资料 xff1a Ma
  • FreeRTOS任务之调度器中的三种调度算法

    本文主要讲解FreeRTOS调度器中的三种调度算法 xff1a 基于时间片的抢占式调度 不带时间片的抢占式调度和协同调度 前导文章 xff1a FreeRTOS全解析 3 任务 xff08 task xff09 参考资料 xff1a Mas
  • 彻底理解FreeRTOS中的队列(Queue)

    队列 xff08 Queue xff09 提供了任务与任务之间通信的机制 在这样的场景 xff1a 一个或多个其他的任务产生数据 xff0c 主任务要依次处理数据 xff0c 队列就显得非常有用了 参考资料 xff1a Mastering
  • 简单路由器DIY

    一 关于路由器 路由器 xff08 Route xff09 是一种负责寻径的系统 xff0c 在互连网络中从多条路径中寻找通讯量最少的一条网络路径提供给用户通信 它使用寻径协议来获得网络信息 xff0c 采用基于 34 寻径矩阵 34 的寻
  • DOS那一代的程序员现在都干嘛呢?

    亿友论坛 DOS那一代的程序员现在都干嘛呢 xff1f xff08 几年前的老帖子 xff09 作者 xff1a 包子夹蛋 发布时间 xff1a 2005 5 10 14 01 00 DOS那一代的程序员现在都干嘛呢 xff1f xff08

随机推荐

  • switch case的用法

    switch case的用法如下 1 Switch用在编程中 xff0c 如C语言中它经常跟Case一起使用 xff0c 是一个判断选择代码 其功能就是控制流程流转的 直线翻译 xff1a switch语句 xff0c 即 切换 语句 xf
  • Rust嵌入式:只使用寄存器为STM32点灯;从查手册开始

    为什么是 只使用寄存器 网上很多教程都是直接调用对应芯片的HAL库 xff0c 让初学者认为操作都被Rust嵌入式开源组封装好了 xff0c 直接调就好 这在目前Rust嵌入式生态还不成熟的情况下可能是个误解 实际上Rust嵌入式有自己独特
  • epoll_wait 中timeout参数的损耗和如何避免

    ccd 100qps xff0c dcc 4wqps
  • ubuntu和windows双系统默认启动顺序

    在安装了双系统后 xff0c 一般的默认启动ubuntu xff0c 但我实际可能使用windows会比较多 xff0c 为解决这个问题 xff0c 必须要更改默认顺序 xff0c 以达到方便我们使用的效果 方法 xff1a 开机界面会有显
  • 深度学习优化算法

    深度学习各类优化器 借用古代炼丹的一些名词 xff0c 我们可以把训练模型中的数据比做炼丹药材 xff0c 模型比做炼丹炉 xff0c 火候比做优化器 那么我们知道 xff0c 同样的药材同样的炼丹炉 xff0c 但是火候不一样的话 xff
  • yolov3

    YOLOv3 YOLOv3的总体网络架构图 可根据官方代码中的yolov3 cfg进行一一对应 xff0c 标号 0 0 0 是第一个 convolutional Darknet 53 和DarkNet 19一样 xff0c 同样下采样32
  • SSH远程连接报错:kex_exchange_identification: Connection closed by remote host

    突然出现问题 xff1a kex exchange identification Connection closed by remote host 解决方法 删除known hosts xff0c 重启终端即可
  • Dronekit——Introduction

    Dronekit Introduction 参考 xff1a http python dronekit io about overview html 关于Dronekit DroneKit Python允许开发人员创建 在板载协同计算机上运
  • Run dronekit scripts by SITL on Linux 执行dronekit 脚本在Linux系统下模拟飞行

    参考 xff1a http ardupilot org dev docs setting up sitl on linux html Overview The SITL simulator allows you to run Plane C
  • SLAM从入门到放肆——SLAM简述

    SLAM 同时定位与建图 xff08 simultaneous localization and mapping xff0c SLAM xff09 是自动驾驶与增强现实领域中常用的技术 主要研究装置通过各种传感器在未知环境中的感知与定位问题
  • 关于NoDriveTypeAutoRun的键值

    最近在写一个修改注册表的驱动 xff0c 只是为了好玩 xff0c 也算是一个恶搞驱动吧 xff01 遇到一个问题 xff0c 花了我差不多两天的时间的 xff0c 详情往下看 写这篇文章 xff0c 为了记住这个教训 xff0c 一个提供
  • 闭包的实现原理和作用、以及内存泄露

    一 闭包的实现原理和作用 xff0c 可以列举几个开发中闭包的实际应用 1 闭包的概念 xff1a 指有权访问另一个函数作用域中的变量的函数 xff0c 一般情况就是在一个函数中包含另一个函数 2 闭包的作用 xff1a 访问函数内部变量
  • PX4 SITL Gazebo 仿真时 libgazebo_multirotor_base_plugin 插件运行时出错

    PX4 SITL Gazebo 仿真时 libgazebo multirotor base plugin 插件运行时出错 问题描述原因分析解决办法总结 问题描述 在 Gazebo 中进行 PX4 的软件在环仿真时 xff0c 执 make
  • Jetson AGX Xavier 正确上手教程

    概览 1 开机1 1 配件1 2 需要准备的器材1 3 连接设备 2 刷机2 1 更换主机的 apt get 源2 2 在主机上安装 SDK ManagerStep 1Step xff12 Step xff13 烧录 OS 镜像安装 SDK
  • Matplotlib绘图显示缺少中文字体-RuntimeWarning: Glyph 8722 missing from current font.

    pyplot 并不默认支持中文显示 xff0c 也没有自带中文字体 xff0c 因此需要自行下载所需字体 xff0c 并修改 rcParams 参数来显示中文 下面以 SimHei xff08 黑体 xff09 字体为例进行说明 说明 xf
  • Win10 系统安装 Linux 子系统教程(WSL2 + Ubuntu 20.04 + Gnome 桌面 )

    Win10 系统安装 Linux 子系统教程 WSL2 43 Ubuntu 20 04 43 Gnome 桌面 xff09 1 WSL 简介1 1 什么是 WSL xff1f 1 2 WSL1 与 WSL2 2 安装 WSL2 1 安装 W
  • Ubuntu 桌面美化教程

    将 Ubuntu 桌面美化成 Mac 风格 xff0c 效果如下 1 美化任务栏 Ubuntu 20 04 默认的任务栏在桌面左侧 xff0c 不使用时会自动隐藏 安装 plank dock 工具可以在桌面底部设置一个常驻任务栏 xff08
  • Git 图解教程

    Git 图解教程 基础篇 git 简介 安装与配置 安装 git 配置 git 创建版本库 跟踪修改 提交修改 比较文件 辅助命令 创建分支 合并分支 git merge git rebase 高级篇 移动提交记录 分离的 HEAD 相对引
  • Doxygen + Graphviz 代码自动化分析

    Doxygen 43 Graphviz 代码自动化分析 目录 1 实际需求2 工具简介3 使用说明4 代码注释规范5 参考 1 实际需求 在开发程序时 xff0c 需要编写对应的说明文档 在阅读现有的项目源代码时 xff0c 需要梳理函数间
  • Microsoft Learn: Docker入门教程

    Microsoft Learn Docker入门教程 1 Introduction2 What is Docker3 How Docker images work4 How Docker containers work5 When to u