1960年IBM开始推出大型主机虚拟化,虚拟机虚拟化主要代表是Xen、Kvm,至到2013 年 3 月 Docker出世,一种容器技术组件。
传统虚拟化一般通过硬件来模拟实现,也可以通过操作系统软件来实现。而容器技术则充分利用OS本身已有的机制与特性,更加优雅的实现远超传统虚拟机的轻量级虚拟化。被称为”新一代的虚拟化“技术,并将基于容器打造的云平台称为“容器云”。
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低,大量节省宿主机资源。
17.03版本后分为CE-Community Edition社区版和EE-Enterprise Edition企业版。
Docker的构想是要实现“Build,Ship and Run Any App, Anywhere",即通过对应用组件的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的“一次封装,到处运行”。应用组件,既可以是一个Web应用、一个编译环境、一套数据库平台服务,甚至是一个操作系统或集群。
Docker提供了各种容器管理工具(如分发、版本、移植等),让用户无须关注底层的操作,更加简单明了地管理和使用容器;其次,Docker通过引入分层文件系统构建和高效的镜像机制,降低了迁移难度,极大地改善了用户体验。用户操作Docker容器就像操作应用自身一样简单。
那些典型的应用场景?
Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
如何安装?
1)确定安装版本
Docker: https://hub.docker.com/_/docker
标注:免费的社区版:ce 收费的企业版:ee 轻量级版:alpine
2)安装(在线)
2.1)设置 Docker 仓库(或者#安装yum install\ yum update)
yum install -y yum-utils device-mapper-persistent-data lvm2
2.2)检查是否存在Docker,并且删除旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.3)设置stable镜像仓库(阿里云)
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/
centos/docker-ce.repo
2.4)安装最新版本的 Docker
yum install docker-ce docker-ce-cli containerd.io
或 安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:
yum list docker-ce --showduplicates | sort -r
sudo yum install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io
[root@iZm5eblmh3oa6nk0bpvg19Z ~]# yum list docker-ce --showduplicates | sort -r
Installed Packages
docker-ce.x86_64 3:20.10.9-3.el8 docker-ce-stable
docker-ce.x86_64 3:20.10.8-3.el8 docker-ce-stable
docker-ce.x86_64 3:20.10.7-3.el8 docker-ce-stable
docker-ce.x86_64 3:20.10.6-3.el8 docker-ce-stable
docker-ce.x86_64 3:20.10.5-3.el8 docker-ce-stable
docker-ce.x86_64 3:20.10.4-3.el8 docker-ce-stable
docker-ce.x86_64 3:20.10.3-3.el8 docker-ce-stable
如上:VERSION_STRING=20.10.9
2.5)启动 systemctl start docker
2.6)通过运行hello-world镜像来验证Docker引擎是否正确安装 docker run hello-world
2.7)查询docker版本 docker -v
2.8)删除安装包\删除镜像、容器、配置文件等内容
yum remove docker-ce
rm -rf /var/lib/docker
如何工作?
CS架构,client-server模式,client端负责处理用户输入的各种命令,比如docker build、docker run;server端[docker demon]负责任务的执行。
docker的工作流程:
1-docker build: docker daemon创建“可执行程序”image
2-docker run: docker daemon接收到命令找到具体的image,然后加载到内存开始执行。containers:容器是独立运行的一个或一组应用,是镜像运行时的实体
3-docker pull:docker daemon接收到命令后向docker registry发送image下载请求。docker registry存放各种image,image的公共仓库docker Hub。
docker的底层实现
NameSpace:命名空间,容器隔离的基础。NameSpace机制是一种资源隔离方案,将机器全局资源[User,Mnt,Network,UTS,IPC,Pid等]划分至某个特定的NameSpace,各个NameSpace下的资源互不干扰,形成一个独立的文件操作系统。
Control groups:cgroup控制容器中进程对资源[CPU、内存、磁盘、网络]的访问,控制容器对系统资源的消耗。
unionfs 联合文件系统:典型如aufs/overlayfs,分层镜像实现的基础。
参考:https://blog.csdn.net/crazymakercircle/article/details/120747767
概念说明
Docker 镜像(Images)-用于创建Docker容器的模板,比如 Ubuntu 系统。
Docker 容器(Container)-容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client)- Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host)-一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry-Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
Docker Hub(https://hub.docker.com) -提供庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine-Docker Machine是一个简化Docker安装的命令行工具,通过简单的命令行可在相应的平台上安装Docker,如VirtualBox、 Digital Ocean、Microsoft Azure。
参考 niceyoo 博客:https://www.cnblogs.com/niceyoo/p/13058238.html
1)BusyBox是一个集成了一百多个最常用Linux命令(如cat、echo、grep、mount、telnet等)的精简工具箱,被誉为“Linux系统的瑞士军刀"。BusyBox可运行于多款POSIX环境的操作统中,如Linux(包括Android)、Hurd、FreeBSD等。
docker pull busybox:latest docker run -it busybox
2)Jenkins持续集成和交付工具:持续集成(Continuous Integration,CI)完成开发团队定期进行集成验证,集成通过自动化的构建来完成,包括自动编译、发布和测试,从而尽快地发现错误。特点:鼓励自动化的周期性的过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都由自动完成的,减少人工干预;需要有持续集成系统的支持,包括代码托管机制支持以及集成服务器等。持续交付(Continuous Delivery,CD)则强调产品在修改后到部署上线的流程要敏捷化、自动化。部署上线的简易性。
基本命令
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
开机启动:systemctl enable docker
当前系统docker信息:docker info
列举出所有的容器:docker ps -a
停止容器:docker start 容器ID或容器名
直接关闭容器:docker kill 容器ID或容器名
重启容器:docker restart 容器ID或者容器名
删除容器:docker rm 容器ID或者容器名
删除镜像:docker rmi -f 镜像名1:TAG (先删除容器,当镜像无容器时再删除镜像)
查看镜像:docker image 或 【docker images|grep redis|grep redis】
-a :列出本地所有的镜像(含历史映像层) -q :只显示镜像ID
查询仓库中镜像:docker search redis
拉取镜像:docker pull redis:latest
查看镜像/容器/数据卷所占的空间:docker system df
运行中命令:
1 启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
创建容器:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS:--name 容器新名字
-d 后台运行容器并返回容器ID,即启动守护式容器(后台服务)
-i以交互模式运行容器,通常与-t 同时使用;
-t为容器重新分配伪输入终端,即启动交互式容器(前台有伪终端,等待交互);
-p 指定端口映射 -P 随机端口映射
COMMAND:
例如运行redis容器:$docker run -itd --name redis-automation
-p 6379:6379 redis redis-server --appendonly yes
2 进入正在运行的容器:docker exec -it 容器ID /bin/bash
3 容器→主机文件拷贝:docker cp 容器ID:容器内目录 主机目录
4 导入和导出容器(快照):
[export导出容器的内容为tar归档文件;import 从tar归档文件创建新的文件系统再导入为镜像]。
案例: docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
5 存出和载入容器(备份):
案例: docker save -o 文件名.tar 镜像名:镜像版本号
docker load -i 文件名.tar 或 docker load < 文件名.tar
说明:save/load:保存、加载容器,保留所有的历史记录和元数据信息;docker import/export:导入、导出容器快照,可以重新指定标签等元数据信息,仅保存容器当时的快照状态。
日志相关:
$docker logs [OPTIONS] CONTAINER
Options:--details 显示更多的信息 -f, --follow跟踪实时日志
--since string 显示timestamp之后的日志或相对时间,如42m(即42分钟)
--tail string 日志末尾显示多少行日志,默认是all
-t, --timestamps显示时间戳
--until string 显示timestamp之前的日志或相对时间,如42m(即42分钟)
如:$docker logs -f -t --since="2020-02-08" --tail=50 CONTAINER_ID
$docker logs -t --since="2020-08-08T13:23:37" --until
"2020-08-09T12:23:37" CONTAINER_ID
$docker logs --since 30m CONTAINER_ID
英文官网 镜像查询 中文官网 docker-ce github
docker中的三剑客
machine、compose和swarm。
Machine是一个简化Docker安装的命令行工具,对docker运行环境进行安装与管理;
compose是用来定义和运行一个或多个容器运行和应用的工具,负责实现对基于docker容器的多
应用服务的快速编排,简化容器镜像的构建以及容器的运行,compose 使用 YAML 文件来定义多
容器之间的关系。应用案例:Web负载均衡、大数据Spark集群。
Swarm是社区提供的原生支持Docker集群的工具,本身不是很成熟,不建议用在生产环境。
Kubernetes:
开源容器集群管理系统,基于go语言,底层基于docker、rkt等容器技术,提供强大的应用管理和资源调度能力。可轻松搭建和管理一个可扩展的生产级别的容器云。