[docker] 核心知识 - 概念和运行

[docker] 核心知识 - 概念和运行

之前 docker 学了个开头就去搞项目去了,不过项目也开展了好久了,前端差不多吃透了,有些新功能需要用 docker 和 k8s……是时候重新学习一下了。

这一部分简单的过一下概念和讲一下怎么运行 docker 镜像和启动 docker 容器

定义

images/镜像:template(模板)/blueprints(蓝图),包含所需工具、代码和源码的运行时

containers/容器:软件的运行单元

使用和运行镜像

这里主要有两个方式,第一个是运行已经打包且上传的镜像,另一个是自己写一个指令,生成一个镜像

使用打包好的镜像

这里依旧用 node 做案例,这是 docker hub 官方 host 的镜像:

在这里插入图片描述

接下来就运行 node 镜像即可:

docker run node
Unable to find image 'node:latest' locally
# automically pull the latest version from docker hub
latest: Pulling from library/node
609c73876867: Downloading [========================>                          ]  24.25MB/49.56MB
7247ea8d81e6: Download complete
be374d06f382: Download complete
b4580645a8e5: Downloading [==>                                                ]  10.19MB/211.1MB
dfc93b8f025c: Waiting
a67998ba05d7: Waiting
9513f49617f6: Waiting
e2a102227dc6: Waiting

等所有指令完成后,一个新的容器就会创建完毕,不过因为没有任何其他的指令,该容器在创建完毕后就会自动关闭:

docker ps -aCONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS                          PORTS                                         NAMES4e40d20e25c9   node      "docker-entrypoint.s…"   About a minute ago   Exited (0) About a minute ago                                                 quizzical_hamilton

docker 的一个特性就是它是在隔离模式下运行的,如使用 docker run -it node 会在互动模式下运行已经下载好的 node 镜像,这个时候 node 是从 docker hub 上下载下来的最新版本,与我本地的 node 并没有关联:

在这里插入图片描述

👀:这里运行的 node 版本为 v21

在这里插入图片描述

💡:本地运行的 node 版本为 v20

在这里插入图片描述

另一个例子是,我前几天在本机上安装了 mysql 的 docker 镜像,并且项目可以正常启动,这部分可以参考 [spring] Spring Boot REST API - 项目实现,但是我本机是没有安装 mysql 的,所以运行 mysql 指令就会报错

⚠️:docker hub 上有个指令是 docker pull node,这个指令并不是必须的,在运行 docker run node 时,如果 docker 在当前环境下没有查到该镜像,那么就会自动 pull 对应的镜像

创建一个自定义镜像

本质上来说,这个方法就是提供一系列指令让 docker 去运行去创建一个新的镜像,随后运行该镜像

最简单的方式是创建一个 Dockerfile,将对应的指令写入到 Dockerfile 中,随后运行该 Dockerfile 去创建新的镜像。

举例说明,这是一个 node 服务器以及它所需要的依赖:

在这里插入图片描述

在这里插入图片描述

不使用 docker 去运行这个服务器的步骤为:

  1. 下载并安装 node

  2. 安装当前项目所需要的依赖包

  3. 运行当前项目

    本项目的运行指令为 node server.js

使用 docker 的方式也比较类似,不过需要提供一系列的指令去完成上面的步骤。下面则是使用 Dockerfile 去创建一个自定义镜像

如果使用 vscode 建议安装一下 docker 这个 extension,可以提供更好的提示和 linting:

在这里插入图片描述

在这里插入图片描述

下面是写好的 Dockerfile:

# current node is cached locally
FROM nodeWORKDIR /app# copy everthing excluding dockerfile to app directory under root directory
# if app does not exist, it'll be create
COPY . /app
# as the current working directory is /app already
# we can use relative directory instead of absolution directory
# COPY . ./# need to run `npm install` under app directory, which is pointed by WORKDIR
RUN npm install# optional
EXPOSE 80# above are the command ran during building process
# we need to start the server after image is built
CMD [ "node",  "server.js"]

