【Docker】基于实例项目的集群部署(四)Docker虚拟机 | Docker 指令 | Docker容器与镜像

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【Docker】基于实例项目的集群部署(四)Docker虚拟机 | Docker 指令 | Docker容器与镜像

为什么要使用Docker

按之前的想法,你可能会问:在Linux上就能安装程序、部署项目了,那为什么还要在Linux上安装Docker虚拟机呢?然后还要在Docker上安装程序、部署项目?

答案是:为了解决主要矛盾:隔离性问题。

有的程序在运行的时候会占用大量的硬件资源,如mongdb,其运行时会占用大量的内存,创建缓存,这会影响到其他程序的运行;另外,使用Docker虚拟机去部署程序非常方便,例如,需要部署程序时,开启一个虚拟的空间,而不需要部署程序时,就把这个虚拟空间删除。而这些虚拟空间之间是完全隔离的。

但是,如果你在Linux上安装程序,如果把A程序卸载掉,且A程序关联了相关的软件包,就有可能影响到B程序,B程序就有可能运行不起来了。这就体现不了隔离性。

而,在Docker虚拟机中,把A容器(Docker中的虚拟空间)删掉,不会影响到B容器。

这就是我们使用Docker虚拟机去部署项目的主要原因。

Docker虚拟机的使用

Docker虚拟机架构

一个问题:

为什么不在Linux上再次安装VMware虚拟机部署程序,而安装Docker虚拟机部署程序(前者也能体现隔离性)?

答:

Docker虚拟机是一个轻量级的虚拟机,VMware是一个重量级的虚拟机,在主机上开启上千个Docker虚拟机一点问题没有,不会造成机器的卡顿等问题。而VMware没法多开,开多了会造成主机卡顿。

再问:

其次,Docker虚拟机为什么是一个轻量级的虚拟机?

再答:

由其架构决定。如下图:Docker创建的所有虚拟实例能共用同一个Linux内核,对硬件占用较小,属于轻量级虚拟机。

所以,宿主机系统,首选Linux系统,然后在宿主机系统中安装Docker程序,Docker程序中的Docker引擎会去管理、创建、销毁、启动、停止这些虚拟空间。在这些虚拟空间(称作:容器)中,我们可以去安装程序,部署项目,容器与容器之间是完全隔离的。

轻量级的另一方面,这些容器中运行的Linux系统,并不是完整的Linux系统,它们其实是共享了一个Linux内核。而VMware中每一个虚拟的空间中运行的都是一个独立的操作系统,这就对主机的销毁是巨大的。所以,在Docker虚拟机中,只能使用Docker提供的操作系统,没法安装其他操作系统。

由此可见,在服务器主机上开启几千个Docker虚拟机压力很小,这就为大规模部署更多的应用提供条件。

Docker虚拟机在云计算中的应用

从前,我们想把自己的项目部署到服务器上,那么在本地搭建一个服务器的成本就会很高,比如要去买固定的IP、申宽带、购买硬件的服务器等等,所以,经常的做法是到云空间中申请一个虚拟的主机。这个就跟Docker虚拟机很相似。在Docker虚拟机中创建容器的时候,可以设置这个容器占用多大的内存、CPU的配置、网络配置等,这就相当于IaaS云的功能。接着,申请云主机之后,云主机里面除了操作系统之外,里面什么程序可能都没有给你安装,那就比较麻烦了。但是,目前云主机中有提供redis,mysql,等等服务,这就是PaaS云。它不仅给你提供虚拟的运行环境,还在其中安装了一些中间件,如redis等。如果用Docker就可以实现这一点。Docker的虚拟空间叫容器(Container),那么我们可以开启一个容器,在里面安装你想要的中间件。安装之后,可以把容器转换为镜像(镜像Image是用来创建容器的)。那么,以后再有用户来,他想要申请一个自带java环境等中间件的虚拟主机,那么我们就可以直接把这个镜像拿过来创建一个自带了中间件的容器。这就是Docker在PasS云上的使用。另外,有些用户可能不懂技术,不懂部署项目,那么这些用户要怎么把项目放上去呢?于是云计算又往前迈了一步。这种架构叫SaaS云。它为你提供了虚拟的硬件环境,你想要的中间件,以及你想要的项目。而这个工作就可以交给Docker来做。同样可以使用Docker去安装硬件环境、中间件、项目,做完之后,把容器转换为镜像。下次,用户需要的时候,就把这个镜像拿来生成一个容器,即可。

Docker容器与镜像

这里,给出容器与镜像的区别:

  • 镜像是用来创建容器的,容器是从镜像中创建出来的虚拟实例。
  • 容器可以用来运行程序,是读写层。可读可写;
  • 镜像用来安装程序,是只读层。

