Docker
推荐超级课程:
什么是 Docker?
Docker是一组使用操作系统级虚拟化以称为容器的包形式交付软件的产品。 容器之间相互隔离,并捆绑自己的软件、库和配置文件。所有容器都由单个操作系统内核 运行,因此比虚拟机 更轻量级。\[8\]
什么是容器?
Docker 容器是一个标准化单元,可以动态创建以部署特定应用程序或环境。它可以是 Ubuntu 容器、CentOs 容器等,以从操作系统的角度满足要求。此外,它也可以是面向应用程序的容器,例如 PHP 容器或 Tomcat-Ubuntu 容器等。
Docker 是一个供开发人员和系统管理员使用容器构建、共享和运行应用程序的平台。使用容器来部署应用程序称为容器化。容器并不新鲜,但它们用于轻松部署应用程序却是新鲜事。
容器化越来越受欢迎,因为容器具有:
- 灵活:即使是最复杂的应用程序也可以容器化。
- 轻量级:容器利用并共享主机内核,使其在系统资源方面比虚拟机更加高效。
- 便携式:您可以在本地构建、部署到云并在任何地方运行。
- 松散耦合:容器具有高度自给自足和封装性,允许您在不干扰其他容器的情况下更换或升级容器。
- 可扩展:您可以在数据中心内增加并自动分配容器副本。
- 安全:容器对进程应用严格的约束和隔离,无需用户进行任何配置。
官方的Docker入门教程教您如何:
镜像和容器
从根本上说,容器只不过是一个正在运行的进程,它应用了一些附加的封装功能,以使其与主机和其他容器隔离。容器隔离最重要的方面之一是每个容器都与其自己的私有文件系统交互。该文件系统由 Docker映像提供。镜像包含运行应用程序所需的一切——代码或二进制文件、运行时、依赖项以及所需的任何其他文件系统对象。
容器和虚拟机
容器在 Linux 上本机运行,并与其他容器共享主机的内核。它运行一个独立的进程,不会比任何其他可执行文件占用更多的内存,从而使其轻量级。
相比之下,虚拟机(VM) 运行成熟的“来宾”操作系统,可以通过虚拟机管理程序对主机资源进行虚拟访问。一般来说,虚拟机会产生大量超出应用程序逻辑消耗的开销。
让我总结一下到目前为止的学习:
- 虚拟机速度很慢并且需要很长时间才能启动。
- 容器速度很快,启动也很快,因为它使用主机操作系统并共享相关库。
- 与虚拟机不同,容器不会浪费或阻塞主机资源。
- 容器具有特定于它们正在运行的应用程序的独立库和二进制文件。
- 容器由容器化引擎处理。
- Docker 是可用于创建和运行容器的容器化平台之一。
我们为什么使用docker?
我们已经讨论了 Docker 是什么。但是,什么情况下需要Docker呢?Docker 容器是轻量级的,并且非常容易创建和部署。
Docker为我们提供了容器。容器化由整个运行时环境、一个应用程序、运行它所需的所有依赖项、库、二进制文件和配置文件组成,捆绑到一个包中。每个应用程序彼此独立运行。Docker 通过将依赖关系保留在容器内来解决依赖关系问题。它使开发人员团结起来,减轻项目的依赖。
使用容器相对于虚拟机的优势
现在我们来讨论一下 Docker 相对于 VM 的优势是什么。
- 与使用虚拟机管理程序在来宾操作系统上运行的 VM(虚拟机)不同,Docker 容器使用 Docker 引擎直接在主机服务器(适用于 Linux)上运行,使其更快、更轻量。
- 与虚拟机相比,Docker 容器可以轻松集成。
- 借助完全虚拟化的系统,您可以获得更多隔离。然而,它需要更多的资源。使用 Docker,您可以减少孤立性。然而,由于它需要更少的资源,您可以在主机上运行数千个容器。
- VM 至少需要一分钟才能启动,而 Docker 容器通常只需几分之一秒即可启动。
- 容器比虚拟机更容易破解。
- 与虚拟机不同,无需预先分配 RAM。因此,与虚拟机相比,docker 容器使用的 RAM 更少。因此,仅使用所需的 RAM 量。
Docker 是如何工作的?
既然我们现在了解了使用 Docker 的好处。上面我们先讲一下Docker的功能。Docker有一个**docker引擎,**它是Docker系统的心脏。它是一个客户端-服务器应用程序。它具有三个主要组成部分:
- 服务器是一种称为守护进程的长时间运行的进程。
- 客户端是 Docker CLI(命令行界面),以及
- 用于在客户端(Docker CLI)和服务器(Docker Daemon)之间进行通信的 REST API
Docker 守护进程接收来自客户端的命令并管理 Docker对象,例如镜像、容器、网络和卷。Docker 客户端和守护进程可以在同一系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护进程。它们可以使用 REST API、通过 UNIX 套接字或网络接口进行通信。
在Linux中,Docker主机运行docker守护进程,并且可以从终端访问docker客户端。
在 Windows/OS X 中,还有一个名为 Docker 工具箱的附加工具。该工具箱在Win/OS系统上安装docker环境。该工具箱安装以下内容:Docker Client、Compose、Kitematic、Machine 和 Virtual Box
Docker 中使用的技术
Docker 使用的编程语言是GO
. Docker 利用了 Linux 内核的各种功能,例如namespaces
和cgroups
。
命名空间: Docker 用于namespaces
提供称为containers
. 当容器运行时,docker会为其创建一组命名空间,提供一层隔离。容器的每个方面都在单独的命名空间中运行,并且其访问仅限于该命名空间。
**cgroups(控制组):**组用于限制和隔离一组进程的资源使用(CPU、内存、磁盘 I/O、网络等)。cgroups
允许 Docker 引擎将可用的硬件资源共享给容器,并可选择强制执行限制和约束。
**UnionFS(联合文件系统):**是通过创建层进行操作的文件系统,使其非常轻量且快速。Docker引擎使用它为容器提供构建块。
Docker Engine 将命名空间、cgroup 和 UnionFS 组合到一个称为容器格式的包装器中。默认容器格式为libcontainer.
安装 Docker Desktop
开始开发容器化应用程序的最佳方法是使用适用于 OSX 或 Windows 的 Docker Desktop。Docker Desktop 将允许您在本地开发计算机上轻松设置 Kubernetes 或 Swarm,因此您可以立即使用正在开发应用程序的编排器的所有功能,无需集群。请按照适合您的操作系统的安装说明进行操作:
Docker日常使用命令
- docker –version
该命令用于获取当前安装的docker版本
- docker pull
用法: docker pull <镜像名称>
该命令用于从docker存储库(hub.docker.com)中拉取镜像
- docker run
用法: docker run -it -d <镜像名称>
该命令用于从镜像创建容器
- docker ps
该命令用于列出正在运行的容器
- docker ps -a
该命令用于显示所有正在运行和退出的容器
- docker exec
用法: docker exec -it <容器 ID> bash
该命令用于访问正在运行的容器
- docker stop
用法:docker stop <容器 ID>
此命令停止正在运行的容器
- docker kill
用法:docker Kill <容器 ID>
此命令通过立即停止执行来杀死容器。“docker Kill”和“docker stop”之间的区别在于,“docker stop”为容器提供了正常关闭的时间,在需要花费太多时间来停止容器的情况下,可以选择杀死它
- docker commit
用法: docker commit
此命令在本地系统上创建已编辑容器的新映像
- docker login
该命令用于登录docker image仓库
- docker push
用法: docker push <用户名/镜像名称>
该命令用于将镜像推送到docker hub仓库
- docker images
该命令列出了本地存储的所有 docker 镜像
- docker rm
用法: docker rm <容器 ID>
该命令用于删除已停止的容器
- docker RMI
用法:docker rmi
该命令用于从本地存储中删除镜像
- docker build
用法: docker build <dockerfile 文件的路径>
该命令用于从指定的docker文件构建镜像
创建我们的第一个 Docker 应用程序
假设我们有一个 PHP 应用程序并希望将其部署到我们的临时或生产服务器。首先,我们确保应用程序的根目录中包含 docker 配置脚本。
- 在您的应用程序中创建 Dockerfile
在应用程序的根目录中创建一个名为 name 的文件Dockerfile
,并包含以下代码来告诉 docker 在生产或临时环境中运行时要做什么
FROM PHP:7.2-Apache
COPY src/ /var/www/html/
EXPOSE 80
上面是一个示例 docker 脚本,它在临时或生产服务器上配置 PHP 版本 7.2,将 PHP 文件从/src
目录复制到并公开要访问的端口 80。 /var/www/html/
- 在临时或生产服务器上安装 Docker
对于 Mac,请在此处 获取 docker 。
对于 Windows,请转到此处 。
- 运行Docker
在登台或生产服务器上安装 docker 后,单击鲸鱼图标即可运行 docker
- 部署您的应用程序
将应用程序复制到登台或生产服务器并执行以下操作
- 导航到终端上的项目目录并创建一个 docker 映像。
在终端中运行以下命令,它将创建应用程序的 docker 映像并下载应用程序成功运行所需的所有必要依赖项
docker build -t <为镜像指定的名称>
- 将应用程序的 Docker 映像转换为正在运行的容器。
在终端中运行以下命令,它将创建一个包含所有所需依赖项的正在运行的容器并启动应用程序。
docker run -p 9090:80 <容器的名称>
这9090
是我们要访问应用程序的端口。80
是容器公开供主机访问的端口。