Docker是一个容器化平台,用于将您的应用程序及其所有依赖项以镜像的形式打包在一起,以确保您的应用程序在任何开发、测试或生产环境中都能无缝运行。Docker 是一种旨在使使用容器创建、部署和运行应用程序变得更容易的工具。
Docker是世界领先的容器平台。它由一家名为Dotcloud , Inc的公司于2013 年推出,该公司后来更名为Docker , Inc。它是用Go 语言编写的。Docker 推出仅六年,但社区就已经从虚拟机转向它。Docker旨在让开发人员和系统管理员都受益,这使其成为许多DevOps 工具链的一部分。开发人员可以编写代码而不必担心测试和生产环境。系统管理员不必担心基础设施,因为Docker可以轻松扩展和缩减系统数量。Docker 在软件开发周期的部署阶段发挥作用。
容器化
容器化是基于操作系统的虚拟化,它在用户空间中创建多个虚拟单元,称为容器。容器共享相同的主机内核,但通过操作系统级别的私有命名空间和资源控制机制彼此隔离。与虚拟机管理程序相比,基于容器的虚拟化在虚拟化和隔离方面提供了不同级别的抽象。虚拟机管理程序使用大量硬件,这会导致虚拟化硬件和虚拟设备驱动程序方面的开销。完整的操作系统(例如Linux,Windows)在每个虚拟机实例中的虚拟化硬件之上运行。 但相比之下,容器在操作系统级别实现进程隔离,从而避免了这种开销。这些容器在底层主机的相同共享操作系统内核上运行,每个容器内可以运行一个或多个进程。在容器中,您不必预先分配任何RAM,它是在创建容器期间动态分配的,而在VM中,您需要先预分配内存,然后再创建虚拟机。与虚拟机相比,容器化具有更好的资源利用率和更短的启动过程。它是虚拟化的下一代发展方向。 容器几乎可以在任何地方运行,大大简化了开发和部署:在Linux、Windows和Mac 操作系统上;在虚拟机或裸机上;在开发人员的机器上或本地数据中心;当然,在公共云中。容器虚拟化CPU、内存、存储和网络资源
操作系统级别,为开发人员提供与其他应用程序逻辑隔离的操作系统沙盒视图。Docker是最流行的开源容器格式,并得到[Google Cloud Platform](https://www.geeksforgeeks.org/google-cloud-platform-gcp/)和[Google Kubernetes Engine****](https://www.geeksforgeeks.org/google-kubernetes-engine/)的支持。
Docker 架构
Docker 架构由Docker 客户端、在Docker Host上运行的Docker Daemon和Docker Hub存储库组成。Docker 具有[客户端-服务器架构](https://www.geeksforgeeks.org/three-tier-client-server-architecture-in-distributed-system/),其中客户端使用[REST API](https://www.geeksforgeeks.org/rest-api-introduction/)、Socket IO和TCP的组合与在 Docker Host 上运行的 Docker Daemon 进行通信。如果我们必须构建[Docker 镜像](https://www.geeksforgeeks.org/what-is-docker-image/),那么我们使用客户端对 Docker Daemon 执行构建命令,然后 Docker Daemon 根据给定的输入构建镜像并将其保存到Docker 注册表中。如果不想创建镜像,则只需从客户端执行pull 命令,然后 Docker Daemon 将从 Docker Hub 中提取镜像,最后如果我们想运行镜像,则从客户端执行run 命令,这将创建容器****。
Docker 的组件
Docker的主要组件包括:Docker 客户端和服务器、Docker 镜像、Dockerfile、Docker Registries和Docker 容器。以下部分将详细介绍这些组件:
- Docker 客户端和服务器– Docker采用客户端-服务器架构。Docker守护进程/服务器包含所有容器。Docker 守护进程/服务器通过CLI或REST API接收来自Docker 客户端的请求,并进行相应的处理。Docker客户端和守护进程可以位于同一台主机上,也可以位于不同的主机上。
-
Docker 镜像– Docker 镜像用于通过只读模板构建Docker 容器。每个镜像的基础都是一个基础镜像,例如ubuntu14.04 LTS和Fedora 20。您也可以从头开始创建基础镜像,然后通过修改基础镜像来添加所需的应用程序,因此,创建新镜像的过程称为“提交更改”。
-
Docker File – Dockerfile是一个文本文件,其中包含一系列有关如何构建Docker 镜像的说明。该镜像包含所有项目代码及其依赖项。同一个 Docker 镜像可用于创建 n 个容器,每个容器都可修改底层镜像。最终镜像可以上传到Docker Hub,并在各个协作者之间共享,以进行测试和部署。您需要在Docker File中使用的命令集包括FROM、CMD、ENTRYPOINT、VOLUME、ENV等等。
-
Docker 镜像仓库- Docker 镜像仓库是Docker 镜像的存储组件。我们可以将镜像存储在公共/私有仓库中,以便多个用户协作构建应用程序。Docker Hub是Docker 的云仓库。Docker Hub 被称为公共镜像仓库,每个人都可以从中拉取可用的镜像并推送自己的镜像,而无需从头开始创建镜像。
-
Docker 容器– Docker 容器是Docker 镜像的运行时实例。容器包含应用程序所需的全部工具,因此应用程序可以以隔离的方式运行。例如,假设有一个包含NGINX 服务器的Ubuntu 操作系统镜像,使用 docker run 命令运行该镜像时,就会创建一个容器,并且NGINX 服务器将在Ubuntu 操作系统上运行。
Docker Compose
Docker Compose是一个可以用来创建多容器应用程序的工具。它使得配置和
运行由多个容器组成的。例如,假设你有一个需要WordPress和MySQL 的应用程序,你可以创建一个文件,将两个容器作为服务启动,而不需要分别启动每个容器。我们在YAML 文件中定义一个多容器应用程序。使用docker-compose-up命令,我们可以在前台启动该应用程序。Docker -compose将在当前文件夹中查找docker-compose.YAML文件来启动该应用程序。通过在docker-compose-up命令中添加 -d 选项,我们可以在后台启动该应用程序。为 WordPress 应用程序创建 docker-compose.YAML 文件:
#cat docker-compose.yaml
version: ’2’
services:
db:
image: mysql:5.7
volumes:db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: WordPress
MYSQL_DATABASE: WordPress
MYSQL_USER: WordPress
MYSQL_PASSWORD: WordPress
WordPress:
depends_on:
- DB
image: WordPress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
在这个docker-compose.yml文件中,我们为WordPress 容器添加了以下 ports 部分,这意味着我们将把主机的8000 端口映射到容器的 80 端口。这样主机就可以使用其IP和端口号访问应用程序。
Docker 网络
当我们创建并运行容器时,Docker会默认为其分配一个IP 地址。大多数情况下,我们需要根据自身需求创建和部署 Docker 网络。因此,Docker 允许我们根据自身需求设计网络。Docker网络分为三种类型:默认网络、用户自定义网络和覆盖网络。
要获取 Docker 创建的所有默认网络的列表,我们运行以下命令 –
Docker 中有三种类型的网络 –
-
桥接网络:当创建一个新的Docker 容器时,如果未使用–network 参数,Docker 默认会将该容器连接到桥接网络。在桥接网络中,单个主机上的所有容器都可以通过其IP 地址进行连接。当 Docker 主机的跨度为 1 时(即所有容器都在单个主机上运行),就会创建桥接网络。我们需要一个覆盖网络来创建跨度超过一台Docker 主机的网络。
-
主机网络:使用–network=host 参数创建新的 Docker 容器时,它会将容器推送到Docker 守护进程正在运行的主机网络堆栈中。分配给主机网络的容器可以访问主机的所有接口。
-
None 网络:使用–network=none 参数创建新的 Docker 容器时,会将该 Docker 容器放入其网络堆栈中。因此,在这个 None 网络中,容器不会被分配 IP 地址,因此它们无法相互通信。
我们可以为 Docker 容器分配任意一个网络。docker run 命令的 –network 选项用于为容器分配特定的网络。
$docker run –network=”网络名称”
为了获取有关特定网络的详细信息,我们使用命令-
$docker network inspect“网络名称”
Docker 的优势
Docker 如今之所以如此流行,是因为 Docker 容器提供了诸多优势。Docker 的主要优势如下:
-
速度– 与虚拟机相比,Docker 容器的速度非常快。由于容器体积小巧轻量,构建容器所需的时间也非常短。由于容器体积小,开发、测试和部署可以更快地完成。容器构建完成后,可以立即推送到测试环境,然后再部署到生产环境。
-
可移植性——Docker 容器内构建的应用程序具有极高的可移植性。这些可移植的应用程序可以作为单个元素轻松移动到任何地方,并且性能保持不变。
-
可扩展性– Docker 能够部署在多个物理服务器、数据服务器和云平台上。它甚至可以在每台 Linux 机器上运行。容器可以轻松地从云环境迁移到本地主机,然后再快速迁移回云环境。
-
密度– Docker 无需使用虚拟机管理程序,因此能够更高效地利用现有资源。正因如此,与虚拟机相比,Docker 可以在单台主机上运行更多容器。Docker 容器由于其高密度且无资源开销浪费,性能更佳。