所以,部署项目是部署在容器中。镜像不是虚拟空间,容器才是虚拟的空间。镜像(Image)只是一个文件,其内部安装了相关的程序。那么如何向镜像中安装程序呢?

Docker有一个Dockerfile文件,它可以定义你想要安装的程序,在里面写好这些安装的程序后,运行dockerfile,就会把这些程序安装上,然后创建出镜像。

当然,我们还可以在运行的容器中安装这些程序,然后把容器转换为镜像。

安装与管理Docker虚拟机

执行yum命令 ,安装前需要先更新yum软件管理器

[root @ localhost / ] yum -y unpdate

[root @ localhost / ] yum install -y docker

注: -y代表选择程序安装中的yes选项

要使用Docker时,首先要启动Docker服务

启动:[root @ localhost / ] service docker start

关闭:[root @ localhost / ] service docker stop

重启:[root @ localhost / ] service docker restart

为了更系统的理清Docker虚拟机的管理命令,我们给出如下一张很重要的图:

解释:

  • DockerFile 文件: 定义了镜像要安装的程序和配置的环境;通过docker build dockerfile文件名 指令可以创建你想要的镜像(image)。

当然,一旦创建出镜像,如何把镜像分发给其他主机的虚拟机?

办法1:借助docker仓库。通过push指令把本地镜像上传到仓库,而其他主机可以通过search指令到仓库中查找上传的镜像,找到之后,可以通过pull 这个指令把镜像下载到本地。这样别的主机的Docker虚拟机中就可以有这个镜像了。

办法2:通过文件方式。把镜像导出为压缩文件backup.tar.gz,别的主机用这个压缩文件再导入为镜像。导出指令:save/export ;导入指令:load/import

  • rmi指令:删除镜像。
  • inspect:查看某一个镜像的详细信息;
  • images: 查看所有镜像的详细信息;
  • run: 使用镜像去创建容器。创建容器之后,这个容器就会直接运行了。
    怎么把这个运行的容器停下来,或者删除?
  • pause:暂停;
  • unpause:从暂停恢复到运行状态;
  • stop: 把运行的容器彻底的停止;
  • start : 把容器从停止状态恢复成运行状态;
  • inspect: 也可以查看某一个容器的详细信息
  • ps : 查看所有容器的信息
  • rm: 删除某个容器;
  • commit: 容器可以保存为镜像。

Docker虚拟机常用指令

Docker有一个非常庞大的镜像仓库,我们可以在里面查找到我们想要的仓库。

安装镜像

安装Java镜像

查找:[root @ localhost / ] docker search java

下载:[root @ localhost / ] docker pull java

但是,由于国外镜像仓库下载速度较慢,所以建议使用国内镜像仓库,如DaoCloud

配置加速器DaoCloud:先去DaoCloud官网www.daocloud.io,进行注册。然后进入这里:https://www.daocloud.io/mirror 进行Docker加速器的配置。

我们复制上面的命令,在CentOS上执行:

执行之后,还需要进行一些修改:因为在Docker配置文件里面添加了一个加速器的设置,其结尾多了一个逗号,我们要把这个逗号删除掉,否则加速器用不了。

接下来,我们就编辑下Docker的配置文件:

然后保存 退出 :wq

然后我们去搜索一个与java有关的镜像:

docker search java

然后把镜像名字复制下来。例如:我们选择 docker.io/java这个java环境的镜像。

然后我们把这个镜像下载下来: docker pull docker.io/java (粘贴:shift+insert)

下载完成之后,我们查看下镜像信息 docker images

导出导入镜像

[root @ localhost / ] docker save java > /home/java.tar.gz

[root @ localhost / ] docker load < /home/java.tar.gz

[root @ localhost / ] docker images

[root @ localhost /] docker rmi java

导出:docker save 镜像名 导出路径

可以看到在home目录下有一个镜像的压缩文件:

现在我们在试试用压缩文件的方式导入:

先把java这个镜像文件删除: docker rmi docker.io/java

删除成功后,在导入压缩文件: docker load < /home/java.tar.gz

导入成功后,再次执行: docker images

启动容器

