一、理解容器
容器来源于英文中的 container 一词,也有集装箱的意思。
容器的作用:
为进程提供一个独立的运行环境,屏蔽运行环境差异所带来的问题。
容器是使用两大技术实现独立的运行环境
1、文件系统隔离
- 每个容器有独立的文件系统(chroot),容器内文件的操作不影响其他容器和宿主机
2、资源隔离
- 使用namespace技术实现进程间隔离
- 使用Cgroup技术实现限制资源使用
二、容器与虚拟化
虚拟化是利用hypervisor程序模拟硬件,并在其模拟的硬件环境上安装操作系统并运行应用的技术,与传统应用部署方式相比,虚拟化技术能够集中化管理服务器。提高资源利用率,对服务器进行动态调整资源配置,降低能源消耗,通过虚拟化软件的集群功能提供高可靠性等。
但不可忽视的是,由于其实现方式是通过软件模拟硬件,并运行了一个完整的操作系统,执行系统指令的时候需要通过一个软件层进行翻译,存在额外的性能损耗。
硬件辅助虚拟化仅仅解决了翻译层,但还是要运行完整的操作系统。
容器化技术是直接运行在操作系统上,与所有容器共享一个操作系统,且每个容器仅包含了运行该应用所需的必要文件,所以相比虚拟化,容器技术更加轻便快捷,且性能损耗进一步降低,节省运维成本。
三、容器的基本概念
- LXC:是linux container 的缩写,是一个基于linux内核功能特性实现的容器技术。LXC在操作系统上为进程提供执行环境,并利用Cgroup和namespace技术将进程隔离
- 容器隔离:容器将操作系统管理的资源划分到独立的容器中,并让各个容器占用独立的资源。
- 容器共享:容器在相互隔离的同时还提供了资源共享机制
四、常见容器引擎
- Docker:使用量最大的容器引擎
- containerd:K8S v1.24及以上版本默认容器引擎
- Podman:红帽公司开源的容器引擎
- iSulad:华为开源的容器引擎
- Pouch:阿里云开源的容器引擎
五、K8S弃用docker
K8S在1.5版本中引入了一个新的接口标准:CRI。这个接口主要规定了如何调用容器运行时来管理容器和镜像,但这个接口标准与docker调用标准有差异,导致两者不兼容。K8S开发了个dockershim作为一个翻译层,与CRI兼容来使用docker。
在2020年K8S发布1.20版本时声明,在1.24版本中移除了dockershim应用,直接调用docker内部的containerd
六、docker入门
1、安装工具并配置阿里云仓库
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
2、选择合适的版本并安装
yum list docker-ce --showduplicates
yum install -y docker-ce-18.09.9-3.el7
systemctl enable docker.service && systemctl start docker
3、配置国内镜像仓库和cgroup
vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"], # 镜像仓库
"exec-opts": ["native.cgroupdriver=systemd"] # 将cgroup配置为systemd
}
systemctl restart docker
4、常用命令
docker search nginx # 搜索nginx镜像
docker pull nginx:1.23.2 # 下载nginx镜像
docker images ls # 查看当前服务器的镜像
docker save -o nginx.tar nginx:1.23.2 # 将镜像导出成文件
docker load -i nginx.tar # 将镜像导入docker
docker tag nginx:1.23.2 test.reg.com/nginx:v1 # 给镜像打标签
docker run --name "nginx" -d nginx:1.23.2 # 启动容器并命名为nginx
docker ps # 查看正在运行的容器
docker stop nginx # 关闭容器
docker start nginx # 开启容器
docker restart nginx # 重启容器
docker rm nginx # 删除容器
docker rmi nginx:1.23.2 # 删除镜像
docker logs -f --tail 10 nginx # 查看日志输出最近10行并监视后续写入的日志
docker exec -it nginx bash # 进入容器内部执行操作
docker commit # 保存修改后的容器并提交为新容器