【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集群


相关文章
|
19天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
706 29
|
24天前
|
存储 数据安全/隐私保护 数据中心
Incus 6.4 容器和虚拟机管理器发布
【10月更文挑战第26天】
30 2
Incus 6.4 容器和虚拟机管理器发布
|
15天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
21天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
100 2
|
22天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
48 1
|
24天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
15天前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
51 0
|
13天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
55 2
|
3天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
25 5
|
7天前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
下一篇
无影云桌面