启动镜像会创建出一个运行状态的容器

  • 启动一个名称为myjava的java容器,并使用bash命令行:
    [root @ localhost / ] docker run -it --name myjava java bash
  • 启动一个容器,开放端口 -p 9000:8080 //9000宿主机端口,8080容器端口,即把容器的8080端口映射到真实的宿主机端口上。另外,要映射多少个端口,就写多少个p参数。
    [root @ localhost / ] docker run -it --name myjava -p 9000:9090 -p 9001:8085 java bash
  • 把宿主机的文件或目录映射到容器中:例如跑数据库的时候,数据库中存储的数据一定是要保存在宿主机中,不应该存储在容器中,这方便我们将来备份和恢复。 多个 -v 可以映射多个;
    [root @ localhost /] docker run -it --name myjava -v /home/project:/soft --privileged java bash
    注释:
    /home/project 是宿主机目录; 与文件用冒号(:)隔开
    /home/project:/soft 把宿主机的目录映射到容器的soft目录中
    --privileged 读写执行 | 权限参数

上图红框中的这条信息,是容器的编号。

测试下java环境:

暂停和停止容器

[root @ localhost / ] docker pause myjava

[root @ localhost / ] docker unpause myjava

[root @ localhost / ] docker stop myjava

[root @ localhost/ ] docker start -i myjava

OK ,到这里我们就把Docker虚拟机的安装、Docker命令简要概述了下。

关于Docker命令更多的细节可以参考docker中文文档:

https://docs.docker-cn.com/

如果你是位前端开发者,学习到这里就够了。

下一节,我们将使用Docker搭建集群。

【Docker】基于实例项目的集群部署(五)Docker搭建MySQL集群 | PXC集群


相关文章
|
29天前
|
运维 Java 虚拟化
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
105 12
|
3月前
|
存储 数据安全/隐私保护 数据中心
Incus 6.4 容器和虚拟机管理器发布
【10月更文挑战第26天】
119 2
Incus 6.4 容器和虚拟机管理器发布
|
3月前
|
存储 持续交付 虚拟化
|
4月前
|
网络安全 虚拟化 Docker
SSH后判断当前服务器是云主机、物理机、虚拟机、docker环境
结合上述方法,您可以对当前环境进行较为准确的判断。重要的是理解每种环境的特征,并通过系统的响应进行综合分析。如果在Docker容器内,通常会有明显的环境标志和受限的资源视图;而在云主机或虚拟机上,虽然它们也可能是虚拟化的,但通常提供更接近物理机的体验,且可通过硬件标识来识别虚拟化平台。物理机则直接反映硬件真实信息,较少有虚拟化痕迹。通过这些线索,您应该能够定位到您所处的环境类型。
118 2
|
4月前
|
存储 Linux 开发者
虚拟机centos7.9一键部署docker
本文介绍了如何在 CentOS 7.9 虚拟机上安装 Docker 社区版 (Docker-ce-20.10.20)。通过使用阿里云镜像源,利用 `wget` 下载并配置 Docker-ce 的 YUM 仓库文件,然后通过 `yum` 命令完成安装。安装后,通过 `systemctl` 设置 Docker 开机自启并启动 Docker 服务。最后,使用 `docker version` 验证安装成功,并展示了客户端与服务器的版本信息。文中还提供了列出所有可用 Docker-ce 版本的命令。
328 0
虚拟机centos7.9一键部署docker
|
4月前
|
监控 应用服务中间件 nginx
详细解释容器以及虚拟机centos7.9容器化部署基础服务(容器化部署nginx)
容器是一种轻量级、可移植的软件打包和隔离技术,将应用程序及其依赖项打包,确保在任何环境中一致运行。容器共享主机操作系统内核,相比虚拟机更高效、轻量,具有快速启动和高资源利用率的特点。容器的关键技术包括命名空间(如 PID、NET 等)、控制组(cgroups)和联合文件系统(UnionFS)。使用容器可以提高开发和部署效率,简化管理,确保环境一致性。例如,在 CentOS 7.9 上部署 Nginx 时,可以通过 Docker 下载和运行 `nginx:1.20` 镜像,并通过端口映射使外部请求访问 Nginx 服务。此外,还可以将测试页面复制到容器中,进一步验证容器的功能。
|
4月前
|
SQL Shell 数据库
在TDengine容器中创建初始化数据库的Shell命令实例
以上就是在Docker容器环境中部署并初始化TDengine数据库的全过程,希望对你有所帮助。
131 0
|
6月前
|
测试技术 持续交付 云计算
Docker 相对于虚拟机的优势
【8月更文挑战第27天】
281 5
|
6月前
|
运维 Ubuntu Shell
掌握Docker容器的创建:从镜像到实例
【8月更文挑战第27天】
1072 4
|
6月前
|
安全 Windows
【Azure 环境】Azure 的PaaS服务如果涉及到安全漏洞问题后,我们如何确认所用服务的实例(VM:虚拟机)的操作系统已修复该补丁呢?
【Azure 环境】Azure 的PaaS服务如果涉及到安全漏洞问题后,我们如何确认所用服务的实例(VM:虚拟机)的操作系统已修复该补丁呢?