在接下来的时间,我将开一个很长的篇章来学习每个SRE与开发人员都必须熟悉的技术K8S,让我们一起学习一起进步,一起喝着咖啡搞SRE吧。
我们先从最简单、最基本的知识入手,聊聊最流行的容器技术Docker
Docker的起源与容器技术
Docker不仅仅是一个工具,它代表了一种全新的软件开发和部署范式。容器技术的出现,使得软件的打包、分发和运行变得更加高效和一致。与传统的虚拟机相比,容器提供了一种更加轻量级和灵活的解决方案,它们共享宿主机的操作系统内核,而不是模拟整个操作系统,这大大减少了资源消耗和启动时间。
Docker的诞生
Docker在2013年首次在PyCon会议上亮相,这次会议对于Docker的发展具有重要意义。在会议上,Docker的创始人Solomon Hykes进行了主题演讲,介绍了Docker的概念和功能。
Docker是一种开源的应用容器引擎,它可以自动化地构建、部署和运行应用程序。Docker的设计理念是“一次构建,到处运行”,这意味着开发者可以使用Docker在任何支持Docker的环境中运行他们的应用程序,而不需要担心环境差异的问题。
在PyCon 2013会议上,Solomon Hykes展示了Docker的基本用法,包括如何构建镜像、如何运行容器等。他的演讲引起了与会者的极大兴趣,并在会后引发了广泛的讨论和关注。
此后,Docker的发展势头强劲,逐渐成为云计算领域的重要技术之一。这种理念迅速获得了开发者社区的广泛认可,并催生了Kubernetes等云原生技术的发展,这些技术进一步推动了微服务架构和持续集成/持续部署(CI/CD)实践的普及。展。
Docker的形态
Docker提供了两种主要的产品形态:
- Docker Desktop:这是一个面向个人用户的桌面应用程序,它提供了一个图形用户界面,使得用户可以更直观地管理容器。然而,Docker Desktop是一个商业产品,对于商业用途有一定的限制。
- Docker Engine:这是一个开源的服务器产品,它只能在Linux上运行,但提供了企业级的功能和稳定性,适合用于生产环境。
Docker的安装与使用
在Linux系统上安装Docker Engine,我们可以通过包管理器来实现。以下是安装步骤的详细描述:
更新包管理器的本地数据库:
sudo apt update
安装必要的依赖包:
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
添加Docker的官方GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
设置稳定的Docker APT仓库:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
再次更新包管理器的本地数据库:
sudo apt update
安装Docker Engine:
sudo apt install -y docker-ce docker-ce-cli containerd.io
启动Docker服务并设置开机启动:
sudo systemctl start dockersudo systemctl enable docker
添加当前用户到docker组(以便无需sudo即可运行Docker命令):
sudo usermod -aG docker ${USER}
验证Docker是否安装成功:
root@adming-virtual-machine:~# docker versionClient: Docker Engine - Community Version: 26.1.0 API version: 1.45 Go version: go1.21.9 Git commit: 9714adc Built: Mon Apr 22 17:06:41 2024 OS/Arch: linux/amd64 Context: default
Server: Docker Engine - Community Engine: Version: 26.1.0 API version: 1.45 (minimum version 1.24) Go version: go1.21.9 Git commit: c8af8eb Built: Mon Apr 22 17:06:41 2024 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.31 GitCommit: e377cd56a71523140ca6ae87e30244719194a521 runc: Version: 1.1.12 GitCommit: v1.1.12-0-g51d5e94 docker-init: Version: 0.19.0 GitCommit: de40ad0
root@adming-virtual-machine:~# docker infoClient: Docker Engine - Community Version: 26.1.0 Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.14.0 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v2.26.1 Path: /usr/libexec/docker/cli-plugins/docker-compose
Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 26.1.0 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Using metacopy: false Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: systemd Cgroup Version: 2 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog Swarm: inactive Runtimes: runc io.containerd.runc.v2 Default Runtime: runc Init Binary: docker-init containerd version: e377cd56a71523140ca6ae87e30244719194a521 runc version: v1.1.12-0-g51d5e94 init version: de40ad0 Security Options: apparmor seccomp Profile: builtin cgroupns Kernel Version: 6.5.0-28-generic Operating System: Ubuntu 22.04.2 LTS OSType: linux Architecture: x86_64 CPUs: 8 Total Memory: 7.712GiB Name: adming-virtual-machine ID: 2ce4d809-8b07-48b5-a81b-1206c1acf500 Docker Root Dir: /var/lib/docker Debug Mode: false Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false
Docker的使用
Docker的基本操作包括拉取镜像、运行容器、管理容器等。以下是一些基本命令的详细示例:
拉取镜像:
docker pull busyboxUsing default tag: latestlatest: Pulling from library/busybox7b2699543f22: Pull complete Digest: sha256:c3839dd800b9eb7603340509769c43e146a74c63dca3045a8e7dc8ee07e53966Status: Downloaded newer image for busybox:latest
运行容器,并在容器内执行一个命令:
docker run --rm busybox echo hello worldhello world
--rm
参数会在容器退出时自动清理容器文件系统。
列出当前运行的容器:
docker ps
列出所有容器(包括未运行的):
docker ps -a
启动已存在的容器:
docker start container_id_or_name
进入正在运行的容器的命令行:
docker exec -it container_id_or_name /bin/sh
-it
参数让Docker提供一个交互式终端。
Docker的架构
Docker 使用客户端-服务器架构。Docker 客户端与 Docker 守护进程通信,后者负责构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护进程可以在同一系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护进程。Docker 客户端和守护进程使用 REST API 通过 UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许我们使用由一组容器组成的应用程序。
Docker 守护进程
Docker 守护进程 ( dockerd
) 侦听 Docker API 请求并管理 Docker 对象,例如镜像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理 Docker 服务。
Docker 客户端
Docker 客户端 ( docker
) 是许多 Docker 用户与 Docker 交互的主要方式。当我们使用诸如 之类的命令时docker run
,客户端会将这些命令发送到dockerd
,由后者执行这些命令。该docker
命令使用 Docker API。Docker 客户端可以与多个守护进程通信。
Docker 桌面
Docker Desktop 是一款适用于 Mac、Windows 或 Linux 环境的易于安装的应用程序,使我们能够构建和共享容器化应用程序和微服务。Docker Desktop 包括 Docker 守护进程 ( dockerd
)、Docker 客户端 ( docker
)、Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。有关更多信息,请参阅Docker 桌面。
Docker 注册表
Docker 注册表存储 Docker 镜像。Docker Hub 是任何人都可以使用的公共注册表,Docker 默认在 Docker Hub 上查找镜像。我们甚至可以运行自己的私人注册表。
当我们使用docker pull
或docker run
命令时,Docker 从我们配置的注册表中提取所需的镜像。当我们使用该docker push
命令时,Docker 会将我们的镜像推送到我们配置的注册表。
Docker 对象
当我们使用 Docker 时,我们正在创建和使用镜像、容器、网络、卷、插件和其他对象。本节简要概述其中一些对象。
Images
镜像是一个只读模板,包含创建 Docker 容器的说明。通常,一个镜像基于另一个镜像,并进行一些额外的自定义。例如,我们可以构建一个基于该ubuntu
镜像的镜像,但会安装 Apache Web 服务器和我们的应用程序,以及运行应用程序所需的配置详细信息。
我们可以创建自己的镜像,也可以仅使用其他人创建并在注册表中发布的镜像。要构建我们自己的镜像,我们可以使用简单的语法创建一个 Dockerfile,用于定义创建镜像并运行它所需的步骤。Dockerfile 中的每条指令都会在镜像中创建一个层。当我们更改 Dockerfile 并重建镜像时,只会重建那些已更改的层。与其他虚拟化技术相比,这就是镜像如此轻量、小型且快速的部分原因。
Containers
容器是镜像的可运行实例。我们可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。我们可以将容器连接到一个或多个网络,为其附加存储,甚至可以根据其当前状态创建一个新镜像。
默认情况下,容器与其他容器及其主机相对较好地隔离。我们可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。
容器由其镜像以及我们在创建或启动它时提供给它的任何配置选项来定义。当容器被删除时,任何未存储在持久存储中的状态更改都会消失。
小结
Docker作为容器技术的代表,其设计哲学和架构对整个软件行业产生了深远的影响。通过Docker,开发者和运维人员能够轻松地打包、分发和部署应用,极大地提升了软件交付的效率和一致性。理解Docker的工作原理和常用命令对于深入学习容器技术和云原生应用至关重要。
下篇章预告
这里我了解了docker的背景与基础知识,下个篇章我们将透过现象看本质,深入的探索Linux容器化与Docker 技术 的原理与本质。