什么是docker

在讲什么是docker前,咱们先回忆一下咱们过去在Linux上是如何安装软件的,通常来说就是如下几步:

  1. 跑到官网下载压缩包
  2. 解压
  3. 修改配置文件
  4. 启动应用

比如,过去咱们希望将自己的应用部署到Linux服务器上,我们需要做这些事情:

  1. 在Linux服务器上安装JDK,MySQL数据库,Maven,Tomcat,nginx
  2. 配置JDK,Maven,MySQL等软件的环境变量
  3. 将打包的war包放到Tomcat的webapp目录中
  4. 执行Tomcat的shell脚本启动项目
  5. 如果咱们需要采用集群部署实现高可用,就需要将同一个应用部署到多台服务器上,那么我们就需要在每一台服务器上将前面的所有操作重做一遍。

实际上docker做的事情和上面是一样的,也是用来安装软件和部署应用,既然都是安装软件和部署应用,那么docker有什么特别之处呢?

使用docker的好处

如果我们不使用docker,假设我们需要将windows上的应用迁移到Linux上,那么我们的应用很可能因为环境不一致而跑不起来。

还有就是,我们做应用迁移需要重新搭建一遍环境,比如过去安装的Windows版本的MySQL,现在要安装Linux版本的MySQL,以前对软件的配置都要重新再来一遍。整个过程就好像我们换了一台新电脑,需要将旧电脑中的重要文件迁移到新电脑,同时在新电脑上重新安装我们常用的软件一样,想想都是一件让人头疼的事情,不想去做但又不得不做。

docker就是为了解决这个问题的,有了docker后,我们可以快速将应用应用迁移到任何环境中而不用重新安装和配置软件。就好像我们可以将旧电脑中的所有数据一键迁移到新电脑上,省去了自己重新下载安装常用软件的烦恼。

而且使用docker部署后,我们将应用迁移到任何环境中都可以正常启动而不用担心环境差异导致项目启动失败的问题。就好像JDK屏蔽了操作系统的差异一样,docker屏蔽了环境差异,我们写的程序可以通过docker在任何环境中运行,而不用担心操作系统或者其他什么环境差异导致项目启动失败。

正是因为docker部署有上面这些优点,所以越来越多的公司都开始使用docker部署应用,我目前所在的公司就是采用的docker部署,而不是传统的应用部署方式。

使用docker

docker的安装我就不介绍了,因为比较简单,大家可以去docker的官方文档上查看安装手册

docker几个关键概念

  1. 镜像:镜像类似于软件的源码
  2. 容器:容器是基于镜像打包后的产物,如果镜像是源码,那么容器就相当于是我们打好的jar包,后面我们可以通过这个jar包启动应用。简单来说,容器就是应用。
  3. 镜像仓库:也就是存放所有镜像的云端仓库,比如dockerHub就是一个镜像仓库。Maven有中央仓库,我们可以将dockerHub当做是docker的中央仓库,或者将其看做是github那样的源代码仓库也行。

这三者之间的关系是:
在这里插入图片描述

  1. 我们先将自己需要的软件镜像从镜像仓库中下载到本地
  2. 使用下载到本地的镜像构建容器应用

上面两个过程是不是和从Maven的中央仓库下载jar包很类似?

docker实战案例

现在咱们先来一个案例热下身,比如我希望通过docker启动一个nginx应用。

首先咱们先去dockerHub(docker的远程镜像仓库),找到nginx的镜像:
在这里插入图片描述
接下来我通过如下指令创建一个nginx应用:

docker run --name nginx -p 8080:80 nginx:latest

简单解释一下上面的指令:

  1. docker run表示启动某个容器应用,如果本地没有需要的nginx:latest镜像,就会去远程的镜像仓库将需要nginx镜像下载到本地,如果本地已经有nginx:latest的镜像,则直接使用本地的镜像构建,而无需去远程镜像仓库下载,这里就类似于Maven的远程仓库和本地仓库
  2. –name nginx表示应用的名称为nginx
  3. -p 8080:80表示宿主机的端口和容器应用端口的映射关系,比如nginx默认的端口号是80,这里就表示我们希望访问宿主机的哪个端口可以正常访问容器内的80端口,也就是说当我们访问宿主机的8080端口时,我们实际上是在访问容器应用的80端口。
  4. nginx:latest表示我们使用最新版的nginx镜像来构建容器应用 ,其中latest是nginx的版本号,我们可以将其换成自己需要的nginx版本,比如nginx:1.20.2

下面我们就来通过浏览器访问宿主机的8080端口,看下是否可以访问nginx,答案是可以的,如下图所示:
在这里插入图片描述
怎么样,使用docker安装和启动nginx是不是简单多了,我们再也不需要去记忆什么nginx的启动命令啥的,也不需要去nginx官网下载nginx的安装包了,这里咱们一行命令就搞定了所有工作!

