全网最详细·Docker快速进阶指南【上篇】

一、Docker 简介

1-1:什么是 Docker

Docker 自开源后受到广泛的关注和讨论,其 GitHub 项目 火爆程度如下。

Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker

Docker 使用 Google 公司推出的 Go 语言 进行开发实现。

基于 Linux 内核的 cgroupnamespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术

由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 版本开始,则进一步演进为使用 runCcontainerd

runc 是一个 Linux 命令行工具,用于根据 OCI容器运行时规范 创建和运行容器。containerd 是一个守护程序,它管理容器生命周期,提供了在一个节点上执行容器和管理镜像的最小功能集。

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷

下面的图片比较了 Docker 和传统虚拟化方式的不同之处。

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而**容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟**。因此容器要比传统虚拟机更为轻便。


1-2:为什么要用 Docker

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

更高效的利用系统资源

由于**容器不需要进行硬件虚拟以及运行完整操作系统**等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此**可以做到秒级、甚至毫秒级的启动时间**。大大的节约了开发、测试、部署的时间。

一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

持续交付和部署

对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。

而且使用 [Dockerfile](https://link.zhihu.com/?target=https%3A//yeasy.gitbook.io/docker_practice/image/build) 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

更轻松的迁移

由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。

因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

更轻松的维护和扩展

Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。

此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

对比传统虚拟机总结


二、基本概念

Docker 包括三个基本概念

  1. 镜像Image
  2. 容器Container
  3. 仓库Repository

理解了这三个概念,就理解了 Docker 的整个生命周期。


2-1:镜像

我们都知道,操作系统分为 内核 和 用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系统的 root 文件系统。

Docker 镜像 是一个**特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数**(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。

分层存储

因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。

所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是**由一组文件系统组成**,或者说,由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。

在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉

分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

关于镜像构建,将会在后续相关章节中做进一步的讲解。


2-2:容器

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机

前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 容器存储层

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。


2-3:仓库

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个 仓库Repository);每个仓库可以包含多个 标签Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Ubuntu 镜像 为例

ubuntu 是仓库的名字,其内包含有不同的版本标签,如,16.04, 18.04。我们可以通过 ubuntu:16.04,或者 ubuntu:18.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest

仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。

Docker Registry 公开服务

Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务**允许用户免费上传、下载公开的镜像**,并可能提供收费服务供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的 官方镜像

Red Hat 的 Quay.io

Google 的 Google Container RegistryKubernetes 的镜像使用的就是这个服务;

代码托管平台 GitHub 推出的 ghcr.io

由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为 加速器

阿里云加速器

使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 安装 Docker 一节中有详细的配置方法。

国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如

网易云镜像服务

DaoCloud 镜像市场

私有 Docker Registry

除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。

开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如

Harbor


三、安装 Docker

Docker 分为 stable testnightly 三个更新频道。

官方网站上有各种环境下的 安装指南

这里主要介绍 Docker 在 macOS 上的安装,Linux系统和win11的教程,我后续有时间再补充,另外,我们课题组的服务器已经装好了Docker,所以我这里也会讲一下**如何检查是否安装成功**。

3-1:Linux系统检查

连接服务器,进入终端以后,输入以下命令。

这个输出提供了有关 Docker 客户端和服务器的信息,并显示了一个错误消息,指出**在尝试连接到 Docker 守护程序时遇到了权限被拒绝的问题**。(我不是管理员,所以会提示这条信息)

Client: Docker Engine - Community

  • 这部分提供了客户端的信息,表明正在与 Docker 引擎 - Community 版本进行通信。

Version: 24.0.6

  • 这是 Docker 客户端的版本号,指示了客户端所使用的 Docker 引擎的版本。

API version: 1.43

  • 这是 Docker API 的版本号,表示客户端与 Docker 引擎通信所使用的 API 版本。

Go version: go1.20.7

  • 这是 Go 语言的版本号,指示了 Docker 引擎使用的编程语言版本。

Git commit: ed223bc

  • 这是 Docker 引擎的 Git 提交哈希,用于**标识 Docker 引擎的特定版本**。

Built: Mon Sep 4 12:32:12 2023

  • 这表示 Docker 引擎的构建日期和时间,指示了 Docker 引擎何时被构建。

OS/Arch: linux/amd64

  • 这指示了操作系统和架构,表明 Docker 引擎正在运行在 Linux 操作系统上的 amd64 架构上。

Permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version”: dial unix /var/run/docker.sock: connect: permission denied

  • 这是一个错误消息,说明在尝试连接到 Docker 守护程序时遇到了权限被拒绝的问题。
  • 具体来说,它表明当前用户没有足够的权限来访问 Docker 守护程序的 Unix 套接字文件 /var/run/docker.sock,因此无法与 Docker 引擎进行通信。
  • 要解决这个问题,你可能需要以具有足够权限的用户身份来运行 Docker 命令,或者将当前用户添加到 Docker 用户组中以获得适当的权限。

3-2:macOS安装

系统要求

Docker Desktop for Mac 要求如下,推荐用户更新至最新的版本。

并且至少要有4G的运行内存。


手动安装

进入官网,点击下载。

如同 macOS 其它软件一样,双击下载的 .dmg 文件,然后将那只叫 Moby 的鲸鱼图标拖拽到 Application 文件夹即可(其间**部分用户可能需要输入用户密码,按提示操作即可**)。

运行

从应用中找到 Docker 图标并点击运行,打开Docker应用程序后,会有一些选择配置,这里我们选择 Accept

选择推荐的设置。

然后会提示让你输入密码,完成以后即可进入以下界面。

点击sign up 进行注册,注册成功以后会让你接受一个调查,直接跳过就行。

成功登入的界面如下。


运行之后,会在右上角菜单栏看到多了一个鲸鱼图标,这个图标表明了 Docker 的运行状态,每次点击鲸鱼图标会弹出操作菜单。

通过小鲸鱼中的About Docker Desktop可以查看Docker的版本。

也可以在终端通过命令检查安装后的 Docker 版本。

现在来查看 Docker 系统的详细信息。

Containers

显示当前系统中运行的容器数量以及容器的状态信息。

Images

  • 提供有关系统中可用镜像的数量和相关信息,如镜像的数量、大小等。

Server Version

  • 显示 Docker 守护程序的版本信息。

Storage Driver

  • 显示 Docker 使用的存储驱动程序,用于管理容器的文件系统。

Logging Driver

  • 显示 Docker 使用的日志记录驱动程序,用于处理容器日志。

Cgroup Driver

  • 显示 Docker 使用的 cgroup 驱动程序,用于控制容器的资源限制。

Kernel Version

  • 提供宿主机的内核版本信息。

Operating System

  • 显示 Docker 守护程序运行的操作系统信息。

CPU

  • 提供有关 CPU 的信息,如 CPU 核心数量、型号等。

Memory

  • 显示系统的内存信息,如总内存量、可用内存等。

如果 docker versiondocker info 都正常的话,可以尝试运行一个 Nginx 服务器

docker run -d -p 80:80 --name webserver nginx

  • docker run:这是用于在 Docker 中运行容器的命令。
  • -d:这是一个选项,表示**在后台(detached 模式)运行容器**,使容器在后台运行而不会占用当前终端。
  • -p 80:80:这是一个选项,用于将容器的端口映射到主机的端口。在这种情况下,将容器的 80 端口映射到主机的 80 端口,这样可以通过主机的 80 端口访问容器内运行的 Nginx 服务器。
  • --name webserver:这是一个选项,用于为容器指定一个名称,这里将容器命名为 webserver
  • nginx:这是要运行的 Docker 镜像的名称,这里是 Nginx 镜像。Docker 将从 Docker Hub 或本地镜像中拉取 Nginx 镜像并在容器中运行。

综合起来,这个命令的含义是**在 Docker 中以后台模式运行一个 Nginx Web 服务器容器,将容器的 80 端口映射到主机的 80 端口,并将容器命名为 webserver。这样一来,你就可以通过访问主机的 80 端口来访问运行在 Docker 中的 Nginx Web 服务器**。

服务运行后,可以访问 http://localhost,如果看到了 “Welcome to nginx!”,就说明 Docker Desktop for Mac 安装成功了。

停止 Nginx 服务器

docker stop webserver 是一个 Docker 命令,用于**停止正在运行的 Docker 容器**。在这个命令中:

  • docker stop:这是用于停止 Docker 容器的命令。
  • webserver:这是指定要停止的容器的名称或容器ID。

当你运行 docker stop webserver 命令时,Docker 将尝试优雅地停止名为 webserver 的容器。这意味着 Docker 将发送一个停止信号给容器,允许容器在关闭之前完成正在进行的任务

如果容器成功停止,它将处于已停止状态,但仍然存在于你的系统中,可以通过 docker ps -a 命令查看到。

如果你想要**立即强制停止容器而不等待容器完成正在进行的任务**,可以使用 docker kill webserver 命令。这将立即终止容器的运行。

删除Nginx 服务器

我们再次查看系统,就会发现刚刚创建的服务器已经不见了。


3-3:阿里云加速器

如果在使用过程中发现拉取 Docker 镜像十分缓慢,可以配置 Docker 国内镜像加速

管理端网址

这里以Mac端的安装为例,其余系统的请参考对应的教程。

1. 安装/升级Docker客户端

【1】对于10.10.3以下的用户 推荐使用Docker Toolbox

Mac安装文件:http://mirrors.aliyun.com/docker-toolbox/mac/docker-toolbox/

【2】对于**10.10.3以上的用户** 推荐使用Docker for Mac

Mac安装文件:http://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/


2. 配置镜像加速器

【1】针对**安装了Docker Toolbox的用户**,您可以参考以下配置步骤:

创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。

docker-machine create --engine-registry-mirror=https://vtbud4l2.mirror.aliyuncs.com -d virtualbox default

查看机器的环境配置,并配置到本地,并通过Docker客户端访问Docker服务。

docker-machine env defaulteval "$(docker-machine env default)"docker info

【2】针对**安装了Docker for Mac的用户**,您可以参考以下配置步骤:

在任务栏点击 Docker Desktop 应用图标 -> Settings…,在左侧导航菜单选择 Docker Engine,在右侧像下边一样编辑 json 文件。

修改完成之后,点击 Apply & restart 按钮,Docker 就会重启并应用配置的镜像地址了。


检查加速器是否生效

打开终端,执行 $ docker info,如果从结果中看到了如下内容,说明配置成功。

由于镜像服务可能出现宕机,建议同时配置多个镜像。各个镜像站测试结果请到 docker-practice/docker-registry-cn-mirror-test 查看。


未完待续

  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
感谢您的提问!以下是一些关于 Docker 进阶学习的建议: 1. 学习容器编排工具:Docker Compose 和 Kubernetes 是两个常用的容器编排工具。通过学习它们,您可以更好地管理和编排多个容器,构建复杂的应用架构。 2. 持续集成与持续部署(CI/CD):学习如何使用 Docker 构建持续集成和持续部署流程。这将有助于自动化应用程序的构建、测试和部署,提高开发和交付效率。 3. 多阶段构建(Multi-stage Builds):掌握多阶段构建技术可以帮助您优化 Docker 镜像的大小和性能。通过在构建过程中创建多个阶段,并且只保留最终运行所需的组件,可以减小镜像的体积。 4. Docker 插件和扩展:探索 Docker 的插件和扩展生态系统,了解如何使用它们来扩展 Docker 的功能。一些常见的扩展包括网络插件、存储插件和身份验证插件,它们可以提供额外的功能和灵活性。 5. 容器安全和隔离:学习如何配置和管理容器的安全性和隔离性。了解容器的安全最佳实践,并使用适当的配置和工具来加强容器的安全性,以防止潜在的攻击和数据泄漏。 6. Docker Swarm:Docker Swarm 是 Docker 官方提供的一个原生的容器编排和集群管理工具。通过学习 Docker Swarm,您可以了解如何使用它来管理分布式应用程序,并实现负载均衡和高可用性。 7. 监控和日志:学习如何监控和记录 Docker 容器的性能和日志。了解如何使用相关工具和技术来监测容器的资源利用率、运行状况和错误日志,以便及时发现和解决问题。 这些是 Docker 进阶学习的一些建议,希望对您有所帮助!如有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值