当前位置:   article > 正文

杀手级应用Docker 五分钟入门_docker 5分钟

docker 5分钟

杀手级应用Docker 五分钟入门

前言

最近在学习联盟链框架fabric还有go语言的时候,不可避免的接触到了docker这一应用。其实在之前多有耳闻,但一直没有理由和时间去学习。

我在前几天学习docker的技术的时候,不知发出了多少“这真是“近五年来最牛的应用之一”的感触

虚拟机、容器、镜像

场景演示

有一场厨师比赛,邀请到了不同流派的大厨来进行美食的创新,而且他们有不同的工位。但是,他们是不同流派的,所以用到的工具也不一样,需要独立的厨房和厨具、材料。等厨师们做完菜后根据自己做的菜写一份做菜的流程,然后主办方去让自己的厨师根据流程所需的环境材料进行创作。最后得出不同厨师做的菜品。

场景提炼

是不是有点感觉了,如果不懂也没关系,让我们来根据上述内容一一对应一下计算机的处理逻辑。

  • 独立的厨房和厨具、材料:计算机不同的操作系统、环境配置
  • 做菜的流程:每个人根据本机的工程项目形成的镜像
  • 主办方的厨师根据流程做菜:docker根据镜像运行容器

现在,你对docker各个虚拟机、容器、镜像已经有一点点的理解了,我们再来抽象一下。

  • 虚拟机(Virtual Machine):指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。
  • 镜像:Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
  • 容器:Docker 容器是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何安装了docker引擎的服务器上(包括流行的Linux机器、windows机器),也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。

如果你还是不懂,那也没关系,我们看一看他具体的实现步骤。

Docker工作流

  1. 我在本机写了一个test的项目
  2. 然后要根据这个项目定制镜像文件(Dockerfile)
  3. 使用命令docker build对定制镜像文件进行编译构件,生成镜像(Image)
  4. 使用命令docker run将镜像运行在docker提供的容器中(Container)
  5. 我想运行别人的或者让别人运行我的镜像,那么我用docker pull或者docker push来对docker hub中的镜像进行拉取或推送。

docker是一个工作工具

仔细想一想,是不是上面的步骤和git的操作差不多,尤其是pull和push的操作,差距可能只在于对docker hub操作还是git hub操作而已。

其实,docker就是一个工具,方便我们敏捷的创建一个不依赖于任何事物的项目!

接下来让我们来试试如何操作docker吧

实际操作

首先我已经认为你下载了docker了,你可以直接用命令行运行docker查看是否在你本机上可用。

编写项目

我用node.js中的express框架举例,简单写一个web服务器。

我的项目文件

const express=require('express')

const app=express();
const PORT=3000
app.get('/',(req, res)=>{
    res.send('<h1>你好</h1>')
})
app.listen(3000,()=>{
    console.log('3000端口开启啦')
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

我的项目目录结构

test
├── Dockerfile
├── index.js
├── node_modules
├── package-lock.json
└── package.json
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

之后在终端执行 node index 即可运行这个文件并打开本机的3000端口

此刻,项目已经运行成功。

定制镜像文件

docker镜像的编写是在项目根目录下通过创建定制镜像文件(Dockerfile)进行的。

由于我的项目用的是node环境,即可直接在docker hub中寻找node的版本即可。

最后我的Dockerfile文件如下

FROM node:18-alpine3.15

WORKDIR /test
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node","index.js"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

简单解释一下

  • FROM node:18-alpine3.15:构建基础镜像,意思使用18版本的node,操作系统的alpine3.15(linux的轻量发行版)
  • WORKDIR /test 指定容器的工作目录
  • COPY package.json . 将本机当前文件夹复制到容器的test文件夹
  • RUN npm install 执行npm根据package.json进行项目的安装(nodejs的知识)
  • COPY . . 将本机当前目录的文件复制到工作目录
  • EXPOSE 3000 并没有实际作用,知识说明一下我打开的3000端口
  • CMD [“node”,“index.js”] cmd运行命令

同时,我们不可能将本机的所有目录和文件都复制过去,就像python的虚拟机,nodejs的nodemodules都是不用的。

这时候就需要像gitignore一样创建一个dockerignore来忽略这些文件。

node_modules
Dockerfile
.dockerignore
  • 1
  • 2
  • 3

到此,你的定制镜像文件(Dockerfile)已经写完成了!接下来就是生成了!

生成镜像

终端中输入 docker build ,即可根据你的Dockerfile进行镜像的构建。

构建完成后可输入docker images来查看文件。

同时可以用 docker tag 8b3(id的前三位) [你喜欢的名字] 进行打标签

比如说我就把他改成了test。

用容器运行镜像

用docker run test来运行,但是可以加上修饰符 -d,表示在后台运行,不占用终端。

同时可以用 docker ps来看运行中的容器。

但是我们现在还是不能打开本地3000端口来访问的。因为本地端口和容器端口是不一样的

容器和本地端口连接

使用 docker run -d -p 3000:3000 test 来进行端口的通信

值得注意的是:3000:3000代表的是 主机端口:容器端口

这时候我们进行访问。即可访问成功!

其他命令

docker stop 关闭容器

docker rmi 删除镜像

docker rm 删除容器

结语

docker的操作就是这么一个流程,但是本人知识尚浅,不可能将所有的功能说全,大家可以根据docker的官方文档进行学习。

另外,令我感触的是,永远不要失去学习新东西的热情和动力,不然你不会知道这个东西有多有趣。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/635950
推荐阅读
相关标签
  

闽ICP备14008679号