1 docker容器架构
1.1 容器架构
• 封装
Docker 是一种容器实现方式,利用Linux内核技术封装成称docker。
• Docker 采用 CS 架构:
(1)客户端:命令行工具(docker)负责与服务器通信。
(2)服务器:docker 服务作为守护进程运行,承担创建、运行和下载容器镜像的任务
1.2 基础云架构
(1)IaaS(基础架构即云):提供最基础的网络畅通的操作系统
(2)PaaS (平台即云):在基础机构上增加了平台服务
(3)SaaS(软件即云):一个成品的云平台,如(云盘,云电视等)
2 docker容器概念
2.1 docker核心三元素
Docker 核心三元素:
• 镜像
image 是只读模板,其中包括应用的库和运行环境。镜像用于创建容器。可以创建、更新或下载镜像,供直接使用。
• 注册表
registry 存储镜像,也可称为镜像仓库,以满足公共或私有的用途。知名的公共注册表为 Docker Hub,它存储了由社区开发的多种镜像。也可在公司中创建私有注册表来支持内部镜像开发。本课程在一台虚拟机上运行私有注册表(私有镜像仓库),其中存储了所有必要的镜像以加快下载。在 RHEL 环境中,注册表为docker-registry.service。
• 容器
container 隔离 namespace 环境,让应用与共享同一主机操作系统的其他应用相互隔离。
2.2 docker容器内核与linux的关系
容器由 Docker 从 Docker 格式的容器镜像创建,通过 Linux 内核的若干标准功能相互隔离。其中 包括
• namespace(隔离技术):内核可以将通常对所有进程可见的特定系统资源放在一个命名空间中。在一个命名空间中,只有属于该命名空间的进程才能看到这些资源。可放入命名空间的资源包括网络接口、进程 ID 列表、挂载点、IPC 资源,以及系统本身的主机名称等。
• cgroups(资源限制):控制组将进程和子进程的集合分入不同的组中,以管理和限制它们消耗的资源。控制组对属于容器的进程可以使用的系统资源数量加以限制。这可防止一个容器占用容器主机上太多的资源
• SELinux(安全设置):SELinux 是一种强制访问控制系统,用于防止容器互相影响,并且防止容器主机受到其自己运行的容器的影响。标准的 SELinux 类型实施用于保护主机系统,以免受到运行的容器的干扰。 容器进程作为受限 SELinux 类型运行,对主机系统资源具有有限的访问权限。
此外,sVirt 利 用 SELinux 多类别安全 (MCS) 来防止容器互相影响。每个容器的进程放入唯一的类别中,从而互相隔离。
2.3 docker容器特性
Docker容器有很多特性,主要体现在隔离性、快速部署、镜像管理、灵活、跨平台、版本控制、安全。主要体现在如下方面:
- 隔离性:每个Docker容器运行在完全独立的根文件系统里,并且拥有自己的网络命名空间,实现文件系统和网络隔离。同时,使用cgroup可以为每个容器分配不同的系统资源,例如CPU和内存,实现资源隔离。
- 快速部署:Docker容器可以快速部署,因为它们是轻量级的,可以在任何流行的Linux机器上运行,并且可以快速启动和停止。
- 镜像管理:Docker容器基于镜像创建,镜像是Docker容器运行时的只读模板,因此可以方便地创建、部署和扩展容器。
- 灵活性强:Docker容器具有灵活的扩展性,可以通过插件机制来添加新功能,并且可以在容器内部使用Docker命令来管理容器镜像和容器集群。
- 跨平台性:Docker容器可以在不同的操作系统和平台上运行,例如Windows、Mac、Linux等,这使得跨平台开发变得非常简单。
- 版本控制:对Docker容器进行版本控制,可以轻松地回滚到之前的版本,也可以方便地比较不同版本的差异。
- 安全性:Docker容器具有很高的安全性,因为每个容器都有自己的文件系统和网络配置,并且不能直接访问主机的文件系统和网络。同时,Docker还提供了很多安全机制来保护容器的安全运行。
3 docker容器镜像
3.1 关于镜像
容器镜像是一个文件系统镜像,用以创建和启动容器。此文件系统不但包含应用进程,还包含其所需的依赖:共享库;OS 用户命令;运行的服务。通过一种封装机制,将应用及其运行的依赖关系打包到一个tar包中。
Docker 提供了一个简单的 CLI 和 API 来创建管理容器。Docker 将其都整合到了一个简单的命令中:除了创建和管理容器外,Docker 同时提供一个标准的容器镜像格式,其为一个 tar 包,包含了完整的容器文件系统(整合所有的库、命令、工作目录、镜像的描述 metadata)。Docker 格式的容器镜像,不可以被修改,如果需要自定义容器镜像,需要在原始镜像上进行 layer。 一个复杂的镜像可以在一个基础的 OS 镜像上通过叠加各个应用相关的层来创建,这种模式可以接受磁盘空间:完整的 docker 镜像在运行的容器之间进行共享。layers 被镜像之间进行共享。 Docker 容器镜像同时提供了一个标准的基于 HTTP 协议的 image registries,类似于yum 仓库,存储 docker 镜像而不是 RPM 包。任何机构均可以搭建公共或私有镜像仓库,用以分享 docker images。
3.2 关于端口映射
Docker 容器具有私有的虚拟网络,而且带有私有 IP 地址。所有的容器私有网络接口接到一个虚拟网桥 docker0。容器之间相互通信,通过 Docker 的 iptables MASQUERADE 规则,容器可以在主机之间进行通信。使用下面的命令
代码语言:javascript复制# docker inspect container_id
可以查看容器的私有 IP,但是这个 私有 IP 无法跨主机访问。通过端口映射可以将主机的端口映射到容器的端口上,这样就可以通过访问主机端口来访问容器中的服务
代码语言:javascript复制# docker run -p 10080:80 webserver
3.3 关于Dockerfiles
此处就不再赘述,可以参考博主的另外一篇博文:运维实践|Dockerfile自定义镜像原创(https://cloud.tencent.com/developer/article/2364626)。
4 如何使用docker实践操作
4.1 docker基础命令
代码语言:javascript复制$ systemctl restar docker
$ docker info // 查看docker版本及基础信息
$ docker images // 查看镜像
$ docker pull [imageName] // 下载镜像
$ docker run -itd 镜像 sh (打开容器后台运行)
$ docker run -it 镜像 sh (打开容器进入交互)
$ docker images //查看镜像
$ docker ps //查看所有运行的容器
$ docker ps -a //查看运行和关闭的容器
$ docker inspect [containerId] // 查看容器信息[查看容器的IP地址]真实主机上安装docker后会自动生成一个docker0 ,可以直接与容器通信
$ docker stop [containerId] // 关闭容器
$ docker ps -a // 查看所有
$ docker start [containerId] // 启动
$ docker rm [containerId] // 容器删除
$ docker rmi [imagesName|containerId]
run启动容器
-i:启动后给一个交互
-t:开一个终端
-d:后台启动
启动一个镜像,并开启一个sh程序
看到这里是否感觉已经比较简单了些,带着疑问和注释,建议手动执行下,增加命令的熟练度。
4.2 docker配置命令
代码语言:javascript复制# 打开配置文件
$ vim /etc/sysconfig/docker
# 增加配置,打开docker配置文件(存放镜像的服务器,原为docker官网镜像服务器)
ADD_REGISTRY='--add-registry xxx.xxx.com:端口号'
# 重新启动
$ systemctl restar docker // 修改后重启docker
总结
学习Docker需要理论与实践相结合,多动手操作和尝试,积累经验才能更好地掌握和应用。学习Docker主要从以下几个方面入手:Docker基础概念、安装和配置、镜像管理、Docker容器管理、Docker数据管理、Docker安全、Docker应用开发。再结合官网提供的文档结合实践,相信你会熟能生巧。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!