Microsoft Learn: Docker入门教程

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 入门文档的翻译,仅供学习交流使用。如有侵权,请联系删除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值