Docker对软件开发生命周期产生了巨大影响,使大规模,轻松,安全地部署软件成为可能。 该Docker教程将涵盖运行,启动,停止和删除Docker容器的基础知识。
Docker使得在同一主机上使用不同操作系统上不同版本的不同编程语言的工作变得如此容易。
在Docker之后,您不必担心丢失系统配置或先决条件,就可以轻松地部署软件。
Docker VS虚拟机
如果您使用任何类型的虚拟机在其中运行工作,为什么需要Docker在其中运行工作? 好…
它们之间的主要区别在于,Docker是一个在本机OS中运行的隔离进程 ,而虚拟机是一个在主机OS之上运行的完整的隔离OS ,这需要花费更多的时间来加载。 因此,Docker具有优于虚拟机的优势,例如:
- 装车速度
- 与虚拟机不同,所需的硬件资源很小。
- 在同一OS上同时运行多个Docker容器。
- 您可以修改容器并进行部署,也可以将Docker文件定义提供给朋友以开始在同一环境中工作。
实际上,Docker并不是虚拟机的替代品,它可以解决特定的问题。
假设您的应用程序需要3个或多个在不同操作系统上运行的服务,因此可以在同一主机上平稳运行3个容器,而不是在同一主机上运行3个虚拟机。 听起来不错!
运行你的容器
在开始之前,请确保正确安装了Docker并准备接受您的命令。 在新的“终端”窗口中键入以下命令:
$ docker -v
上面的命令输出您的PC上安装的Docker的版本:
Docker version 17.12.0-ce-rc2, build f9cde63
开始运行容器的时间:
$ docker container run alpine echo "Hello World"
首次运行上述命令时,应在“终端”窗口中看到类似于以下内容的输出:
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
2fdfe1cd78c2: Pull complete
Digest: sha256:ccba511b...
Status: Downloaded newer image for alpine:latest
Hello World
那很容易,不是吗? 尝试再次运行同一命令:
$ docker container run alpine echo "Hello World"
第二次,第三次或第n次运行上述命令时,您应该在终端中仅看到以下输出:
$ Hello World
现在您已经成功运行了容器,现在该分析发生了什么。 查看以下命令:
$ docker container run alpine echo "Hello World"
此命令包含多个部分。 首先,您有单词docker。 这是Docker 命令行界面 ( CLI )的名称,用于与负责运行容器的Docker引擎进行交互。
接下来,您将使用单词container,该容器指示您正在使用的上下文。
接下来是要在给定上下文中执行的实际命令,该命令将运行。
现在,您还需要告诉Docker运行哪个容器。 在这种情况下,这就是所谓的高山容器。
最后,您需要定义在容器运行时应在容器内部执行什么样的过程或任务。 这是命令的最后一部分,回显“ Hello World”。
在容器内运行进程
既然您已经了解了运行容器的命令的各个部分,请尝试运行另一个容器,并在其中运行其他进程:
$ docker container run centos ping -c 5 127.0.0.1
这是输出:
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
85432449fd0f: Pull complete
Digest: sha256:3b1a65e9a05...
Status: Downloaded newer image for centos:latest
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.022 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.019 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.029 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.030 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.029 ms
--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4103ms
在上一个示例中,您使用的容器映像是centos,在centos容器中执行的进程是ping -c 5 127.0.0.1,它将ping通回送地址五次,直到停止为止。
- 第一行如下:
Unable to find image 'centos:latest' locally
这告诉您Docker在系统的本地缓存中找不到名为centos:latest的映像。 因此,Docker知道它必须从存储容器映像的某些注册表中提取映像。
默认情况下,对Docker环境进行配置,以便从hub.docker.com上的Docker Hub提取图像。 这由第二行表示,如下所示:
latest: Pulling from library/centos
- 接下来的三行输出如下:
85432449fd0f: Pull completeDigest: sha256:3b1a65e9a05...Status: Downloaded newer image for centos:latest
这告诉您Docker已成功从Docker Hub提取映像centos:latest。
输出的所有后续行均由您在容器(在此情况下为ping工具)内部运行的过程生成。
您可能还注意到最新关键字出现了几次。 每个映像都有一个版本(也称为标签),如果您未明确指定版本,则Docker会自动将其视为最新版本。
如果您在系统上再次运行前面的容器,则输出的前五行将丢失,因为Docker会在本地找到缓存的容器映像,因此不必先下载它。 试试看并验证。
运行随机报价容器
为了运行随机报价容器,您需要一种产生随机报价的算法。 可以在https://talaikis.com/random_quotes_api/中找到产生这些免费随机报价的API。
现在的目标是让一个进程在容器内运行,该进程每五秒钟产生一个新的随机报价,并将报价输出到STDOUT :
while :
do
wget -qO- https://talaikis.com/api/quotes/random
printf 'n'
sleep 5
done
通过按Ctrl + C停止脚本。 这是输出:
{"quote":"Martha Stewart is extremely talented. He
每个响应都是一个JSON格式的字符串,带有引号,其作者和类别。
现在,将其作为后台程序在高山容器中运行。 为此,您需要将前面的脚本压缩为单行,然后使用/bin/sh -c "..."
语法执行它。 Docker表达式将如下所示:
$ docker container run -d --name quotes alpine \ /bin/sh -c "while :; do wget -qO- https://talaikis.com/api/quotes/random; printf '\n'; sleep 5; done"
在上面的表达式中,您使用了两个新的命令行参数-d和–name。 -d告诉Docker将运行在容器中的进程作为Linux守护程序运行 。 –name参数可用于为容器指定一个明确的名称。
如果您未指定显式容器名称,则Docker将自动为容器分配一个随机但唯一的名称。 该名称将由著名科学家和形容词的名称组成。
这样的名称可能是boring_borg或Angry_goldberg。 很幽默, 不是吗?
重要的一点是容器名称必须唯一。 确保引号容器已启动并正在运行:
$ docker container ls -l
前面输出的重要部分是STATUS列,在这种情况下,该列为Up 16秒。 这意味着该容器现在已经启动并运行了16秒钟 。
列出容器
随着时间的推移继续运行容器,您最终将在系统中获得很多容器。 要了解主机上当前正在运行什么,可以使用container ls命令,如下所示:
$ docker container ls
这将列出所有当前正在运行的容器。
默认情况下,Docker输出七列,其含义如下:
柱 | 描述 |
货柜编号 | 容器的唯一ID。 它是SHA-256。 |
图片 | 实例化此容器的容器映像的名称。 |
状态 | 容器的状态(已创建,正在重新启动,正在运行,正在删除,已暂停,已退出或已失效)。 |
港口 | 已映射到主机的容器端口列表。 |
名字 | 分配给此容器的名称(可以使用多个名称)。 |
如果要列出系统上定义的所有容器,则可以使用命令行参数-a或–all,如下所示:
$ docker container ls -a
这将列出处于任何状态的容器,无论是创建,运行还是退出的容器。
有时,您可能只想列出所有容器的ID。 为此,您具有-q参数:
$ docker container ls -q
您可能想知道这在哪里有用。 这是一个例子:
$ docker container rm -f $(docker container ls -a -q)
上面的命令将删除系统上当前定义的所有容器,包括已停止的容器。 rm命令代表remove,它将在本教程中进一步说明。
在上一节中,您在list命令中使用了-l参数。 尝试使用Docker帮助来找出-l参数代表什么。 您可以按以下方式为list命令调用帮助:
$ docker container ls -h
停止和启动容器
有时,您可能需要暂时停止正在运行的容器。 使用以下命令在引号容器中进行尝试:
$ docker container run -d --name quotes alpine \ /bin/sh -c "while :; do wget -qO- https://talaikis.com/api/quotes/random; printf '\n'; sleep 5; done"
现在,您可以使用以下命令停止该容器:
$ docker container stop quotes
当您尝试停止引号容器时,您可能会注意到,直到执行它需要一段时间(约10秒)。 为什么会这样呢? Docker将Linux SIGTERM信号发送到容器内运行的主进程。
如果该进程仍未自行终止,则Docker等待10秒钟,然后发送SIGKILL,这将强制终止该进程并终止该容器。
在上面的命令中,容器的名称用于指定要停止的容器。 也可以使用容器ID。
您如何获得容器ID?
有几种方法可以这样做。 手动方法是列出所有正在运行的容器,然后在列表中找到您要查找的容器。 只需从那里复制其ID。
一种更自动化的方法是使用Shell脚本和环境变量 。 例如,如果要获取报价容器的ID,请参见以下示例:
$ export CONTAINER_ID = $(docker container ls | grep quotes | awk '{print $1}')
在这里,我们使用AWK来获取第一个字段,即容器ID。 现在,您可以在表达式中使用$ CONTAINER_ID变量,而不必使用容器名称:
$ docker container stop $CONTAINER_ID
停止容器后,其状态将更改为“已退出”。
您可以使用docker container start命令重新启动已停止的容器。
取出容器
运行docker container ls -a命令时,您会看到很多处于“退出”状态的容器。
如果您不再需要这些容器,最好将它们从内存中删除。 否则,它们不必要地占用了宝贵的资源。 删除容器的命令如下:
$ docker container rm <container ID>
或者,您也可以使用以下命令:
$ docker container rm <container name>
有时,删除正在运行的容器将无效。 如果要强制删除,则可以使用命令行参数-f或–force。
集装箱化通过减少50%以上的维护成本和90%左右的上市时间,改变了行业的运营方式。 此外,与在容器外部运行它们相比,容器使应用程序更安全。
如果您认为本教程很有帮助,并且想了解有关Docker容器的更多信息,则可以从Learn Docker – Docker 18.x基础知识中了解更多信息 ,该文章介绍了与容器化和编排有关的所有关键概念。
继续回来。 谢谢。
翻译自: https://www.javacodegeeks.com/2018/07/docker-tutorial-containers.html