Docker初学者必读:为何要使用Docker

57 阅读6分钟

什么是Docker?

先来看下官网的介绍

Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.

让我们翻译成大白话:

Docker是一个用于开发、打包和运行应用程序的开放平台。 使用Docker,

你可以将应用程序与基础设施分开,从而快速交付软件。

你可以像管理应用程序一样管理基础设施。

你可以更快地将代码从开发环境部署到实际运行的生产环境中。

"Docker"这个词的英文意思是"码头工人",这与Docker的特点有着相似之处。就像码头工人负责搬运货物一样,Docker提供了一种将我们的软件和程序进行容器化搬运的过程。可以说官方给Docker取这个名字非常贴切。

为什么使用Docker?

我们先来看个简单的例子,了解一下Docker的使用场景。

假设我们有一个简单的Node.js应用程序,它包含一个名为app.js的文件和一个package.json文件。我们可以使用Docker来容器化这个应用程序。

  1. 创建一个Dockerfile: 在应用程序的根目录中创建一个名为Dockerfile的文件,并添加以下内容

    # 使用Node.js官方的基础镜像
    FROM node:14
    
    # 设置工作目录
    WORKDIR /app
    
    # 复制应用程序文件
    COPY app.js package.json /app/
    
    # 安装依赖
    RUN npm install
    
    # 暴露端口
    EXPOSE 3000
    
    # 启动应用程序
    CMD ["node", "app.js"]
    
  2. 构建Docker镜像: 打开终端,在Dockerfile所在目录运行以下命令构建Docker镜像

    docker build -t mynodeapp .
    
  3. 运行Docker容器:

    docker run -d -p 3000:3000 mynodeapp
    

使用以上命令在Docker容器中运行应用程序,现在我们的Node.js应用程序已经被打包为一个Docker容器,并在本地的3000端口上运行。可以通过访问 http://localhost:3000 来访问应用程序。

至此,我们了解了如何使用Docker将应用程序容器化,当我们需要其他同事快速接手代码时,只需要以下几个步骤。

  1. 导出容器镜像:

    docker save -o mynodeapp.tar mynodeapp
    

    在命令行中运行以上命令,将容器镜像导出为一个文件。这将在当前目录下创建一个名为mynodeapp.tar的文件,其中包含了你的容器镜像。

  2. 共享容器镜像文件:

    将mynodeapp.tar文件分享给同事,可以使用文件共享工具、云存储服务或其他适合的方式发送给他们。

  3. 导入容器镜像:

    docker load -i mynodeapp.tar
    

    此时同事可以使用以上命令在他们的机器上导入容器镜像。

  4. 运行容器:

    docker run -d -p 3000:3000 mynodeapp
    

    同事可以使用以上命令在他们的机器上启动容器,并将应用程序运行在本地的3000端口上。

只要确保他们已安装Docker并具备执行Docker命令的环境,就能轻松地使用你的容器了。

看到这里,相信大家已经可以理解为什么使用docker了。

使用docker,开发人员可以使用镜像快速构建一套标准的开发环境;
开发完成后,测试和运维人员可以使用完全相同的环境部署代码,只要是开发测试过的代码就可以确保在生产环境无缝运行。

Docker核心概念

上面的例子中,我们提到了Dockerfile、镜像、容器这些名词。学习Docker时,有一些核心概念是必须了解的。以下是一些重要的概念:

镜像(Image):镜像是一个只读模板,包含了运行容器所需的文件系统和软件配置。它是构建容器的基础,可以通过Dockerfile定义和定制。通常情况下,一个镜像是基于另一个镜像进行构建的,并进行一些额外的定制。

我们上面的例子就是基于Node.js官方基础镜像构建了自己的mynodeapp镜像。FROM node:14这一行指定了使用的基础镜像为Node.js版本14。从这个基础镜像开始构建,根据需要进一步的定制和配置。

容器(Container):容器是镜像的可运行实例。可以使用Docker API或CLI创建、启动、停止、移动或删除容器。还可以基于容器的当前状态创建一个新的镜像。容器是轻量级、隔离的且可移植。

总结起来,镜像是容器的基础模板,通过Docker API或CLI创建和启动容器,镜像就变成了实际运行的容器实例。容器继承镜像的定义和配置,具有自己的运行环境和资源,可以独立运行和管理应用程序。

Dockerfile:Dockerfile是用于定义和构建Docker镜像的文本文件,它包含了一系列指令和配置,用于规范化和自动化镜像的构建过程。通过编写Dockerfile,你可以定制化镜像的内容和构建流程,以满足应用程序的需求。

在Dockerfile中,你可以使用各种指令来定义镜像的构建过程,例如:

  • FROM:指定基础镜像,作为构建的起点。
  • RUN:在镜像中执行命令,用于安装软件包、运行脚本等操作。
  • COPY:复制文件或目录到镜像中。
  • ENV:设置环境变量。
  • WORKDIR:设置工作目录。
  • EXPOSE:声明容器运行时需要监听的端口。
  • CMD:指定容器启动时要执行的命令或程序。

Dockerfile中的指令按顺序执行,每个指令都会创建一个新的镜像层。每一层都是基于前一层构建的,当修改Dockerfile时,只有发生变化的层会重新构建,这让镜像的构建过程更加高效。这种分层的方式也使得镜像变得轻量、可缓存和易于传输。

仓库(Repository):仓库是用于存储和管理镜像的地方,每个镜像有不同的标签(tag)。公共仓库如Docker Hub提供了大量的镜像供用户使用,同时也可以创建私有仓库来管理自己的镜像。

这个类比于Github就很好理解了。

数据卷(Volume):数据卷是一种持久化存储的解决方案,允许容器与宿主机或其他容器之间共享数据。它可以独立于容器的生命周期存在,确保数据的持久性和可靠性。通过挂载数据卷到容器的特定路径,容器可以读取和写入数据,而这些数据将保留在数据卷中,即使容器被删除或重新创建。

这些概念是学习和理解Docker的基础,我们先有一个直观的认识,在以后的使用过程中再逐渐加深理解。


如果您已经看到这里了,不妨给我一个赞来鼓励一下吧!真心希望这篇文章给您带来了一些启发,感谢您的耐心阅读!