容器化 vs 虚拟化
从前文虚拟化技术的架构图中,你能清晰地看出,由虚拟机管理程序创建抽象层并完成分离,使多个操作系统运行在单一的硬件平台之上。
而你安装操作系统的目的,不就是为了提供环境以使用某个特定的应用程序吗?如此看来,虚拟化技术通过一个完整的内核来为你实现隔离的代价确是很大。
容器是一个打包了代码及其全部依赖的软件标准单元,是依靠内核功能,对操作系统而非硬件的虚拟化。单词容器 container 又有集装箱之意,这样一层封装便如同集装箱一样为你带来了隔离与标准。
接下来就是如今最主流的容器化技术 Dcoker。
安装 Docker
这里使用的是 Docker Community Edition (docker-ce),官方安装指南:https://docs.docker.com/install/linux/docker-ce/centos
首先安装必要的程序包,并且设置稳定的 Docker 仓库:
yum install yum-utils device-mapper-persistent-data lvm2 -y
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
接着安装最新社区版的 Docker 引擎以及 containerd:
yum install docker-ce docker-ce-cli containerd.io
启动 Docker 并且通过运行 hello-world 镜像验证安装结果:
systemctl start docker
docker run hello-world
后文,先来对其输出来学习 Docker,
知识点
此 Docker 的架构图取自官网:
其为 C/S 架构,Docker 客户端工具与 Docker 守护进程通信,以完成镜像的构建、拉取以及容器的运行等操作。
你敲击 docker run,通过 Docker Client 向监听中的 dockerd 进程发送运行容器命令。如输出第一行所示,你本地没有名为 hello-world 且默认标签为 lateset 的镜像。随后便开始了从 registry 远程仓库的拖拽操作。
再看向第二段,该容器只完成了一件事,输出操作。随着该指令运行完成的退出,其容器也退出了,
docker container ls --all
查询当前全部容器的状态,其中也记录它退出了的时间信息。
为 Docker 加速!编辑 /etc/docker/daemon.json 为其添加如下一行,并重新启动服务:
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
systemctl restart docker
来一个更大点的,在容器上安装 CentOS 系统;-i 指明你将要 interactive 交互式地运行 /bin/bash,并为其分配 tty 终端,
docker container run -it centos /bin/bash
以容器化的方式创建操作系统就是这么简单,而且通过 docker image ls 命令查看镜像信息,它也仅仅 237MB。
当然在 Docker 中仅仅运行一个应用程序,才是其高明之处。这里以 httpd 为例 ,先拖拽镜像,
docker pull httpd
同样拖拽的是默认 latest 标签的镜像,其中 -d 意为在后台运行容器,并将之命名为 web1,同时将容器中的 80 端口发布在主机上的 8080 端口,
docker container run --name web1 -d -p 8080:80 httpd
容器启动后,你来通过 curl 命令访问本机的 8080 端口,
curl localhost:8080
It works!
最后还要为你介绍查看容器信息的命令,
docker container inspect web1
输出结果中,不难找到容器 web1 的 ip 地址为 172.17.0.2,接着通过 curl 命令访问 web1 的 80 端口,
curl 172.17.0.2:80
同样,It works!