这里简单的分析一下:

  • FROM node

    这一步指定 node 的基础镜像,具体支持的版本可以查看 docker hub 上有的版本:

    在这里插入图片描述

    这里没有指定任何的版本,所以会从 docker hub 上拉 node:latest

    但是本地如果已经有 node:latest 的缓存镜像,那么 docker 就会优先使用本地的缓存镜像。

    另一个情况是,本地的 node:latest 可能指向的是 v14,但是 docker hub 伤的 latest 是 v21.这种情况下,除非在 build 的时候特意指定更新,否则默认使用本地已经 cache 的版本

  • WORKDIR /app

    这里新建一个 working directory,如果当前 working directory 不存在的话,那么就会创建这个 directory

    指定 working directory 之后,Dockerfile 中的相对路径指向的就是当前的路径

  • COPY . /app

    这里的语法是将当前文件夹(系统文件夹)下的所有内容复制到 /app

    同样的语法也可以使用 COPY . ./——这里用的是相对路径,而上面用的是绝对路径

  • RUN npm install

    这一步镜像会执行安装所有 node 依赖包的操作

  • EXPOSE 80

    这是个可选项,不过会将当前镜像的 80 端口暴露

  • CMD [ "node", "server.js"]

    这是最终的操作,执行运行服务器的过程

    所有在 CMD 之前运行的步骤都是在构建镜像时的操作,但是运行服务器是要在镜像构建完后执行,因此需要在这里操作

这时候镜像构建的指令就写完了,可以运行docker build . 去构建镜像:

docker build .
[+] Building 3.9s (4/8)                                                                                                                                                  docker:desktop-linux=> [1/4] FROM docker.io/library/node@sha256:162d92c5f1467ad877bf6d8a098d9b04d7303879017a2f3644bfb1de1fc88ff0                                                                            3.1s=> => sha256:be374d06f38273b62ddd7aa5bc3ce3f9c781fd49a1f5a5dd94a46d2986920d7a 64.14MB / 64.14MB                                                                                         2.6s=> => sha256:162d92c5f1467ad877bf6d8a098d9b04d7303879017a2f3644bfb1de1fc88ff0 1.21kB / 1.21kB                                                                                           0.0s=> => sha256:352006f12f1ac363c55eb8427dbf97415e2e534de4976a9c243532bb46cffaff 2.00kB / 2.00kB                                                                                           0.0s=> => sha256:609c73876867487da051ad470002217da69bb052e2538710ade0730d893ff51f 49.56MB / 49.56MB                                                                                         1.2s=> => sha256:b4580645a8e50b87a19330da289a9b1540022379f2c99d3f0112e3c5c4a8d051 87.03MB / 211.14MB                                                                                        3.1s=> => extracting sha256:609c73876867487da051ad470002217da69bb052e2538710ade0730d893ff51f                                                                                                1.8s=> => sha256:dfc93b8f025cacb2b7fb13be1c7b87ff1cb61e46f01414022a5bded203a17ebd 3.37kB / 3.37kB                                                                                           1.6s=> => sha256:a67998ba05d7fa19701d42d143bd70271124be791568bdb03eedfbd7216f622f 35.65MB / 49.72MB                                                                                         3.1s=> => sha256:9513f49617f6b0cb153128202311a5004f1069c3c86c78386abceab4827f9b79 2.23MB / 2.23MB                                                                                           2.8s=> => sha256:e2a102227dc65b99b43d5e0acfcda25a0c1c01ad9ec755fe764c6b87a13a61d0 452B / 452B                                                                                               3.0s=> [internal] load build context                                                                                                                                                        0.0s=> => transferring context: 8.95kB                                                                                                                                                      0.0s
# ...=> [3/4] COPY . /app                                                                                                                                                                    0.0s=> [4/4] RUN npm install                                                                                                                                                                3.8s=> exporting to image                                                                                                                                                                   0.1s=> => exporting layers                                                                                                                                                                  0.1s=> => writing image sha256:e927da5f02832bbdec969526c9218b712983bef96cbd29944bdd1124b637f32c

接下来用提供的 hash 值去启动容器即可:

docker run e927da5f02832b

对于当前的 node 项目,直接使用上面的指令是无法打开网页的,因为 docker 默认不会暴露端口——虽然 EXPOSE 80 的确暴露了端口,不过因为没有设置本机接入的端口,因此 localhost 上并找不到对应的程序,所以就需要用 -p 指令去进行端口的 mapping:

# or stop by using container namedocker stop eb9d2e2f00ad
eb9d2e2f00ad# start another container with the correct portdocker run -p 3000:80 e927da5f02832b

这时候就可以在 3000 上访问网页了:

在这里插入图片描述

⚠️:-ppublish 的意思

layer 结构

docker 对镜像和容器的管理是使用一个 layered filesystem 去进行的,每一条指令,如 RUN, COPY 都会创建一个对应的 layer,并且这个层级 layer 是不可变的,下一个 layer 的操作会基于当前 layer 进行实现。

因此,为了优化,docker 会 cache 构建的 layer。当代码/过程没有变动,docker 则会复用 cached 的 layer 进行打包。同样是为了优化,不可变的 layer 是会被所有的容器共享的

这是重新打包展示一下缓存的案例:

