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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 【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集群


相关文章
|
5天前
|
Web App开发 iOS开发 Docker
Docker 容器的日志
【10月更文挑战第31天】
16 5
|
4天前
|
存储 Kubernetes C++
Kubernetes VS Docker Swarm:哪个容器编排工具更适合你?
随着容器技术的快速发展,容器编排工具成为了现代软件开发和运维的重要环节。在众多容器编排工具中,Kubernetes和Docker Swarm无疑是最受欢迎的两个。本文将从技术特性、易用性和社区支持三个方面,对Kubernetes和Docker Swarm进行比较,以帮助您选择更适合您需求的容器编排工具。
19 3
|
5天前
|
存储 缓存 Docker
docker中挂载数据卷到容器
【10月更文挑战第16天】
15 2
|
7天前
|
存储 关系型数据库 MySQL
|
8天前
|
存储 Docker 容器
docker中挂载数据卷到容器
【10月更文挑战第13天】
14 2
|
8天前
|
运维 监控 数据可视化
Docker容器可视化管理工具 - WGCLOUD基础介绍
WGCLOUD是新一代运维监测平台,它可以监控Docker容器的各种性能数据,比如内存,cpu,Image,运行时间,运行状态,端口映射等信息
|
11天前
|
存储 Docker 容器
docker中挂载数据卷到容器
【10月更文挑战第12天】
32 5
|
15天前
|
存储 运维 云计算
探索Docker容器化:从入门到实践
在这个快速发展的云计算时代,Docker容器化技术正在改变应用的开发、部署和管理方式。本文旨在为初学者提供一个关于Docker的全面入门指南,并通过实践案例展示Docker在实际开发中的应用。我们将一起了解Docker的核心概念、基本操作、网络和存储,以及如何构建和部署一个简单的Web应用。无论你是开发者还是运维人员,本文都会帮助你快速掌握Docker的核心技能。
|
12天前
|
存储 测试技术 开发者
docker中将数据卷挂载到容器
【10月更文挑战第11天】
23 3
|
13天前
|
缓存 运维 Docker
容器化运维:Docker Desktop 占用磁盘空间过大?教你轻松解决!
Windows Docker Desktop 使用过程中,因镜像、容器数据及构建缓存的累积,可能导致磁盘空间占用过高。通过删除无用镜像与容器、压缩磁盘以及清理构建缓存等方法,可有效释放空间。具体步骤包括关闭WSL、使用`diskpart`工具压缩虚拟磁盘、执行`docker buildx prune -f`清理缓存等。这些操作能显著减少磁盘占用,提升系统性能。
119 4

热门文章

最新文章