管理和运行Docker容器

103 阅读5分钟

在靠近用户的地方部署容器

本工程教育(EngEd)计划由科支持。

在全球范围内即时部署容器。Section是经济实惠、简单而强大的。

免费开始

管理和运行Docker容器

5月24日, 2021

容器是模拟操作系统环境的工具,允许我们部署我们的应用程序,而不必担心(太多)不同的配置系统。

在接触到任何容器技术时,首先要与之互动的很可能是一个容器镜像。这是一个二进制包,包含了在容器内运行应用程序所需的所有文件。

我们可以决定从我们的本地机器上建立一个镜像,或者决定从一个镜像注册中心拉一个。无论哪种方式,你都可以运行这个镜像,以产生一个在容器中运行的应用程序。

你可以从Francisca Adekanye的这些文章中获得对Docker的良好介绍。

一个Docker镜像是由一系列的层(文件系统层)组成的,其中每一层都可以添加、删除或修改前一层的文件。这就形成了一个叠加的文件系统。

为了详细解释这一点,我们将看一下下面的数字。

.
└── container F: a machine's OS such as ArchLinux
    └── container G: build upon F, by adding library1 v2.1.15
        └── container H: build upon G, by adding library2 v1.9

这里,我们有三个容器。F、G和H。G和H是由F创建的,并共享容器F的文件。

你也可以从任何内部层继承。例如,如果我们通过添加其他版本的依赖关系来继承容器G,我们就会得到这样一个图。

. (continuing from above)
└── container G: build from #F, by adding library1 v2.1.15
    └── container I: inherited from #G and uses library3 v4.2.8
        └── container J: inherited from #I and uses library4 v3.2.1

镜像与提供设置环境和执行应用端点指示的配置文件相结合。

使用Dockerfiles构建应用程序镜像

Dockerfile 是一个文本文件,包含用户(开发者)在构建镜像时指定的命令。

让我们来看看下面这个创建轻量级镜像时的例子。

FROM alpine
MAINTAINER <your-name> <your-email>
COPY <application-directory> <destination>
ENTRYPOINT ["<entrypoint>"]

第一行表示我们正在用最薄的镜像创建容器。

第二行只是显示作者的详细信息:姓名和电子邮件。

第三行将文件从你系统上的应用目录复制到Docker容器的应用目录中。

最后一条语句包含了用于启动容器中运行的应用程序的命令(ENTRYPOINT),从你指向应用程序的地方开始。

在这种情况下,就是你把它复制到的地方。

你可以给这个文本文件命名为DockerFile

然后我们可以使用下面的命令格式来创建图像。

$ docker build -t <image-name>:<image-version> .

-t 定义了图像的标签。其他参数将是图像名称和版本。

比如说。

$ docker build -t sectionio-image:2.0 .

图像安全

我们应该仔细考虑我们镜像的安全性,并遵循最佳实践和建议。例如,我们不应该在图像的任何一层建立带有密码的容器,因为攻击者可能从含有密码的层中建立一个图像并开始一些恶意活动。

优化图像大小

我们还需要照顾到我们的图像所占用的空间。

请看下面的图。

.
└── layer F: contains a large file named 'MegaFile'
    └── layer G: removes 'MegaFile'
        └── layer H: builds on G

MegaFile 是仍然包含在F层中,意味着它要通过网络流量,这将最终削减性能。

当一个图像被删除时,它在集群中仍然可用,但无法访问。

我们可能遇到的另一个挑战是在建立和缓存我们的图像。每当一个图层被改变,它下面的所有其他图层都会改变。这意味着它们需要被重建、推送和再次拉动,以将你的图像部署到生产中。

为了进一步理解这一点,请考虑这两个数字。

.
└── layer F: contains anaconda configuration
    └── layer G: adds source code 'keras-test.py'
        └── layer H: installs the 'matplotlib' library

VERSUS:

.
└── layer F: contains anaconda configuration
    └── layer G: installs the 'matplotlib' library
        └── layer H: adds source code 'keras-test.py'

考虑在keras-test.py 上做的一些改变。在第一个图中,只有这个变化会被拉动或推送,而在另一个图中,keras-test.py 和包含matplotlib 包的层都需要被拉动和推送,因为matplotlib 层并不独立于在它上面的keras-test.py 层。

考虑我们镜像中各层的变化频率并适当排序以提高性能是一个很好的做法。

Docker容器的运行时间

Docker有一个CLI工具用于部署其容器。

下面是一个运行镜像的命令语法示例。

$ docker container run --publish 8080:80 <image-name>

启动镜像后,它将我们本地主机上的8080端口映射到我们容器中的80端口。

点击这里阅读更多关于docker run 命令的内容。

限制内存和CPU的使用

我们可以限制我们的资源利用率,并对我们的硬件资源实施公平的使用。

为了限制内存的使用,我们把--memory--memory-swap 标志放在docker run 命令中。

比如说。

$ docker run -d --name <your-image> \
--publish 8080:80 \
--memory 600m \
--memory-swap 2G \

在这里,我们将我们的图像限制在使用600MB的内存和2GB的交换空间。

我们通过使用--cpu-shares--cpu-period 标志对CPU做同样的限制。

考虑到四个容器。W有1024个cpu份额,而其余的每个有512个份额。当所有的容器都试图同时使用100%的CPU时,W将获得总CPU时间的50%,而其余的则各获得16.667%。

$ docker run -d --name <your-image> \
--memory 600m \
--memory-swap 2G \
--cpu-shares 1024 

--cpu-period 设置了图像对CPU的使用时间。它与--cpu-quota 一起工作,后者用于分配容器访问CPU资源的时间,以微秒为单位,由--cpu-period 指定的函数。

例如,为了设置每25ms的50%的CPU价值的运行时间,我们使用这个命令。

$ docker run -d --cpu-period=25000 --cpu-quota=12500 <your-image>

点击这里阅读更多关于资源利用的信息。

清理

删除一个图像可以通过使用docker rmi 命令来完成。

$ docker rmi <tag-name>

或者

$ docker rmi <image-id>

总结

本文简要介绍了Docker容器镜像以及如何管理它们。希望你能对应用镜像有一些了解,以及如何优化它们以提高性能。遵循文章中提供的链接来阅读更多内容。

有一个好的。

编码愉快!


同行评审的贡献。Geoffrey Mungai

类似文章

[

Continuous Integration and Deployment Pipelines with Flask Docker and Github Actions

容器

使用Flask、Docker和Github Actions的持续集成和部署管道

阅读更多

](www.section.io/engineering…

DevOps Pipeline Automation with Cloud Build and Triggers Hero Image

容器、API

使用Google Cloud Build和Triggers的DevOps管道自动化

阅读更多

](www.section.io/engineering…

Dockerizing an ASP.NET Core Web API app and SQL Server Hero Image

容器

容器的使用方法和注意事项

阅读更多

](www.section.io/engineering…)