docker build .
[+] Building 0.3s (9/9) FINISHED                                                                                                                                         docker:desktop-linux=> [internal] load .dockerignore                                                                                                                                                        0.0s=> => transferring context: 2B                                                                                                                                                          0.0s=> [internal] load build definition from Dockerfile                                                                                                                                     0.0s=> => transferring dockerfile: 602B                                                                                                                                                     0.0s=> [internal] load metadata for docker.io/library/node:latest                                                                                                                           0.2s=> [1/4] FROM docker.io/library/node@sha256:162d92c5f1467ad877bf6d8a098d9b04d7303879017a2f3644bfb1de1fc88ff0                                                                            0.0s=> [internal] load build context                                                                                                                                                        0.0s=> => transferring context: 420B                                                                                                                                                        0.0s=> CACHED [2/4] WORKDIR /app                                                                                                                                                            0.0s=> CACHED [3/4] COPY . /app                                                                                                                                                             0.0s=> CACHED [4/4] RUN npm install                                                                                                                                                         0.0s=> exporting to image                                                                                                                                                                   0.0s=> => exporting layers                                                                                                                                                                  0.0s=> => writing image sha256:9d8a7aee704bea3fbb3e0ea46c5ab7173f0189eac5fe5c2d4b2b9338f0d4cac9

注意这里的 CACHED [2/4] WORKDIR /app,表示复用缓存的 layer,因此这个打包过程就会比较快。但是,如果有一层 layer 变了,那么后面的 layer 也会重新构建——docker 不会做深比对。因此,docker 镜像指令的排序是很重要的,下面这个就是优化后的项目打包指令:

FROM nodeWORKDIR /app# npm install will be ran if package.json has been changed
COPY package.json /appRUN npm installCOPY . /appEXPOSE 80CMD [ "node",  "server.js"]

一开始的指令里,RUN npm installCOPY . /app 的下一个指令,而每次修改源代码势必会造成 COPY . /app 这个指令无法被缓存,因此使用第一个 Dockerfile 去构建镜像,不管 package.json 有没有产生变化,docker 都会重新执行 RUN npm install 这条指令

对比优化后的指令,优先将 package.json 复制到 working directory 下,随后执行 RUN npm install。这样只要 package.json 没有变化,那么 image 就不会执行 RUN npm install 的操作,而是会直接跳到 COPY . /app

总结

  • 所有的代码和工具都在镜像中

  • docker 在创建镜像的过程中会创建不同的 layer

  • 不可变的 layer 会被所有的容器共享

  • 每个容器会有着独立的可变 layer

    可变 layer 会应用不同的配置

因此,docker 可以实现:

  • 容器的孤立

  • 减少重复过程

  • 写时复制

    copy on write 其实总结了其他的优点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/310678.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wps使用Latex编辑公式没有Latex formula

wps使用Latex编辑公式没有Latex formula 1. 下载CTEX2. 下载LaTeXEE3. 配置Miktex4. 配置latexee5. 用管理员权限运行latexeqedit.exe6. wps插入latex公式 1. 下载CTEX 下载CTEX网址,我下载的下图这个,下载完了之后运行exe文件安装ctex。 2. 下载LaTe…

深入理解k8s kube-proxy

1、概述 我觉得只要大家知道kube-proxy是用来配置网络规则的而不是转发流量的,真正的流量由iptables/ipvs来转发就可以了。 网络是k8s的一个关键部分。理解k8s中网络组件如何工作可以帮助更好的设计和配置我们的应用。 kube-proxy就是K8s网络的核心组件。它把我们…

janus部署

配置和运行janus 1. 配置nginx 安装nginx,主要用来提供web访问。 生成证书 mkdir -p ~/cert cd ~/cert # CA私钥 openssl genrsa -out key.pem 2048 # 自签名证书 openssl req -new -x509 -key key.pem -out cert.pem -days 1095安装nginx #下载nginx 1.15.8版…

OOCT WPF_D3D项目报错无法加载依赖项

运行示例项目报错缺少dll,发现运用了这个大老李,通过添加PATH路径也无法解决,看到debug文件夹下面没有其他的依赖项。 通过depneds工具可以看到 OCCTProxy_D3D.dll 缺少依赖项,图中的缺项都是OCCT生成的模块dll所以讲这些dll从..…

百度 千帆sdk 试用

主要是Java SDK的使用&#xff1a; <dependency> <groupId>com.baidubce</groupId> <artifactId>qianfan</artifactId> <version>0.0.4</version> </dependency> 参考文档&#xff1a;bce-qianfan-sdk/java at main baidub…

【CVE-2010-2883】进行钓鱼攻击的研究

