系列文章目录
【Kubernetes 入门实战课】Day01——搭建kubernetes实验环境(一)
文章目录
- 系列文章目录
- 前言
- 一、Docker的诞生
- 二、Docker的形态
- 1、Docker Desktop
- 2、Docker Engine
- 二、Docker的安装
- 1、服务器连接外网安装
- 2、服务器不通外网
- 三、Docker的使用
- 三、Docker的架构
- 总结
前言
俗话说:“万事开头难”,对于 Kubernetes 这个庞大而陌生的领域来说更是如此,如何迈出学习的第一步非常关键,所以,今天我们先从最简单、最基本的知识入手,聊聊最流行的容器技术 Docker,先搭建实验环境,再动手操作一下,进而破除它的神秘感。
一、Docker的诞生
2013 年 3 月 15 日,在北美的圣克拉拉市召开了一场 Python 开发者社区的主题会议 PyCon,研究和探讨各种 Python 开发技术和应用,与我们常说的“云”“PaaS”“SaaS”根本毫不相关。在当天的会议日程快结束时,有一个“闪电演讲”(lighting talk)的小环节。其中有一位开发者,用了 5 分钟的时间,做了题为 “The future of Linux Containers” 的演讲,不过临近末尾因为超时而被主持人赶下了台,场面略显尴尬。
PyCon2013 大会之后,许多人都意识到了容器的价值和重要性,发现它能够解决困扰了云厂商多年的打包、部署、管理、运维等问题,Docker 也就迅速流行起来,成为了 GitHub 上的明星项目。然后在几个月的时间里,Docker 更是吸引了 Amazon、Google、Red Hat 等大公司的关注,这些公司利用自身的技术背景,纷纷在容器概念上大做文章,最终成就了我们今天所看到的至尊王者 Kubernetes 的出现。
二、Docker的形态
目前使用 Docker 基本上有两个选择:Docker Desktop 和 Docker Engine。
1、Docker Desktop
①、专门针对 个人使用而设计的,支持Mac和Windows快速安装
②、具有直观的图形界面
③、集成了许多周边工作,方便易用
④、对个人学习免费,受条款限制不能商用
2、Docker Engine
①、完全免费
②、只能在Linux上运行,使用命令行操作,缺乏辅助工具
③、哥哥公司生产环境中实际使用的产品
因此接下来我们学习的就是 Docker Engine ,之后的Docker通常指的就是Docker Engine。
二、Docker的安装
我们已经在 Linux 虚拟机里安装了一些常用软件,用的是Centos中的包管理工具yum,所以,我们仍然可以使用同样的方式来安装Docker。
1、服务器连接外网安装
[root@bogon ~]# yum install -y docker
我们可以直接使用yum安装docker,前提是需要我们的虚拟机通外网。安装成功后,我们支持docker version命令会发现,提示Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?,因此需要启动docker
[root@bogon ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
#启动docker
[root@bogon ~]# systemctl start docker
Docker Engine 不像 Docker Desktop 那样可以安装后就直接使用,必须要做一些手工调整才能用起来,所以你还要在安装完毕后执行下面的两条命令:
[root@bogon ~]# systemctl start docker #启动docker服务
[root@bogon ~]# sudo usermod -aG docker ${USER} #当前用户加入docker组
需要将普通用户加入docker组中,才可以使用普通用户执行docker相关操作。值得注意的是,我们在实验环境是直接使用root操作的,在正式环境是不允许使用root用户进行系列操作的。
现在我们就可以来验证 Docker 是否安装成功了,使用的命令是 docker version 和 docker info。
#docker version 会输出 Docker 客户端和服务器各自的版本信息
[root@bogon ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-209.git7d71120.el7.centos.x86_64
Go version: go1.10.3
Git commit: 7d71120/1.13.1
Built: Wed Mar 2 15:25:43 2022
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-209.git7d71120.el7.centos.x86_64
Go version: go1.10.3
Git commit: 7d71120/1.13.1
Built: Wed Mar 2 15:25:43 2022
OS/Arch: linux/amd64
Experimental: false
#docker info 会显示当前 Docker 系统相关的信息,例如 CPU、内存、容器数量、镜像数量、容器运行时、存储文件系统
[root@bogon ~]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.13.1
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: journald
Cgroup Driver: systemd
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: docker-runc runc
Default Runtime: docker-runc
Init Binary: /usr/libexec/docker/docker-init-current
containerd version: (expected: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc version: 8891bca22c049cd2dcf13ba2438c0bac8d7f3343 (expected: 9df8b306d01f59d3a8029be411de015b7304dd8f)
init version: fec3683b971d9c3ef73f284f176672c44b448662 (expected: 949e6facb77383876aeff8a6944dde66b3089574)
Security Options:
seccomp
WARNING: You're not using the default seccomp profile
Profile: /etc/docker/seccomp.json
selinux
Kernel Version: 3.10.0-862.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 3
CPUs: 1
Total Memory: 3.685 GiB
Name: bogon
ID: 2ZNA:3YMR:P3LG:6SAO:ZZ5B:VVFC:N52V:RO3F:DT4C:SZEH:KXVS:4GO2
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Registries: docker.io (secure)
[root@bogon ~]#
2、服务器不通外网
如果服务器不通外网,这会使得我们安装docker花费更多的时间,因此我们可以使用脚本一键安装。
一键安装Docker
执行安装脚本后,后续执行docker version和docker info,可以正常查看到当前docker的版本等信息。
三、Docker的使用
首先,我们使用命令 docker ps,它会列出当前系统里运行的容器,就像我们在 Linux 系统里使用 ps 命令列出运行的进程一样。
因为我们刚刚安装好 Docker 环境,这个时候还没有运行任何容器,所以列表显然是空的
注意,所有的 Docker 操作都是这种形式:以 docker 开始,然后是一个具体的子命令,之前的 docker version 和 docker info 也遵循了这样的规则。你还可以用 help 或者 --help 来获取帮助信息,查看命令清单和更详细的说明。
接下来,让我们尝试另一个非常重要的命令 docker pull ,从外部的镜像仓库(Registry)拉取一个 busybox 镜像(image),你可以把它类比成是Centos里的“yum install”下载软件包:
[root@bogon ~]# docker pull busybox
Using default tag: latest
Trying to pull repository docker.io/library/busybox ...
latest: Pulling from docker.io/library/busybox
205dae5015e7: Pull complete
Digest: sha256:7b3ccabffc97de872a30dfd234fd972a66d247c8cfc69b0550f276481852627c
Status: Downloaded newer image for docker.io/busybox:latest
我们再执行命令 docker images ,它会列出当前 Docker 所存储的所有镜像:
[root@bogon ~]# docker images
#镜像仓库 tag id信息 镜像id 创建时间 镜像大小
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest 66ba00ad3de8 6 days ago 4.87 MB
这条命令会在我们的终端上,输出计算机世界最著名的语句“hello world”:
[root@bogon ~]# docker run busybox echo hello world
hello world
然后我们再用 docker ps 命令,加上一个参数 -a ,就可以看到这个已经运行完毕的容器:
三、Docker的架构
Docker Engine 的架构,精准地描述了 Docker Engine 的内部角色和工作流程:
刚才我们敲的命令行 docker 实际上是一个客户端 client ,它会与 Docker Engine 里的后台服务 Docker daemon 通信,而镜像则存储在远端的仓库 Registry 里,客户端并不能直接访问镜像仓库。
Docker client 可以通过 build、pull、run等命令向 Docker daemon 发送请求,而 Docker daemon 则是容器和镜像的“大管家”,负责从远端拉取镜像、在本地存储镜像,还有从镜像生成容器、管理容器等所有功能。
所以,在 Docker Engine 里,真正干活的其实是默默运行在后台的 Docker daemon,而我们实际操作的命令行工具“docker”只是个“传声筒”的角色。
总结
Docker Engine 是典型的客户端 / 服务器(C/S)架构,命令行工具 Docker 直接面对用户,后面的 Docker daemon 和 Registry 协作完成各种功能。