5. Docker——先快速入门
本章讲解知识点
- Docker 是什么
- 为什么要使用 Docker
- Docker 引擎
- Docker 常用命令
- Docker 生命周期详解
<br>
虽然我们上一章教大家搭建好了 Kubernetes + Docker 环境,但是我们本章是先从 Docker 讲起,为后面学习 Kubernetes 打好基础。
1. Docker 是什么
Docker 是一种开源的容器化平台,可以将应用程序及其所有依赖项打包到一个可移植的容器中,以便在任何地方运行。Docker 容器是轻量级、可移植的,具有很高的灵活性和可扩展性,可以帮助开发者更快地构建、打包、部署和运行应用程序。事实上,Docker 已成为容器标准。
Docker 技术是基于 Linux 容器技术的进一步发展,通过使用容器技术,Docker 可以为应用程序提供一个独立的运行环境,避免了由于不同的环境和依赖项引起的兼容性问题。
Docker 的优势包括快速构建、部署和迁移应用程序,提高了应用程序的可靠性和稳定性,同时减少了资源的浪费。Docker 还可以与其他开发工具和平台集成,如 Kubernetes、Jenkins 和 AWS 等,为开发人员提供更加便捷的开发和部署体验。
<br>
2. 为什么要使用 Docker
解释为什么要使用 Docker,就等于解释为什么要使用容器。
2.1. 节省资源
容器相对于虚拟机,容器只需要具备 app 运行的配置和 SDK 即可,不需要创建完整的操作系统,使用的资源大大减少。
2.2. 资源隔离
比如一个虚拟机,跑一个 app,如 redis,没什么问题。但是我想跑不同版本的 redis,那么配置是不是可能冲突,环境是不是受到了污染?
而如果换用容器技术,一个容器就是一个小操作系统,一个虚拟机上可以跑多个容器,那么轻易实现了跑不同版本的 redis,而且还资源隔离,删除容器即卸载了对应版本,是不是非常方便。
2.3. 安装时间大大缩短和灵活移植
一个容器运行了 redis,对应的系统配置和 SDK 依赖都是一样的,那么如果我能将这个容器导出成文件格式,然后再另一台虚拟机上导入运行起来,这样是不是就节省了安装时间呢?没错,容器虚拟技术结合 Union File System(联合文件系统)技术就是这么做的。
这样带来的效率提升简直无可言喻。开发以容器虚拟技术开发应用后,将其打包导出,直接交给测试,测试在自己的环境上导入并运行,直接就可以完成测试,大大缩短了应用开发周期。而测试人员完成应用测试后,将其导出,直接就可以上线工业环境,缩短了业务上线周期。
甚至将文件开源,建立容器镜像库,全世界的人都可以使用,安装应用只需要下载对应镜像即可快速安装,大大减少了学习成本。
<br>
3. Docker 引擎
3.1 核心组件
Docker 引擎是一种基于客户端-服务器( C/S 架构)模型的应用程序。Docker 核心组件架构就长上图这个样子,由如下主要的组件构成:服务端 Docker 进程(Server Docker Daemon)、API 接口(REST API)、Docker 客户端命令行(Client Docker CLI)。Docker 服务端处理 Docker 客户端的请求,并执行相应的操作,并负责管理容器(Containers)、镜像(Images)、网络(Networks)、数据卷(Data Volumes)。
核心组件的作用分别如下:
- 服务端 Docker 进程(Server Docker Daemon):负责管理 Docker 容器和镜像;处理客户端的请求,并执行相应的操作。
- API 接口(REST API):为 Docker 客户端提供与服务端 Docker daemon 交互的接口。
- Docker 客户端命令行(Client Docker CLI):允许用户与服务端 Docker daemon 交互,客户端发送的一系列请求,例如运行容器、构建镜像等操作,将最终由服务端 Docker daemon 来执行。
- Docker 镜像(Images):是一个轻量级、可执行的软件包,其中包含了运行应用程序所需的所有代码、库、配置文件等。容器镜像可以通过运行容器来启动,容器会使用镜像创建一个独立的运行环境,包含容器镜像中的所有文件和依赖项。
- Docker 容器(Containers):是 Docker 中的运行时实体,包含了应用程序及其依赖关系,可以被启动、停止、重启、删除等操作。
- Docker 网络(Networks):允许容器之间进行通信,并提供网络隔离、端口映射等功能。
- Docker 存储(Data Volumes):提供容器内部数据的持久化存储功能,包括数据卷、本地文件系统、网络存储等。
3.2 小实验
我们通过环境实操来看看这些组件,让我们有一个具体直观的感受。
1.通过 MobaXterm 登录数据节点 node1
Last login: Wed Mar 29 07:35:27 2023 from 192.168.18.1 [mtuser@node1 ~]$ su Password: [root@node1 mtuser]# unset HISTSIZE [root@node1 mtuser]#
2.通过 docker info
命令查看客户端与服务端
[root@node1 mtuser]# docker info Client: Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.10.2 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v2.16.0 Path: /usr/libexec/docker/cli-plugins/docker-compose scan: Docker Scan (Docker Inc.) Version: v0.23.0 Path: /usr/libexec/docker/cli-plugins/docker-scan Server: Containers: 21 Running: 20 Paused: 0 Stopped: 1 Images: 11 Server Version: 23.0.1 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Using metacopy: false Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: systemd Cgroup Version: 1
可以看到客户端与服务端的各类信息,如版本等,服务端还记录了各种状态检测。
3.查看服务端 Docker daemon
服务端 Docker daemon 是一个守护进程,守护进程就被放置在 centOS 系统的 /etc/systemd/system/multi-user.target.wants/
目录下:
lrwxrwxrwx. 1 root root 38 Feb 19 00:20 docker.service -> /usr/lib/systemd/system/docker.service lrwxrwxrwx. 1 root root 39 Feb 19 00:25 kubelet.service -> /usr/lib/systemd/system/kubelet.service lrwxrwxrwx. 1 root root 46 Feb 19 07:47 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service lrwxrwxrwx. 1 root root 36 Feb 19 07:47 sshd.service -> /usr/lib/systemd/system/sshd.service
你可以看到很多重要的进程都被放在该目录下,如 Docker、kubelet、sshd 等。这些进程会在开机时被 systemd 进程给拉起来。
4.通过 docker ps
命令来查看容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0b8403d32d32 eb516548c180 "/coredns -conf /etc…" 10 hours ago Up 10 hours k8s_coredns_coredns-5c98db65d4-dvjnt_kube-system_9a7128e8-2acb-4932-92ec-0d08987a5ac8_10 5173c3176823 eb516548c180 "/coredns -conf /etc…" 10 hours ago Up 10 hours k8s_coredns_coredns-5c98db65d4-djhf4_kube-system_8c60a86c-48df-42c5-8300-073d9ad31ab3_3 9281b678cfc0 f73640fb5061 "/metrics-server --c…" 10 hours ago Up 10 hours k8s_metrics-server_metrics-server-765bbd5859-ssfsk_kube-system_5e22dc07-7817-46ae-ae24-2c75a1511432_3 f3348ad3f43a k8s.gcr.io/pause:3.1 "/pause" 10 hours ago Up 10 hours k8s_POD_coredns-5c98db65d4-djhf4_kube-system_8c60a86c-48df-42c5-8300-073d9ad31ab3_5
可以看到我们查出来的信息记录了容器的名称、运行时间、使用镜像等。
5.通过 docker images
命令查看镜像信息
[root@node1 multi-user.target.wants]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx my-all adb14340751e 5 weeks ago 171MB redis latest 7614ae9453d1 15 months ago 113MB k8s.gcr.io/metrics-server/metrics-server v0.5.2 f73640fb5061 16 months ago 64.3MB registry.aliyuncs.com/google_containers/kube-proxy v1.15.12 00206e1127f2 2 years ago 82.5MB k8s.gcr.io/coredns 1.3.1 eb516548c180 4 years ago 40.3MB registry.aliyuncs.com/google_containers/pause 3.1 da86e6ba6ca1 5 years ago 742kB
6.通过 docker network ls
命令查看网络信息
[root@node1 multi-user.target.wants]# docker network ls NETWORK ID NAME DRIVER SCOPE 5799c2d7d17a bridge bridge local 17bce51528bb host host local d635ff5a1e25 none null local
查看具体的信息:
[root@node1 multi-user.target.wants]# docker network inspect 17bce51528bb [ { "Name": "host", "Id": "17bce51528bbf722d91619158cae222061b7982335afb3427a916c393e4cf4bd", "Created": "2023-02-19T00:20:15.348822313-05:00", "Scope": "local", "Driver": "host", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "6255674a18b7429b0428ad1596a4e057cd3809452e43a90ee1bda6224ca50ea5": { "Name": "k8s_POD_kube-proxy-nzmw5_kube-system_1700d664-d1cb-46dc-ad0e-3d2e0eb8cac8_6", "EndpointID": "d8d11d335c4032cbdbb3e9dc89c34f363b8ece9e6196d52536768dc12293636e", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" }, "f23b51b3aed38196cdf011467ac9491af868f0ea7e554706819c135d45500afb": { "Name": "k8s_POD_kube-flannel-ds-ch66n_kube-system_9efb5869-20d7-425b-b684-f422ac8248ca_6", "EndpointID": "ae6dc64f21286467504b4b979091f30e4213b98a4498e966cd4e2fd335318af8", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" }
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专刊适合于立志转行云计算的小白,有一定的编程、操作系统、计算机网络、数据结构、算法基础。 本专刊同时也适合于面向云计算(Docker + Kubernetes)求职的从业者。 本专刊囊括了云计算、VMWare、Docker、Kubernetes、Containerd等一系列知识点的讲解,并且最后总