最近作业中研究APT攻击&#xff0c;了解到2011年前后披露的LURID-APT&#xff0c;其中敌手利用了各种版本的文件查看器的漏洞实现攻击。CVE-2010-2883就是其中被利用的一个adobe reader的漏洞。特此复现&#xff0c;更好的研究和防范APT攻击。 本文仅仅是对相关漏洞利用的学习…

若依前后端部署到一起

引用&#xff1a;https://blog.csdn.net/qq_42341853/article/details/129127553 前端改造&#xff1a; 配置打包前缀 修改router.js 编程hash模式&#xff1a; 前端打包&#xff1a;npm run build:prod 后端修改&#xff1a; 添加thymeleaf包&#xff0c;和配置文件 spri…

spring-cloud微服务gateway

核心部分&#xff1a;routes(路由)&#xff0c; predicates(断言)&#xff0c;filters(过滤器) id&#xff1a;可以理解为是这组配置的一个id值&#xff0c;请保证他的唯一的&#xff0c;可以设置为和服务名一致 uri&#xff1a;可以理解为是通过条件匹配之后需要路由到&…

rhce day1

一 . 在系统中设定延迟任务要求如下 在系统中建立 easylee 用户&#xff0c;设定其密码为 easylee 延迟任务由 root 用户建立 要求在 5 小时后备份系统中的用户信息文件到 /backup 中 确保延迟任务是使用非交互模式建立 确保系统中只有 root 用户和 easylee 用户可以执行延…

线性表概念及顺序表的实现

文章目录 前言一、线性表1.定义2.特点3.一般线性表的抽象数据类型定义 二、线性表的顺序存储&#xff08;顺序表&#xff09;1.基本概念2.数组实现顺序表3.顺序表中基本操作的具体实现4.顺序表总结 总结 前言 T_T此专栏用于记录数据结构及算法的&#xff08;痛苦&#xff09;学…

Golang教程一(环境搭建,变量,数据类型,数组切片map)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 格式化输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字…

计算机网络(四)网络层

网络层 基本概念 网络互联&#xff1a; 将两个以上的计算机网络&#xff0c;通过一定的办法&#xff0c;用一种或多种通信处理设备(即中间设备)相互连接起来&#xff0c;以构成更大的网络系统。中间设备又称中间系统或中继系统 中继系统分为4种&#xff1a; 物理层中继系统…

Navicat的安装与破解

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比 目录 EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【EI级】Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM…

Unity 扩展自定义编辑器窗口

在Assets文件夹路径下任意位置创建Editor文件夹&#xff0c;将扩展编辑器的代码放在Editor文件夹下 生成编辑器窗口 代码中首先引用命名空间 using UnityEditor; 然后将创建的类继承自EditorWindow public class MenuEditor : EditorWindow 然后通过扩展编辑器菜单功能调用…

AI - 提示词意外收获 (5)

提示词&#xff1a; A soft pink rose with opalescent leaves, located in a surreal desert under the light of a binary star system, The dual shadows and contrasting lights create a dreamlike quality, emphasizing the roses unique beauty,翻译: 一种柔软的粉红…

动态规划|343.整数拆分

力扣题目链接 class Solution { public:int integerBreak(int n) {vector<int> dp(n 1);dp[2] 1;for (int i 3; i < n ; i) {for (int j 1; j < i / 2; j) {dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j));}}return dp[n];} }; 思路 看到这道题目&…

153. 寻找旋转排序数组中的最小值

Problem: 153. 寻找旋转排序数组中的最小值 文章目录 思路解题方法复杂度Code 思路 排序( O ( n l o g n ) O(nlogn) O(nlogn)) 或者 循环一次( O ( n ) O(n) O(n))&#xff0c;但时间复杂度均不满足要求 解题方法 二分 当数组旋转后&#xff0c;只有可能出现如图的两种情况&am…

数据库查询:查询入参类型和数据库字段类型不匹配导致的问题

问题&#xff1a;假设我们现在有这样的一张表 CREATE TABLE test_person (id int(20) NOT NULL COMMENT 主键,name varchar(20) DEFAULT NULL COMMENT 姓名,gender char(2) DEFAULT NULL COMMENT 性别,birthday date DEFAULT NULL COMMENT 生日,created_time timestamp NULL D…

ubuntu 23.10.1 mysql 安装

注&#xff1a;请进入root用户模式下操作&#xff0c;若没有&#xff0c;输入命令前加上sudo 1、更新软件包列表 apt update2、安装最新版的Mysql服务器 apt install mysql-server -y如果不加-y 会在安装过程中&#xff0c;系统将提示你设置MySQL的root密码。确保密码足够强…