但是上面的启动方式有个小问题,比如咱们需要修改nginx的首页内容,该如何实现呢?有如下方法:

  1. 直接进入到容器,修改里面的nginx中的index.html
  2. 通过数据卷建立容器文件和宿主机文件的映射关系,这样修改宿主机的某个文件就相当于是在修改容器内的文件了,这里和前面的端口映射关系很类似,我们将这样的映射关系称之为数据卷。这样做的好处是:不用进到容器里面,操作更加方便,而且即便删除容器,也不会丢失容器中的数据,这个是非常关键的,一般在实际开发中,我们会为每个容器应用创建数据卷,也就是容器目录和宿主机目录的映射关系,确保数据不会因为容器的删除而丢失!

我们先看下第一种方式:首先我们通过docker ps指令查看当前正在运行的容器应用,我们可以看到容器的id,名字,以及使用的镜像,还有宿主机和容器端口的映射关系等等
在这里插入图片描述
这里我们通过容器id进入到容器中, docker exec -it e2747dc31d24 bash 就是进入到id为e2747dc31d24的容器中的意思,然后我们进入到nginx的/usr/share/nginx/html目录,修改index.html文件
在这里插入图片描述
然后我们通过下面的指令修改index.html文件的内容
在这里插入图片描述
然后再次访问nginx,可以看到nginx的内容已经发生了变化。
在这里插入图片描述
接下来我们看下第二种方式,也就是通过建立宿主机文件和容器文件的映射关系来操作容器内的文件。

首先我们先随便创建一个nginx容器,将容器中的重要文件或目录给复制到宿主机中,之所以要这样做,是因为容器中的文件会和映射的宿主机文件或目录的内容保持一致,如果我们建立宿主机和容器的文件映射关系时,宿主机中没有文件,那么与之映射的容器目录也会没有文件,即便容器中原本是有文件的,也会自动删掉。

具体复制过程如下:

  1. 执行docker run -p 8081:80 nginx -d 随便创建一个nginx容器,-d表示后台启动nginx,如果不加-d则默认是控制台启动nginx,然后通过docker ps指令拿到这个容器的id
  2. 执行docker cp 0bdd0a4c64be:/usr/share/nginx/html /root/nginx指令即可将容器中/usr/share/nginx/html目录中的内容复制到宿主机的/root/nginx目录中。具体的复制语法是:docker cp 原始路径 目标路径,如果原始路径或者目标路径是容器中的某个目录,则需要在这个路径前添加容器的id,比如前面指令中的0bdd0a4c64be就是一个容器id

首先我们通过docker stop nginx来停止前面的nginx容器,然后通过docker rm nginx删除这个容器,下面我们就来重新创建一个带有文件映射关系的nginx容器应用。

docker run --name nginx -p 8080:80 -v /root/nginx:/usr/share/nginx/html nginx:latest

这个指令其实就是在之前的指令的基础上添加了-v /root/nginx:/usr/share/nginx/html, 其中-v就是建立文件映射关系的参数,这里表示将宿主机的/root/nginx目录映射为容器内的/usr/share/nginx/html目录,这样当容器内产生的新文件,宿主机中会同步看到新产生的文件。

同样的,当宿主机的目录中文件内容发生了变化,容器中的文件内容也会发生同样的变化。比如我修改了宿主机中的index.html,
在这里插入图片描述
然后再访问浏览器,可以看到页面上确实同步发生了变化,说明容器的文件也同步发生了同样的变化
在这里插入图片描述
最后,我们对前面案例中使用的docker命令做个小总结:

  1. docker run: 创建并且启动一个容器应用
  2. docker start 容器id或容器名称:启动容器应用
  3. docker stop 容器id或容器名称:停止容器应用
  4. docker rm 容器id或容器名称:删除容器应用
  5. docker cp:将容器中的文件复制到宿主机中,或者将宿主机中的文件复制到容器中
  6. docker ps:查看正在运行的容器应用
  7. docker exec: 在一个运行的容器中执行指令,通常用于进入容器内部或者查看容器的一些信息

常用的docker参数:

  1. -p: 实现宿主机和容器的端口映射
  2. -v: 实现宿主机和容器的文件映射,用行话说就是挂载数据卷
  3. –name: 给容器起名字

最后的总结

这篇文章中我们讲了使用docker部署应用有什么好处,以及docker的3个核心概念,它们分别是镜像、容器、镜像仓库,以及它们之间的关系。

然后我们通过一个案例实战带大家学习了如何创建容器应用,停止容器,删除容器,以及查看正在运行的容器,并且还带大家分别通过数据卷和进入容器的方式来修改容器中的文件内容。

这些都是docker的基础知识,后面我将带大家学习docker更高阶的内容,敬请期待!

觉得有收获的朋友可以点个赞,您的鼓励就是我最大的动力!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