Docker
Docker 和 虚拟机 之间的区别
虚拟机
虚拟机是通过 虚拟化技术Hypervisor
在物理服务器上模拟多个独立的虚拟机,每个虚拟机都包含完整的操作系统、应用程序和所有必要的库。
每台虚拟机之间是完全隔离的,可以分别独立运行。虚拟机在一定程度上实现了资源的整合,将一台服务器的计算、存储、网络资源都分配给多个逻辑服务器。
但因为每个虚拟机都包含完整的操作系统、应用程序和所有必要的库,这样的虚拟机包括了操作系统的内核、各种系统服务、各种工具、图形界面等。但大部分情况下我们的服务器只需要运行对外提供的一个主要的应用程序即可,仅仅利用少量的资源就可以完成,所以像完整的操作系统这种资源占用量大但实际不怎么用到的软件,也就造成了大量资源不必要的浪费。(没说不需要操作系统,只是不需要 完整的 操作系统)
我们在各大平台买的云服务器,本质上我们这种个人买来搭建什么博客、论坛等网站,只需要资源小的服务器就行了。所以我们买的时候大部分装的也是 Linux 这种没有什么图形界面的低资源占用的操作系统,为的就是在低资源占用的情况下能快速启动、流畅以及稳定运行什么的。(如果把外部因素也考虑进来的话,你要是要完整的操作系统,那也就意味着你整体的配置要提高,那么费用每个月也就要多花挺多钱了)
Docker
通常我们会把Docker和容器一起讲,但实际上Docker并不是容器,Docker是容器的一种实现方式,是一个容器化的解决方案和平台。而容器是一种虚拟化技术,和虚拟机类似,也是一个独立的环境,可以在这个环境中运行应用程序。
所以我们将 Docker 和 虚拟机作对比,实际上就是容器 和 虚拟机的对比。容器与虚拟机的主要差别就在于 虚拟机 需要包含完整的操作系统、应用程序和所有必要的库。而容器不需要。容器通过使用宿主主机的操作系统,不需要而外装多个操作系统,所以比虚拟机要快很多。因为容器所需的资源更少,所以就能在一台服务器上运行更多个容器。(例如一台服务器可能只能运行十台虚拟机,但是能运行一百个容器)
GPT
对 Docker 的理解:Docker 是利用 Linux 内核的
cgroups
和namespaces
等特性,通过容器技术在宿主机上创建多个隔离的用户空间,每个容器共享主机的操作系统内核,但具有独立的文件系统、进程空间、网络空间等。
Docker 中有镜像、容器、仓库。
镜像是一个只读的模版,可以用来创建容器。
容器是一个 Docker 的运行实例,它提供了一个独立运行可移植的环境,可以在这个环境中运行应用程序。
也就是说,一个镜像可以有多个实例(容器),就像一个乐高组件套,一个组件套有很多组件,每个组件都有自己的使用方法,你可以根据这个组件套组将每个组件按它们自身的要求组装成多个不一样的模型,而且这个组件套可以拿去和你的小伙伴一起分享一起玩,他们也能根据这个组件套的组件要求组装出一个和你组装过的一模一样的模型出来。这就是镜像与容器之间的关系。
Docker仓库 可以用来存储 Docker镜像,最流行也最常用的仓库是 Dockerhub
,它是一个公共的 Docker仓库 ,我们可以在这里面下载和存储各种镜像,这样就可以实现镜像的共享与复用了。
容器化
容器化就是将应用程序打包成容器,然后再在容器中运行应用程序的过程。
我们要实现容器化,首先需要创建一个 Dockerfile
来告诉 Docker 该如何构建应用程序镜像所需要的步骤和配置。然后使用 Dockerfile
去构建这个镜像。之后我们便能通过使用这个镜像来创建和运行容器。
Dockerfile
中含有一条条指令来告诉 Docker 该如何创建应用程序的镜像,这个镜像包括了我们应用程序中执行的所有命令,也就是各种依赖、配置环境和运行应用程序所需要的所有内容。
一般来说包括了精简版的操作系统、运行应用程序所需要的环境(Go、Java、Node.js等)、应用程序 (jar包等)、应用程序需要使用的第三方依赖库或者包、应用程序的配置文件、环境变量等。
一般来说我们会在项目的根目录下创建
Dockerfile
文件,创建之后Docker
便会根据Dockerfile
中所写的指令去构建镜像。拥有镜像之后我们就能去构建容器了。
镜像是按层次结构来进行构建的,每一层都是基于上一层。所以我们一般构建一个基础镜像的基础上,添加我们的应用程序。我们可以基于基础的 Linux 操作系统开始,安装我们所需要的应用程序环境和应用程序。不过我们也可以使用已经构建好的镜像开始,例如我们要构建一个 node.js
的镜像,我们可以直接用已经构建好的 node 镜像去构建,因为这个镜像本身就是基于 Linux 构建的,也就不需要我们再一次手动去进行操作系统的构建。
其他:
一般我们构建镜像的 Linux 镜像用的是
alpine
版,它是一个轻量级的 Linux 发行版,根据 Docker 镜像的构建来说很合适,下载和部署都很快。
Dockerfile
文件指令一般如下:
From ... (镜像)
Copy 源路径 目标路径
(源路径是相对于Dockerfile
的路径,目标路径是相对于镜像的路径)例如我们要把某个
xxx.js
的文件 Copy 到根目录下,那么就用Copy xxx.js /xxx.js
。
CMD ["可执行程序的名字", "可执行程序收到的参数"]
或者CMD 可执行程序的名字 可执行程序收到的参数
之后我们可以在终端使用
docker build -t 镜像名 .
进行创建镜像。.表示当前Dockerfile
所在的目录。接着我们可以使用
docker images
或者docker images ls
去查看我们所有的镜像。我们运行镜像直接使用
docker run 镜像名
即可。我们如果把创建好的镜像上传到
Dockerhub
上,那就可以使用docker pull 用户名/镜像名
去获取对应的镜像。
Docker Compose
Docker Compose 是一个用于定义和运行多个容器 Docker 应用程序的工具,可以使用 yaml
进行应用程序服务的配置,且可以使用一条命令开启所有服务。
例如:
我们要启动一个网站,前端要和后端相连,后端要和数据库相连,这三者之间有链接关系,那么我们就可以使用 Docker Compose 去解决这个问题,通过一个
docker-compose.yaml
配置文件来将三者进行组合在一起,并且能通过用一条命令将三者的容器一起启动(docker compose up
,如果加上-d
就是在后台启动 )。这样做可以大大增加一个项目新成员的效率,能够立刻将其所要使用的环境立刻配置好。
评论(0)