0x01 Docker是什么?
Dokcer是一种开源的容器化平台,旨在简化应用程序的开发、部署和运行。它可以帮助开发人员将应用程序及其依赖项打包成轻量级的,可移植的容器,这些容器可以在任何支持Docker的平台上运行,从而大大的简化了应用程序的部署和管理。
Docker利用操作系统级别的虚拟化技术来隔离应用程序及其依赖项,使得应用程序之间相互独立,避免了由于环境差异导致的兼容性问题。同时,Docker还提供了一套完整的工具链,包括镜像管理,容器编排,网络和存储管理等,使得开发人员可以轻松的管理和扩展容器化应用程序。
0x02 容器什么是?
在计算机科学中,容器指的是一种虚拟化技术,它可以将应用程序及所有的依赖打包在一起,形成一个独立的,轻量级,可移植的运行环境。容器将应用程序打包成一个或者多个镜像,镜像中包含了应用程序所需的全部依赖项和配置信息。这些镜像可以在不同的计算机和云环境中部署和运行,从而不会收到底层操作系统和硬件的影响。
而所谓的运行环境,可以理解为容器内部的操作系统和相关软件组件的集合,他们被一起打包到一个镜像中,这些软件组件可以是应用程序代码,库文件,配置文件,依赖项和运行时环境等,他们共同构成了容器应用程序的完成运行环境。
0x03 Docker的历史和发展
Docker最初由dotCloud公司的Solomon Hyker开发,并在2013年首次公开发布。Docker的出现革命性的改变了软件开发,测试和部署的方式,使得开发者可以更快速,更高效的构建,测试和部署应用程序。
在Docker出现以前,开发人员通常需要在本地机器上安装和配置多个软件和库来支持其应用程序的运行。这导致了很多的问题,例如不兼容性、运行时错误和部署问题。Docker的出现了解决了这些问题,使得任何应用程序能够在任何地方以相同的方式运行。
Docker最初是基于Linux容器技术开发的,这种技术允许开发人员在单个操作系统上运行多个隔离的应用程序。这种隔离性使得应用程序能够更安全的运行,并且不会相互干扰。
Docker的发展非常的迅速,越来越多的开发者使用它来构建和部署他们的应用程序。2013年,Docker公司成立并且获得了大量的投资,以加速其发展。2015年,Docker的公司发布了Docker v1.0版本,并且同年推出了Docker hub,这是一个集中式的Docker镜像仓库。
Docker的发展还推动了容器技术的普及,使得越来越多的公司和组织开始使用容器化平台来构建,测试和部署他们的应用程。Docker的成功也促使其他公司和组织开发类似的容器化平台,例如Kubernetes和Mesos等。
0x04 Docker Hello World
a.环境
这里使用的是centos的系统,推荐使用类Linux系统,使用Windows系统可能会存在各种各样的问题。
具体的系统版本和内核版本如下图:
b.安装Docker
在centos中,我们可以按照如下的方式来安装Docker:
- 安装
Docker所需要的依赖:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加
Docker的软件源:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装
Docker(如果没有使用上面提供的阿里源而是使用官方源下载的话时间会比较久,推荐🪜):
sudo yum install docker-ce docker-ce-cli containerd.io
- 启动
Docker服务:
sudo systemctl start docker
5.设置Docker开机启动
sudo systemctl enable docker
c.Docker hello world
当Docker安装完成之后,就可以使用Docker官方提供的Hello world镜像来运行了。
docker run hello-world
如果看到了上面图片中的内容,那么说明我们的
Hello world已经成功在我们的电脑上运行了。
0x05 Docker基本概念
通过上面的Hello word示例,我们已经成功在电脑上运行起了Docker,下面将会结合上面的示例更加系统的介绍Docker。一切的最开始,还是先了解一些基本的概念和名词:
镜像(Image)
Docker镜像是一个只读的模版,它包含了构建容器所需要的所有文件和配置。镜像可以从本地的Dockerfile构建,也可以从公共或者是有仓库中拉取。
容器(Container)
Docker容器是从镜像创建的课运行的实例。容器包含了一个独立运行的应用程序和该应用程序所需的所有依赖项。容器具有独立的文件系统,网络和进程空间,可以在任何环境中快速的搭建和运行。
仓库(Repository)
Docker仓库是一个用于存储和共享Docker镜像的中央位置。它可以是公共仓库(如docker hub),或者是有仓库。
Dockerfile
Dockerfile是一个包含了一组指令的文本文件,用于构建Docker镜像。Dockerfile中的每个指令都会在新的一层中创建一个镜像。
镜像ID
每个
Docker镜像都有一个唯一的标识符,称为镜像ID。他是一个短哈希值,可以用来应用镜像。
镜像仓库名
Docker镜像仓库名由仓库地址和镜像名称组成。例如,Docker hub中的官方Ubuntu镜像的仓库名为ubuntu。
容器ID
每个
Docker容器也有一个唯一的标识符,成为容器ID。他也是一个短哈希值,可以用来引用容器。
网络(Network)
Docker网络是用于容器之间通信的虚拟网络。Docker支持多种网络类型,如桥接网络,覆盖网络和主机网络。
卷(Volume)
Docker卷是用于持久化容器数据的一种方式。它可以将宿主机文件系统上的目录挂在到容器内部。
0x06 Docker的架构
Docker的架构是一个分布式的客户端/服务端的体系架构,主要有以下三个核心部分组成:
Docker守护线程(Docker daemon)
Docker的守护线程(Docker daemon)是Docker的核心组件之一,也是Docker应用的后台进程。守护线程运行在宿主机上,并负责管理Docker容器,镜像,网络等资源,以及接收来自Docker客户端的命令并执行。
Docker的守护线程通常在系统启动的时候启动,它监听一个Unix套接字(/var/run/docker.sock),可以通过该套接字和客户端进行通信。Docker守护线程还可以配置为监听网络端口,以便远程访问。
在Docker守护线程启动之后,首先读取配置文件(/etc/docker/deamon.json),并根据配置文件中的内容来加载插件,驱动和存储后端。Docker守护线程还会从Docker Hub或者其他的三方或者是有仓库下载镜像,并保存在本地。当Docker客户端请求创建一个新容器的时候,Docker守护线程就会使用存储在本地的镜像创建该容器。
Docker客户端(Docker client)
Docker客户端指的是通过命令行或者API与Docker进行通信的工具,也被成为Docker CLI(Docker Command Line Interface)。它可以向Docker守护线程发送指令,接受并处理结果。通过Docker客户端,可以轻松的操作Docker容器,还可以构建、管理、发布Docker镜像,并且Docker客户端可以运行在任何支持Docker API的机器上。
Docker镜像(Docker image)
Docker镜像是一个可执行的包,包含了运行应用程序所需要的一切组件,包括代码,运行时环境,系统工具,库等。他可以看作是一个容器的“快照”,包括了该容器的所有配置和数据,可以用来创建新的容器实例。
Docker镜像可以从镜像仓库中读取,也可以执行创建和修改。Docker镜像通过分成存储的机制实现高效的共享和复用,每个镜像包含多个只读层,每个层代表一个文件系统的快照。在创建新容器的时候,可以使用现有的镜像作为基础,然后在上面添加新的只读层,来构建新的镜像。
Docker镜像也可以通过导出为jar包的形式进行备份和迁移,也可以通过push和pull操作进行远程共享和管理。
0x07 Docker的组件
Docker是有多个组件组成的,包括以下的组件,这里只做简单的介绍,后面会单独出文章独一进行详细讲解
Docker Engine:Docker的核心组件,包括Docker守护进程和CLI客户端。Docker Registry:Docker镜像的存储和分发服务,用于存储和管理Docker镜像。Docker Compose:用于管理多个容器的组合和配置的工具,可以通过一个YMAL文件定义和启动多个容器。Docker Swarm:Docker官方提供的原生集群管理工具,用于管理多个Docker节点组成的集群,并且可以对集群中的容器进行部署,管理和扩展。Docker Machine:用于在不同的主机上安装和运行Docker Engine的命令行工具,可以在虚拟机,物理机或者云平台上创建Docker主机。Docker Hub:Docker官方提供的镜像仓库,包含了大量的公共Docker镜像供开发者使用。Docker CLI插件:Docker CLI的插件,可以扩展Docker CLI的功能,提供了一些额外的命令和功能,如Docker Machine插件和Docker compose插件等。