Docker 和容器简介






4.29/5 (9投票s)
这是关于 Docker 和容器的介绍。
Docker 究竟是什么?
当我们必须安装软件时,需要考虑很多事情。对于不同的操作系统及其不同版本,有许多不同版本的软件可用。您必须通过文档进行选择,选择最适合您需求的版本,然后运行可执行文件。即使在此之后,您可能还需要完成其他一些步骤才能使用该软件。Docker 运行容器,这些容器包含软件以及软件运行所需的其他附加项。因此,这意味着您只需使用一个 ‘docker run
’ 命令加上您要安装的镜像名称,即可在自己的容器中使用自己的资源运行软件。您无需担心哪个软件版本适合您的操作系统等。我将通过 MongoDB 安装示例来演示这一点。
作为 IT 开发人员,Docker 对我有什么重要性?
嗯,开发人员可以简单地编写他们的代码并创建一个镜像。这个镜像将包含应用程序运行所需的所有工具。这个镜像只需部署到一台没有任何预装软件的生产机器上,应用程序就能像在开发机器上一样运行。
那么我们到底如何使用 Docker 呢?
一旦我们在系统上安装了 Docker,我们就可以去 Docker Hub 或其他注册中心。搜索您要安装的软件。然后,您可以使用 PowerShell 命令 docker run imageName
来运行,软件就可以供您使用了。
容器和 Docker 有什么区别?
是的,这两个术语经常被互换使用。但它们的意思不同。容器是自包含的进程,包括正在运行的软件及其依赖项等。容器在 Linux 中已经存在了很长时间,但当时并没有被广泛使用。根据 Docker 的官方 网站 – Docker 是“一个供开发人员和系统管理员使用容器来开发、部署和运行应用程序的平台”。所以总而言之,Docker 帮助我们维护容器,而容器是运行应用程序的进程。
容器的优点
如上所述,以容器形式运行可以简化运行软件和应用程序的过程。假设您有一个 ASP.NET 应用程序。开发人员可以创建工作应用程序的镜像。这个镜像将包含应用程序、ASP.NET Framework 等。现在,这个镜像可以作为容器部署到不需要任何其他预装项的生产机器上。应用程序运行所需的一切都将包含在容器中。容器将在所有系统上以相同的方式运行。所以您将不再遇到诸如应用程序在开发环境中运行但生产环境中失败的问题。
容器和虚拟机
容器和虚拟机看起来可能一样,但它们却大不相同。容器将仅包含应用程序所需的工具,并将与宿主操作系统内核共享给其他容器。但虚拟机则拥有自己完全独立的操作系统。由于容器没有自己完整的操作系统,因此它们比虚拟机更轻量级。
Docker 引擎
Docker 官方 网站 用下图解释了 Docker 引擎
Docker 引擎由客户端和服务器组成。我们用户使用 Docker CLI(也是客户端)与服务器进行交互。客户端通过 Docker Rest API 与服务器交互。服务器或 Docker 守护程序负责运行容器。当用户从 Docker CLI 输入命令时,例如 docker run imagename
命令,Docker 守护程序将接收到请求。守护程序将在本地查找镜像,如果找到,它将将其作为容器运行。可以将镜像视为可执行文件。如果在本地找不到镜像,守护程序将在注册中心查找,然后将其作为容器运行。
安装 Docker
现在,让我们开始实际探索 Docker。您需要 Windows 10 专业版或企业版,并且至少有 4 GB RAM 才能安装 Docker。由于我没有 Windows 10 专业版,因此我在 Azure 中创建了一个虚拟机。以下是步骤
转到 Azure 门户并单击虚拟机。
选择一台 Windows 10 专业版机器。并非所有虚拟机都支持嵌套虚拟化。因此,我选择了一个 D2s_v3 大小的虚拟机。选择支持嵌套虚拟化的虚拟机大小对于运行 Docker 很重要。
此外,请确保在入站和出站端口规则中,允许通过 RDP 的所有连接;否则,您可能无法通过 RDP 连接。
如果您尝试从办公室访问 Azure,可能会遇到问题。您可能需要联系您的系统管理员以打开这些端口。一旦我们的虚拟机启动并运行,我们就需要安装 Docker。访问 此处 安装适用于 Windows 的 Docker。
安装完上述软件后,您的系统将重启,Docker 会要求您启用 Hyper-V。点击“是,重新启动系统”。
默认情况下,将启用 Linux 容器。您可以通过点击下面的鲸鱼图标来切换容器。
转到 PowerShell 并输入 docker run hello-world
然后按 Enter。您应该会看到一条消息 ‘Hello from Docker
’,这意味着您的 Docker 已正确安装。
阅读上面截图中提到的步骤。这正是我们之前讨论过的。
如果您尝试在工作场所运行 Docker,可能会遇到一些代理相关的问题。您可以通过导航到设置来设置代理。
演示:将您的 ASP.NET 应用程序运行为容器
在 Visual Studio 2017 中创建一个新的 ASP.NET MVC Core 项目。创建时,请确保选中“启用 Docker 支持”选项。
我将我的应用程序命名为 aspnetapp
。启用 Docker 支持后,会在解决方案资源管理器中创建一个名为 dockerfile 的文件。
将此文件中的现有代码替换为以下代码片段
FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
转到 PowerShell 并导航到项目目录。到达那里后,运行命令
docker build -t aspnetapp .
项目构建完成后,运行以下命令
docker run -d -p 8080:80 --name myaspnetapp aspnetapp
一旦成功,请转到 localhost:8080 来访问该应用程序
这里发生了什么?Dockerfile 提供了创建镜像所需的信息。例如,它说明镜像应该以 Microsoft/dotnet:aspnetcore 作为基础镜像创建。运行 build
命令时会创建一个应用程序镜像。如果您在 PowerShell 中键入以下命令,您将看到列出的镜像。
Docker images
当您使用 docker run
命令运行镜像时,它会将此镜像运行为一个名为 myaspnetapp
的容器,而 aspnetapp
是镜像名称。run
命令指示它在端口 8080 上运行。因此,当您访问 localhost:8080
时,您会找到正在运行的容器化应用程序。您可以使用命令 docker ps
来查看所有正在运行的容器。
有关此演示的更多信息,请参考官方 Docker 网站 此处。
因此,开发人员可以创建自己的镜像并将其上传到仓库。当应用程序需要上线时,这个镜像就可以直接在生产机器上运行。
现在让我们看看如何在容器中运行 MongoDB。
演示:安装 MongoDB
安装软件的传统方式
现在让我们使用传统方法安装 Mongo。如果我们去它的 文档,它将列出安装 MongoDB 所需的步骤,包括运行可执行文件、通过安装程序进行设置等。安装 MongoDB 是一个漫长的过程。
现在让我们看看 Docker 如何简化这个过程。
将软件作为容器运行
转到 Docker Hub 并搜索 Mongo。
在我们运行命令之前,请点击鲸鱼图标,转到设置 -> 守护程序,并将实验性标志设置为 true
。
完成后,Docker 将重启。然后您可以在 PowerShell 或命令提示符中输入以下命令。
docker run --name some-mongo -d mongo:4.1
在这里,Docker 安装了一个名为 some-mongo
的容器。您可以根据需要给出其他名称。Mongo
是镜像名称,4.1
是其版本或标签。
它显示已下载一个新镜像。
让我们使用以下命令运行下载的镜像
docker run some-mongo
我们将收到消息 waiting for connections on port 27017
,这意味着我们的服务器已启动并运行。
所以,打开另一个 PowerShell 实例并运行以下命令
docker exec -it some-mongo mongo
然后输入命令
show dbs
这表明我们服务器中尚未创建任何数据库。现在我们可以继续在此处执行其他 MongoDB 命令。
所以我们看到 Docker 简化了软件的安装过程。
屏幕后面发生了什么?
您的操作系统可以分为两个主要部分:内核和用户空间。内核控制硬件,包括驱动程序等。除内核之外的所有内容,如我们的应用程序、操作系统应用程序以及此应用程序所需的库等,都属于用户空间。用户空间通过内核访问硬件。
传统上,当我们安装软件时,我们只是安装应用程序,并使用用户空间中已有的驱动程序和库。但现在有了容器化方法,当创建一个镜像时,它将包含应用程序以及运行它所需的其他驱动程序。因此,应用程序将独立于操作系统提供的资源。
Docker 命令
docker run imagename
这将运行指定的镜像。这相当于在传统软件中运行可执行文件。
docker –help
这将列出所有可用的 Docker 命令。
docker ps
这将列出当前正在运行的容器。目前,如果我们尝试在 PowerShell 中键入此命令,我们将得到以下输出
docker ps -a
这将列出所有正在运行和已退出的容器。
docker stop containername
这将停止软件。docker ps -a
将把容器列为已停止,但 docker ps
不会列出它。
docker rm containername
这将删除容器。这就像在传统意义上卸载软件。docker ps -a
& docker ps
都不会列出它,因为容器已被删除。
docker images
这将列出已下载的镜像。在传统软件安装方法中,镜像就像可执行文件。
有关更多 Docker 命令,请访问 此处。
如何将镜像上传到 Docker Hub?
在上面的第一个演示中,我们为 ASP.NET Core 创建了一个本地存储的镜像。现在我们来看看如何将镜像上传到 Docker Hub。首先,您需要在 Docker Hub 上创建一个免费帐户。然后创建一个仓库。
如下从 PowerShell 登录
docker login
然后运行以下命令
在 docker tag 命令中,aspnetapp
是镜像名称。然后是我的 username/repository:tag
。
一旦将此镜像推送到 Docker Hub,您就可以登录在那里,然后在浏览器中看到该镜像。
我希望这篇文章能让您更接近揭开 Docker 的神秘面纱。如果您想进一步讨论,请随时与我联系。
本文最初发布于我的 网站。
历史
- 2019 年 4 月 7 日:初版