简介
本章中,您将学习如何安装Docker。并学习Docker术语,如映像、容器、Dockerfiles和 Docker组件。您还将使用一些简单的Docker命令来工作。用于创建、运行和停止Docker容器。
安装
Docker公司提供了社区版和企业版。的Docker平台。企业版的功能与Docker平台相同。社区版,但它提供了额外的支持和认证的。容器、插件和基础设施。对于大多数一般的开发和生产使用,社区版 合适的。
在Windows上安装Docker 在Windows上安装Docker之前,你需要满足一定的先决条件。这些包括以下内容。
- Hyper-V支持 - 硬件虚拟化支持,通常在系统BIOS中启用 - 只有64位版本的Windows 10(Pro/Education/)才能安装。这看起来像一个虚拟化设置需要,而你在上一章了解到,Docker并不是虚拟化。
那么为什么Docker for Windows需要虚拟化所需的功能呢?简短的回答是,Docker依赖于众多的功能,比如命名空间和cgroups,而这些在Windows上是不可用的。为了绕过这一限制,Docker for Windows创建了一个运行Linux内核的轻量级Hyper-V容器。
在撰写本文时,Docker包括对Native容器的实验性支持,允许在不需要Hyper-V的情况下创建容器。
<u>https://hub.docker.com/editions/community/docker-ce-desktop-windows</u>
<u>https://hub.docker.com/editions/community/docker-ce-desktop-mac</u>
<u>https://www.docker.com/community-edition</u>
sudo apt install docker.io
docker run --rm hello-world
参考资料
- 本讲座目录
- 代码地址 https://github.com/china-testing/python-testing-examples/tree/master/pytest_projects 建议拷贝到浏览器访问
- 本文涉及的python测试开发库 谢谢点赞!
- 本文相关海量书籍下载
基本概念
现在我们已经安装并运行了Docker,让我们来了解与Docker相关的不同术语。
Layer: Image是应用于Docker镜像的修改,由Docker文件中的指令来表示。通常情况下,当一个基础镜像被改变时,就会创建一个图层--例如,考虑一个看起来像这样的Dockerfile。
FROM ubuntu
Run mkdir /tmp/logs
RUN apt-get install vim
RUN apt-get install htop
现在在这种情况下,Docker会将Ubuntu镜像作为基础镜像,并添加三个层。
- 一个层用于创建/tmp/logs - 另一个层安装vim - 第三个层安装htop。
当Docker构建镜像时,每个层都会叠加在下一个层上,并使用联合文件系统合并成一个层。层使用sha256哈希值进行唯一识别。这使其易于重用和缓存。当Docker扫描基础镜像时,它会扫描构成镜像的所有层的ID,并开始下载层。如果某个层存在于本地缓存中,它就会跳过下载缓存的镜像。
Docker Image:Docker image是一个只读的模板,它构成了你的应用程序的基础。一个Docker镜像从一个基础镜像开始--通常选择的是大家最熟悉的操作系统的镜像,比如Ubuntu。在这个镜像之上,我们可以添加构建我们的应用栈,在需要的时候添加包。
有许多预构建的镜像,用于一些最常见的应用程序堆栈,如Django、PHP-FPM与nginx。
等。
我们可以从相关的Dockerfile中构建自己的镜像,然后将构建好的镜像发布到注册表中。我们将在以后的章节中深入研究Dockerfile。现在,将Docker镜像视为最终的可执行包,它包含了运行应用程序的一切。这包括源代码、所需的库和任何依赖关系。
Docker容器:Docker镜像在主机中运行时,会生成一个有自己命名空间的进程,称为Docker容器。Docker镜像与容器的主要区别在于,Docker镜像存在一个薄薄的读/写的容器。。对容器的文件系统的任何改变,如写入新文件或修改现有文件,都是在这个可写容器层上完成的,而不是在下层。
绑定挂载和卷:我们在前面提到,当一个容器运行时,对容器的任何更改都存在于文件系统的容器层中。当一个容器被杀死时,这些更改就会丢失,数据也无法再访问。即使在容器运行时,从容器中获取数据也不是很直接。此外,向容器的可写层写入数据需要一个存储驱动来管理文件系统。存储驱动在文件系统上提供了一个可用来持久化变化的抽象,这种抽象往往会降低性能。
基于这些原因,Docker提供了不同的方式来从Docker主机将数据挂载到容器中:卷、绑定挂载和tmpfs卷。tmpfs卷只存储在主机系统的内存中,而绑定挂载和卷则存储在主机文件系统中。
Docker Registry:我们在前面提到过,你可以利用常见应用栈的现有镜像--你有没有想过这些镜像在哪里,以及如何在构建应用时使用它们?Docker Registry是一个可以存储Docker镜像的地方,这样就可以将它们作为基础来使用
的应用栈。一些常见的Docker注册中心的例子包括以下几个。
• Docker Hub
• Google Container Registry
• Amazon Elastic Container Registry
• JFrog Artifactory
Dockerfile:Dockerfile是一组告诉Docker如何构建镜像的指令。
一个典型的Dockerfile由以下内容组成。
一个FROM指令,告诉Docker什么是基础镜像 - 一个ENV指令,传递一个环境变量 - 一个RUN指令,运行一些shell命令(例如,基础镜像中不可用的依赖安装的程序)。
一个CMD或一个ENTRYPOINT指令,告诉Docker在容器启动时运行哪个可执行文件 正如你所看到的,Dockerfile指令集的语法清晰而简单,这使得它很容易理解。我们将在本书后面对Dockerfiles进行深入的研究。
Docker Engine:Docker Engine是Docker的核心部分。Docker Engine是一个客户端-服务器应用程序,它为构建和管理Docker镜像、Docker容器等提供平台、运行时和工具。
Docker Engine提供了以下内容。
• Docker daemon
• Docker CLI
• Docker API-
Docker Daemon - 。
Docker守护进程是一个在主机后台运行的服务,处理大部分Docker命令的重任。
守护进程监听用于创建和管理Docker对象(如容器)的API请求。
Docker守护进程还可以与其他守护进程对话,以管理和监控Docker容器。守护进程间通信的一些例子包括用于容器指标监控的通信Datadog和用于容器安全监控的Aqua。
Docker CLI是你与Docker交互的主要方式。Docker CLI公开了一组你可以提供的命令。Docker CLI将请求转发到Docker daemon,然后由Docker daemon执行必要的工作。
build
pull
run
exec
虽然Docker CLI包括种类繁多的命令和子命令,但我们在本书中最常用的命令如前所述。
<u>https://docs.docker.com/engine/reference/commandline/cli/</u>
在任何时候,给一个命令添加帮助,都会显示出该命令所需的文档。例如,如果你不太确定从哪里开始使用Docker CLI,你可以键入以下内容。
docker help
docker help pull
Docker API
Docker还提供了一个与Docker引擎交互的API。如果需要在应用程序中创建或管理容器,这一点特别有用。几乎所有Docker CLI支持的操作都可以通过API来完成。
最简单的方法是使用curl发送API请求来启动Docker API。对于Windows Docker主机,我们可以通过TCP端点到达。
curl <u>http://localhost:2375/images/json</u>
curl --unix-socket /var/run/docker.sock -X POST <u>http://images/json</u>
Docker Compose是一个定义和运行多容器应用程序的工具。就像Docker允许你为你的应用程序构建一个镜像并在你的容器中运行一样,Compose使用相同的镜像与定义文件(称为compose文件)相结合来构建。启动和运行多容器应用程序,包括依赖和链接容器。
Docker Compose最常见的用例是运行应用程序及其依赖的服务(如数据库和缓存提供商)。
以与运行单个容器应用同样简单、精简的方式。
Docker Machine是一个用于在多个虚拟主机上安装Docker引擎,然后管理主机的工具。Docker Machine允许你在本地以及远程系统上创建Docker主机,包括在Amazon Web Services、DigitalOcean和Microsoft Azure等云平台上。
使用Docker镜像 让我们来看看可用的Docker镜像。要做到这一点,请键入以下命令。
docker image ls 这是本地可用镜像的列表。
下面是有些常用的命令,可以自己实践体验下。
docker image inspect hello-world
docker pull nginx
docker pull nginx:1.12-alpine-perl
docker pull docker-private.registry:1337/nginx
docker login docker-private.registry:1337
docker run -p 80:80 nginx
docker image inspect nginx | jq .[].Config.ExposedPorts
docker ps
docker ps -a
-n required-name
docker stop <container-id>
docker kill 3ed1222964de
docker rm <container-id>
docker image ls
docker rmi 3f8a4339aadd