下图显示了虚拟化的标准和传统架构。
服务器是用于托管多个虚拟机的物理服务器。
主机操作系统是Linux或Windows等基本机器。
管理程序是用于托管虚拟机的VMWare或Windows Hyper V。
然后,您可以将多个操作系统作为虚拟机安装在作为来宾OS的现有虚拟机管理程序之上。
然后,您将在每个客户操作系统上托管您的应用程序。
下图显示了通过Dockers启用的新一代虚拟化。我们来看看各个层次。
服务器是用于托管多个虚拟机的物理服务器。所以这一层保持不变。
主机操作系统是Linux或Windows等基本机器。所以这一层保持不变。
现在是新一代Docker引擎。这用于运行早期用作虚拟机作为Docker容器的操作系统。
所有的应用程序现在都作为Docker容器运行。
这种体系结构的明显优势在于,您不需要为Guest OS提供额外的硬件。一切都作为Docker容器。
Docker引擎的好处在于它可以在各种操作系统上运行。我们已经在Windows上看到了安装,并看到了Linux系统上的所有Docker命令。现在我们来看看Windows操作系统上的各种Docker命令。
我们在Windows主机上运行Docker images命令。
从这里,我们可以看到我们有两个图像 - ubuntu和hello-world。
现在让我们在Windows Docker主机中运行一个容器。
我们可以看到,通过运行容器,我们现在可以在Windows主机上运行Ubuntu容器。
让我们列出Windows主机上的所有容器。
现在让我们停止Windows主机上正在运行的容器。
所以你可以看到Docker引擎对于不同的Docker主机是非常一致的,它在Windows上的工作原理与它在Linux上的工作方式相同。
在本章中,我们将看看配置Docker的不同选项。
该命令用于停止Docker daemon进程。
service docker stop
没有
显示Docker进程已停止的消息。
sudo service docker stop
当我们运行上面的命令时,它会产生以下结果 -
该命令用于启动Docker守护进程。
service docker start
没有
显示Docker进程已启动的消息。
sudo service docker start
当我们运行上面的命令时,它会产生以下结果 -
默认情况下,当你启动一个容器时,你将在启动容器时使用一个shell命令,如下所示。这是我们在之前的章节中看到的有关容器工作的内容。
在上面的截图中,您可以观察到我们已经发出了以下命令 -
sudo docker run –it centos /bin/bash
我们使用这个命令来创建一个新的容器,然后使用Ctrl + P + Q命令退出容器。它确保即使在我们离开容器后容器仍然存在。
我们可以通过Docker ps命令验证容器是否仍然存在。如果我们不得不直接退出容器,那么容器本身就会被销毁。
现在有一种更容易的方法来附加到容器并干净地离开它们,而不需要销毁它们。达到此目的的一种方法是使用nsenter命令。
在我们运行nsenter命令之前,您需要先安装nsenter映像。它可以通过使用以下命令完成 -
docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter
在使用nsenter命令之前,我们需要获取容器的进程ID,因为这是nsenter命令所要求的。我们可以通过Docker 检查命令获取进程ID 并通过Pid进行过滤。
如上图所示,我们首先使用docker ps命令查看正在运行的容器。我们可以看到有一个运行的容器,其ID为ef42a4c5e663。
然后,我们使用Docker inspect命令检查此容器的配置,然后使用grep命令过滤进程ID。从输出中,我们可以看到进程ID是2978。
现在我们有了进程ID,我们可以继续前进并使用nsenter命令将其连接到Docker容器。
该方法允许在不退出容器的情况下附着到容器。
nsenter -m -u -n -p -i -t containerID command
-u用于提及Uts命名空间
-m用于提到mount名称空间
-n用于提及network名称空间
-p用于提及process名称空间
-i s到使交互模式的容器运行在。
-t用于将容器的I / O流连接到主机操作系统。
containerID - 这是容器的ID。
Command - 这是在容器中运行的命令。
没有
sudo nsenter –m –u –n –p –i –t 2978 /bin/bash
从输出中,我们可以观察到以下几点 -
当我们发出nsenter命令时,提示会直接更改为bash shell。
然后我们发出退出命令。现在通常如果你没有使用nsenter命令,容器将被销毁。但是你会注意到,当我们运行nsenter命令时,容器仍然运行。
在前面的章节中,我们已经看到各种Image文件,例如从Docker hub下载的Centos ,您可以从中启动容器。下面再一个例子。
如果我们使用Docker images命令,我们可以在系统中看到现有的图像。从上面的截图中,我们可以看到有两个图像:centos和nsenter。
但是,Docker也为您提供了创建自己的Docker镜像的功能,并且可以在Docker文件的帮助下完成。Docker文件是一个简单的文本文件,其中包含有关如何构建图像的说明。
以下步骤解释了您应该如何创建Docker文件。
第1步 - 创建一个名为Docker File的文件并使用vim进行编辑。请注意,文件的名称必须是“Dockerfile”,其中“D”为大写。
第2步 - 使用以下说明构建Docker文件。
#This is a sample Image FROM ubuntu MAINTAINER [email protected] RUN apt-get update RUN apt-get install –y nginx CMD [“echo”,”Image created”]
关于上述文件需要注意以下几点 -
第一行“#This是一个示例图像”是一条评论。您可以在#命令的帮助下向Docker文件添加注释
下一行必须以FROM关键字开头。它告诉码头,你想从哪个基础图像中获取图像。在我们的例子中,我们从ubuntu镜像创建一个镜像。
下一个命令是要维护这个图像的人。您在此指定MAINTAINER关键字并只提及电子邮件ID。
的RUN命令用于运行针对所述图像的指令。在我们的例子中,我们首先更新我们的Ubuntu系统,然后在我们的Ubuntu映像上安装nginx服务器。
最后一条命令用于向用户显示消息。
第3步 - 保存文件。在下一章中,我们将讨论如何构建图像。
我们在上一章中创建了Docker文件。现在是构建Docker文件的时候了。Docker文件可以使用以下命令构建 -
docker build
让我们更多地了解这个命令。
这种方法允许用户构建他们自己的Docker镜像。
docker build -t ImageName:TagName dir
-t - 是为image提一个标签
ImageName - 这是你想要给你的图像的名称。
TagName - 这是您想要给图片的标签。
Dir - Docker文件所在的目录。
没有
sudo docker build –t myimage:0.1
这里,myimage是我们给图片的名称,0.1是我们给图片的标签号码。
由于Docker文件位于当前工作目录中,因此我们使用“。” 在表示当前工作目录的命令结尾处。
从输出中,您将首先看到Ubuntu Image将从Docker Hub下载,因为机器上没有本地可用的映像。
最后,构建完成后,所有必要的命令都会在映像上运行。
您将看到成功构建的消息和新图像的ID。当您运行Docker images命令时,您将能够看到新图像。
您现在可以从新图像构建容器。
公共存储库可用于托管其他人可以使用的Docker映像。一个例子是Docker Hub中可用的图像。像Centos,Ubuntu和Jenkins等大多数图像都是公开可用的。我们还可以通过将它发布到Docker Hub上的公共存储库来使我们的图像可用。
对于我们的示例,我们将使用“构建Docker文件”一章中构建的myimage存储库并将该图像上传到Docker Hub。我们先来看看我们的Docker主机上的图像,看看我们可以推送到Docker注册表。
在这里,我们有我们的myimage:0.1图像,它被创建为“Building Docker Files”一章的一部分。我们用它来上传到Docker公共存储库。
以下步骤说明如何将图像上传到公共存储库。
第1步 - 登录到Docker Hub并创建您的存储库。这是存储图像的存储库。转到https://hub.docker.com/并使用您的凭据登录。
第2步 - 在上面的屏幕上点击“Create Repository”按钮,并创建一个名为demorep的仓库。确保存储库的可见性是公开的。
一旦创建了存储库,记下连接到存储库的pull命令。
将在我们的仓库中使用的pull命令如下所示 -
docker pull demousr/demorep
第3步 - 现在回到Docker主机。在这里,我们需要将我们的myimage标记为在Docker Hub中创建的新存储库。我们可以通过Docker 标签命令来做到这一点。
我们将在本章后面详细了解这个标签命令。
第4步 - 发出Docker登录命令从命令提示符登录到Docker Hub存储库。Docker登录命令将提示您输入Docker Hub存储库的用户名和密码。
第5步 - 图像标记完成后,现在是时候将图像推送到Docker Hub存储库。我们可以通过Docker push命令执行此操作。本章后面我们将更多地了解这个命令。
该方法允许将图像标记到相关存储库。
docker tag imageID Repositoryname
imageID - 这是需要标记到存储库的ImageID。
Repositoryname - 这是ImageID需要标记到的存储库名称。
没有
sudo docker tag ab0c1d3744dd demousr/demorep:1.0
上面的例子的输出示例如下。
该方法允许将图像推送到Docker Hub。
docker push Repositoryname
Repositoryname - 这是需要推送到Docker Hub的存储库名称。
存储库的长ID被推送到Docker Hub。
sudo docker push demousr/demorep:1.0
如果您返回Docker Hub页面并转至您的存储库,则会在存储库中看到标记名称。
现在让我们尝试将我们上传到我们的Docker主机上的存储库。首先,从本地Docker主机中删除图像myimage:0.1和demousr / demorep:1.0。我们使用Docker pull命令从Docker Hub中提取存储库。
从上面的屏幕截图中,您可以看到Docker pull命令从Docker Hub获取了我们的新存储库并将其放置在我们的计算机上。
在Docker中,容器本身可以使应用程序在端口上运行。在运行容器时,如果要通过端口号访问容器中的应用程序,则需要将容器的端口号映射到Docker主机的端口号。我们来看看如何实现这个目标的例子。
在我们的例子中,我们将从Docker Hub下载Jenkins容器。然后,我们将把Jenkins端口号映射到Docker主机上的端口号。
第1步 - 首先,您需要在Docker Hub上进行简单的注册。
第2步 - 注册后,您将登录到Docker Hub。
第3步 - 接下来,让我们浏览并找到Jenkins图像。
第4步 - 如果您在同一页面上向下滚动,您可以看到Docker pull命令。这将用于将Jenkins图像下载到本地Ubuntu服务器上。
第5步 - 现在去Ubuntu服务器并运行命令 -
sudo docker pull jenkins
第6步 - 要了解容器暴露的端口,应该使用Docker inspect命令检查映像。
现在让我们更多地了解这个检查命令。
此方法允许您返回容器或图像的低级信息。
docker inspect Container/Image
Container/Image - 要检查的容器或图像
JSON格式的图像或容器的低级信息。
sudo docker inspect jenkins
在输出检查命令给出一个JSON输出。如果我们观察输出结果,我们可以看到有一段“ExposedPorts”,并且看到有两个端口被提及。一个是8080 的数据端口,另一个是50000 的控制端口。
要运行Jenkins并映射端口,您需要更改Docker 运行命令并添加指定端口映射的“p”选项。所以,你需要运行下面的命令 -
sudo docker run -p 8080:8080 -p 50000:50000 jenkins
端口号映射的左侧是要映射到的Docker主机端口,右侧是Docker容器端口号。
当您打开浏览器并导航到端口8080上的Docker主机时,您将看到Jenkins启动并运行。
您可能需要拥有自己的私有存储库。您可能不希望托管Docker Hub上的存储库。为此,Docker有一个存储库容器本身。我们来看看我们如何下载和使用注册表的容器。
第1步 - 使用Docker 运行命令下载私有注册表。这可以使用以下命令完成。
sudo docker run –d –p 5000:5000 –-name registry registry:2
关于上述命令需要注意以下几点 -
注册表是由Docker管理的容器,可用于托管私有存储库。
容器公开的端口号为5000.因此,使用-p命令,我们将同一端口号映射到本地主机上的5000端口号。
我们只是将注册表容器标记为“2”,以区分它在Docker主机上。
该-d选项用于运行分离模式的容器。这是为了容器可以在后台运行
第2步 - 让我们做一个docker ps,看看注册表容器确实在运行。
我们现在已经确认注册表容器确实在运行。
第3步 - 现在让我们标记一个现有的图像,以便我们可以将其推送到我们的本地存储库。在我们的示例中,由于我们有本地可用的centos映像,因此我们将其标记到我们的私有存储库并添加一个标记名称为centos。
sudo docker tag 67591570dd29 localhost:5000/centos
关于上述命令需要注意以下几点 -
67591570dd29引用了centos映像的映像ID 。
localhost:5000是我们私有存储库的位置。
我们将存储库名称标记为我们私有存储库中的centos。
第4步 - 现在让我们使用Docker push命令将存储库推送到我们的私有存储库。
sudo docker push localhost:5000/centos
在这里,我们将centos映像推送到localhost:5000托管的私有存储库。
第5步 - 现在让我们使用docker rmi命令删除我们拥有的用于centos的本地映像。然后我们可以从我们的私人存储库下载所需的centos映像。
sudo docker rmi centos:latest sudo docker rmi 67591570dd29
第6步 - 现在我们的本地计算机上没有任何centos映像,现在我们可以使用以下Docker pull命令从我们的私有存储库中提取centos映像。
sudo docker pull localhost:5000/centos
在这里,我们将centos映像拉到localhost:5000托管的私有存储库中。
如果你现在看到系统中的图像,你也会看到centos图像。
我们已经学会了如何使用Docker File来构建我们自己的自定义图像。现在让我们看看我们如何构建一个可用于构建容器的Web服务器映像。
在我们的例子中,我们将使用Ubuntu上的Apache Web服务器来构建我们的图像。让我们按照下面给出的步骤构建我们的Web服务器Docker文件。
第1步 - 第一步是构建我们的Docker文件。让我们使用vim并使用以下信息创建一个Docker文件。
FROM ubuntu RUN apt-get update RUN apt-get install –y apache2 RUN apt-get install –y apache2-utils RUN apt-get clean EXPOSE 80 CMD [“apache2ctl”, “-D”, “FOREGROUND”]
以上几点需要注意以下几点 -
我们首先创建我们的图像来自Ubuntu的基本映像。
接下来,我们将使用RUN命令更新Ubuntu系统上的所有软件包。
接下来,我们使用RUN命令在我们的映像上安装apache2。
接下来,我们使用RUN命令在我们的映像上安装必要的实用程序apache2软件包。
接下来,我们使用RUN命令来清除系统中不必要的文件。
EXPOSE命令用于将容器中Apache的80端口暴露给Docker主机。
最后,CMD命令用于在后台运行apache2。
现在已输入文件详细信息,只需保存该文件即可。
第2步 - 运行Docker build命令来构建Docker文件。它可以使用以下命令完成 -
sudo docker build –t=”mywebserver” .
我们将我们的图片标记为mywebserver。一旦图像被构建,您就会得到一个成功的消息,即该文件已经被构建。
第3步 - 现在Web服务器文件已经建好,现在是从图像创建容器的时候了。我们可以用Docker 运行命令来做到这一点。
sudo docker run –d –p 80:80 mywebserver
关于上述命令需要注意以下几点 -
容器公开的端口号为80.因此,使用-p命令,我们将同一端口号映射到本地主机上的80端口号。
该-d选项用于运行分离模式的容器。这是为了容器可以在后台运行。
如果您在Web浏览器中访问Docker主机的端口80,您现在将看到Apache已启动并正在运行。
Docker有许多指令命令。这些是放在Docker文件中的命令。我们来看看那些可用的。
该命令用于在执行容器时在运行时执行命令。
CMD command param1
command - 这是在启动容器时运行的命令。
param1 - 这是输入到命令的参数。
该命令将相应执行。
在我们的例子中,我们将在我们的Docker文件中输入一个简单的 Hello World回显,并创建一个图像并从中启动一个容器。
第1步 - 使用以下命令构建Docker文件 -
FROM ubuntu MAINTAINER [email protected] CMD [“echo” , “hello world”]
这里,CMD仅用于打印hello world。
第2步 - 使用Docker build命令构建映像。
第3步 - 从图像运行容器。
该命令也可以用于在运行时为容器执行命令。但是我们可以使用ENTRYPOINT命令更灵活。
ENTRYPOINT command param1
command - 这是在启动容器时运行的命令。
param1 - 这是输入到命令中的参数。
该命令将相应执行。
我们来看一个例子来更多地了解入口点。在我们的例子中,我们将在我们的Docker文件中输入一个简单的echo命令,并创建一个图像并从中启动一个容器。
第1步 - 使用以下命令构建Docker文件 -
FROM ubuntu MAINTAINER [email protected] ENTRYPOINT [“echo”]
第2步 - 使用Docker build命令构建映像。
第3步 - 从图像运行容器。
该命令用于设置容器中的环境变量。
ENV key value
Key - 这是环境变量的关键。
vlaue - 这是环境变量的值。
该命令将相应执行。
在我们的例子中,我们将在我们的Docker文件中输入一个简单的echo命令,并创建一个图像并从中启动一个容器。
第1步 - 使用以下命令构建Docker文件 -
FROM ubuntu MAINTAINER [email protected] ENV var1=Tutorial var2=point
第2步 - 使用Docker build命令构建映像。
第3步 - 从图像运行容器。
第4步 - 最后,执行env命令查看环境变量。
该命令用于设置容器的工作目录。
WORKDIR dirname
dirname - 新的工作目录。如果该目录不存在,它将被添加。
该命令将相应执行。
在我们的例子中,我们将在我们的Docker文件中输入一个简单的echo命令,并创建一个图像并从中启动一个容器。
第1步 - 使用以下命令构建Docker文件 -
FROM ubuntu MAINTAINER [email protected] WORKDIR /newtemp CMD pwd
第2步 - 使用Docker build命令构建映像。
第3步 - 从图像运行容器。
容器链接允许多个容器相互链接。这是比暴露端口更好的选择。让我们一步一步来了解它是如何工作的。
第1步 - 使用Jenkins pull命令下载Jenkins图像(如果它尚不存在)。
步骤2 - 一旦图像可用,运行容器,但是这次可以使用--name选项为容器指定名称。这将是我们的源容器。
第3步 - 接下来是启动目标容器的时候了,但是这一次,我们会将它与源容器链接起来。对于我们的目标容器,我们将使用标准的Ubuntu镜像。
当您执行docker ps时,您将看到两个容器正在运行。
第4步 - 现在,连接到接收容器。
然后运行env命令。您将注意到与源容器链接的新变量。
Docker有多个存储驱动程序,允许用户使用底层存储设备。下表显示了不同的存储驱动程序以及用于存储驱动程序的技术。
Technology | Storage Driver |
---|---|
OverlayFS | overlay or overlay2 |
AUFS | aufs |
Btrfs | brtfs |
Device Manager | devicemanager |
VFS | vfs |
ZFS | zfs |
现在让我们来讨论一些您将使用各种存储驱动程序的实例 -
这是一个稳定的司机; 可用于生产就绪的应用程序。
它具有良好的内存使用情况,对于确保集装箱的平滑Docker体验非常有用。
应该考虑与该驱动程序相关的高写入活动。
对于Platform作为服务类型工作的系统来说,这非常有用。
这是一个稳定的司机; 确保了Docker的流畅体验。
该驱动程序适用于在实验室中测试应用程序。
该驱动程序符合主要的Linux内核功能。
该驱动程序符合主要的Linux内核功能。
应该考虑与该驱动程序相关的高写入活动。
该驱动程序适用于维护多个构建池的实例。
这是一个稳定的驱动程序,它与主要的Linux内核功能一致。
它有很好的内存使用。
该驱动程序适用于在实验室中测试应用程序。
这是一个稳定的驱动程序,适合在实验室中测试应用程序。
这对平台即服务类型工作的系统很有用。
要查看正在使用的存储驱动程序,请发出docker info命令。
docker info
没有
该命令将提供Docker主机上安装的Docker组件的所有相关信息。
sudo docker info
以下输出显示使用的主驱动程序是aufs驱动程序,并且根目录存储在/ var / lib / docker / aufs中。
在Docker中,您有一个可以跨容器共享的独立卷。这些被称为数据量。数据量的一些功能是 -
我们来看看我们的Jenkins容器。我们来做一个码头检查来查看这个图像的细节。我们可以发出以下命令将docker inspect命令的输出写入文本文件,然后相应地查看该文件。
sudo docker inspect Jenkins > tmp.txt
当您使用more命令查看文本文件时,您会看到一个条目为JENKINS_HOME = / var / Jenkins_home。
这是通过Jenkins图像在容器内完成的映射。
现在假设您想将容器中的卷映射到本地卷,那么在启动容器时需要指定-v选项。一个例子如下所示 -
sudo docker run –d –v /home/demo:/var/jenkins_home –p 8080:8080 –p 50000:50000 jenkins
-v选项用于将容器中的卷/ var / jenkins_home映射到Docker主机上的/ home / demo位置。
现在,如果在启动容器后进入Docker主机上的/ home / demo位置,您将看到所有容器文件存在。
如果您想更改为用于容器的存储驱动程序,则可以在启动容器时执行此操作。这可以通过在使用docker run命令时使用-volume-driver参数来完成。下面给出了一个例子 -
sudo docker run –d –volume-driver=flocker –v /home/demo:/var/jenkins_home –p 8080:8080 –p 50000:50000 jenkins
该-volume驱动器选项用于指定容器中其他存储驱动器。
要确认驱动程序已更改,首先让我们使用docker ps命令查看正在运行的容器并获取容器标识。因此,首先发出以下命令 -
sudo docker ps
然后对容器发出docker检查,并使用该命令将输出置于文本文件中。
sudo docker inspect 9bffb1bfebee > temp.txt
如果您浏览文本文件并转到指出VolumeDriver的行,您将看到驱动程序名称已更改。
可以使用docker命令事先创建卷。让我们更多地了解这个命令。
docker volume create –-name=volumename –-opt options
name - 这是需要创建的卷的名称。
opt - 这些是创建卷时可以提供的选项。
该命令将输出创建的卷的名称。
sudo docker volume create –-name = demo –opt o = size = 100m
在上面的命令中,我们正在创建一个大小为100MB的卷,并带有一个演示名称。
上述命令的输出如下所示 -
您还可以列出docker volumes上的所有docker host。关于这个命令的更多细节在下面给出 -
docker volume ls
没有
该命令将输出docker host上的所有卷。
sudo docker volume ls
上述命令的输出如下所示 -
Docker负责网络方面的工作,以便容器可以与其他容器以及Docker主机进行通信。如果您在Docker主机上执行ifconfig,您将看到Docker以太网适配器。Docker安装在Docker主机上时创建此适配器。
这是Docker主机和Linux主机之间的桥梁。现在我们来看看Docker中与网络相关的一些命令。
该命令可用于列出主机上与Docker相关的所有网络。
docker network ls
没有
该命令将输出Docker主机上的所有网络。
sudo docker network ls
上述命令的输出如下所示
如果您想查看与Docker关联的网络的更多详细信息,则可以使用Docker 网络检查命令。
docker network inspect networkname
networkname -这是你需要检查网络的名称。
该命令将输出关于网络的所有细节。
sudo docker network inspect bridge
上述命令的输出如下所示 -
现在让我们运行一个容器,看看我们再次检查网络时会发生什么。让我们用下面的命令启动一个Ubuntu容器 -
sudo docker run –it ubuntu:latest /bin/bash
现在,如果我们通过以下命令检查网络名称,您现在将看到容器已连接到网桥。
sudo docker network inspect bridge
可以在启动容器之前在Docker中创建一个网络。这可以通过以下命令完成 -
docker network create –-driver drivername name
drivername - 这是用于网络驱动程序的名称。
name - 这是给网络的名称。
该命令将输出新网络的长ID。
sudo docker network create –-driver bridge new_nw
上述命令的输出如下所示 -
您现在可以在启动容器时附加新网络。所以让我们用下面的命令启动一个Ubuntu容器 -
sudo docker run –it –network=new_nw ubuntu:latest /bin/bash
现在,当您通过以下命令检查网络时,您会看到连接到网络的容器。
sudo docker network inspect new_nw