标签:docker

Docker是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。

浅谈大型项目中前端管理架构

今天来跟大家聊聊大型组织中(前端工程师的人数开始超过15人)前端管理架构,主要涉及的是团队协作。 本文不讨论在这样的大公司中常见的管理问题或业务领域问题,而是关注前端的协作架构。

使用Docker启动MySQL数据库

在本文中,将来学习如何使用Docker CLI和Docker compose启动MySQL容器。 如果你正在开发需要数据存储的应用程序,则MySQL是一种流行的SQL数据库。以前从未使用过MySQL或数据库都没关系-本教程将学习并熟悉启动Docker容器的过程。这些概念可以应用于应用程序所需的任何依赖项。

如何安装Docker?

Docker可以安装在Linux,macOS或Windows 10上。Docker Engine可通过Docker Desktop在各种Linux平台安装Docker, macOS安装Docker和Windows 10上安装Docker以静态二进制安装的形式使用。更多Docker安装指南可以参照官方文档介绍【Docker官方网站】,下面简单总结一下安装过程。

什么是Docker、镜像、编排?

docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。简言之,就是可以在Linux上镜像使用的这么一个容器。

面向WEB开发人员的Docker(一)

Docker的优势很容易让Web开发人员所忽略。对于开发运维来说,它被认为太过技术性、没有必要。术语可能难以理解。教程从来没有解释如何在开发过程中使用Docker。在这里带大家一起来感受Docker在WEB开发中应用。

Docker 化 Vue2 应用开发

随着越来越多的项目使用 Vue3 ,前端项目可能面临新旧版本的问题,需要在本地切换 node.js 的版本,甚至出现一些依赖冲突的问题,为了避免这些问题最佳的方式是用 Docker 容器化来隔离每个开发环境。本文将介绍如何使用 Docker 对 Vue2 前端项目进行 Docker 化,用于项目开发过程。

1Docker 有什么优势?

Docker 有什么优势

Docker的优势很容易让Web开发人员所忽略,对于开发运维来说,它被认为太过技术性、没有必要。先来看看其有什么优势:

  1. 简化配置和部署:Docker可以打包应用程序及其依赖项,并在任何地方轻松部署,从而简化了配置和部署的过程。
  2. 跨平台支持:Docker容器可以在任何操作系统上运行,而不需要修改代码,这使得开发、测试和部署更加灵活和高效。
  3. 资源利用率高:由于Docker容器共享操作系统内核,因此它们比传统虚拟机更加轻量级,可以更好地利用硬件资源。
  4. 可靠性和安全性:Docker容器提供隔离环境,使得应用程序和依赖项在容器中运行更加安全和可靠,同时也避免了不同应用程序之间的冲突。
  5. 易于维护:Docker容器可以根据需要快速创建、销毁和重建,使得应用程序的维护更加容易和高效。在资源扩容收缩方面可以很灵活。

对于开发者而言,还是有必要认识一下Docker,花点时间学习可以提高开发效率、让运营变得简单。

先谈谈个人感受,过去开发PHP程序的时候,需要自己配置Apache等环境,如果换了电脑又得来一遍。有了Docker,开发环境就只需要一句命令或者自己制作符合自己的镜像,这样开发的时候不管在哪里,只要安装Docker,运行起来就可以开始开发调试了。生产环境也是如此,过去如果要配置10台甚至更多的环境,需要一个一个来,有了Docker,实际上就只要执行一个shell文件就可以了,而且配置都可以是完全一样的。

如果对Docker有兴趣,推荐一本书籍《Docker实战(第二版)

1Docker 容器怎么启动一个 Centos 镜像?

要启动一个 CentOS 镜像,可以在 Docker Hub 中查找需要的镜像,运行以下命令:

docker run -it centos

运行后将从 Docker Hub 下载 CentOS 镜像(如果它还没有被下载过),并在交互模式下启动容器。能够看到一个新的 shell 提示符,该提示符表示已经进入 CentOS 容器内部。

如果想在后台模式下运行 CentOS 容器,使用以下命令:

docker run -d centos

将在后台启动容器,并输出容器的 ID

无论哪种方式,都可以使用 docker ps 命令来列出所有正在运行的容器。要停止容器,可以使用 docker stop 命令,后跟容器的 ID 或名称。如下:

docker stop <CONTAINER_ID>

请注意,如果希望在容器内运行某些命令或应用程序,可以将它们附加到 docker run 命令的末尾。例如,要在 CentOS 容器中运行 ls 命令,可以使用以下命令:

docker run -it centos ls

将启动一个新的 CentOS 容器,运行 ls 命令,然后退出容器。

 

1怎么使用 docker 开发调试 node 项目?

在本节中,将创建一个Node.js的“Hello World”应用程序,并将该应用构建成Docker镜像,并从容器启动。正常情况下,该镜像可以部署到生产服务器上,Docker Compose 将用于覆盖一些设置以创建开发和调试环境。这样可以在主机PC上进行编码开发,这样文件将在一个持续运行的容器中执行。这有几个好处:

  • Docker 将管理所有依赖项—— 不需要安装和维护runtimes
  • 这个过程与本地开发没什么不同——可以使用任何喜欢的编辑器和工具
  • 容器是隔离的——应用程序影响到主机PC,如使删除文件
  • 任何时候都可以将应用程序分发给其他开发人员或测试人员——应用程序可以在任何其他设备上以零配置相同的方式运行。

本节创建的代码文件在项目 https://github.com/QuintionTang/docker-nodejs

基于容器的应用开发

Docker 简化了 Web 开发:任何的 Web 应用程序都可以在单个容器中运行。

但是……如果想将类似的容器部署到实时生产服务器,应用程序通常是无状态的。这样可以启动任意数量的实例,任何实例都可以对请求做出响应。实际上,应用程序不应该将基本状态数据存储在本地文件或内存中。

例如:当用户登录时,应用程序将登录凭据存储在内存中。在开发过程中使用单个容器,都可以按预期运行没有问题。

如果将应用程序部署到生产服务器并在两个以上容器中运行,这些容器通过负载均衡接收请求。用户访问系统由 container1 处理其登录。那么下一个请求可能就由 container2 提供服务,容器之间并没有共享登录状态,这个时候就会出现未登录的情况。

当然上面的问题是可以通过解决的,为隔离的容器提供一个中心存储服务,维护应用的持久化存储数据,例如数据库。

无状态 Web 应用程序是一个不错的方式。这样在生产环境中随着用户情况的增加可以快速进行扩缩容,自动添加更多的机器/容器。在解决实际需求的时候就需要考虑是否适合无状态,如果对有状态的应用程序进行转换可能是不可行的。

这些在开发过程中都无关紧要,因为通常只会在单个容器中运行应用程序。如果不实用,就不必在生产中使用容器。

什么是 Node.js

这个想必大部份掘金的小伙伴都知道,这里不展开介绍,引用一段简单的说明。

Node.js 是一种流行的、高性能 JavaScript 运行时,使用 Chrome 浏览器的 V8 JavaScript 引擎构建。它通常用于服务器端 Web 开发,但也已被前端或客户端用来构建工具、桌面应用程序、嵌入式系统等所采用。

安装 Node.js 后,可以使用以下命令执行 JavaScript 文件:

node index.js

单入口脚本文件是什么?理论上它可以命名为任何名称,通常项目都使用index.js 作为入口。

前面的内容一直在使用 Docker Hub 提供的 Docker 镜像。本节将介绍如何构建自己的 Docker 镜像,该镜像可以在开发和生产环境中安装和执行应用程序。

可能你对 Node.js 不感兴趣,但是不管使用何种语言(PHP、Python、Ruby、Go、Rust等)都适合使用 Docker 。

Hello World应用概述

该项目将使用Node.js的Express.js框架创建了一个“Hello World”应用程序。

应用运行地址为:http://localhost:3000/,返回纯文本格式:Hello World!

从客户端 Ajax 请求调用相同的 URL 会返回 JSON 编码的对象:

{ "message": "Hello World!" }

当传入请求的HTTP 标头设置为时,可以识别 Ajax 调用。这是由大多数 Ajax 库添加了:X-Requested-WithXMLHttpRequest

可以向 URL 路径添加字符串,例如http://localhost:3000/devpoint 将返回 Hello Devpint!,响应内容为:

{ "message": "Hello Devpoint!" }

项目初始化

在项目目录中执行以下代码初始化项目:

npm init

Docker 调试NODE应用

输入基本的信息后,会在项目根目录下生成 package.json

接下来安装 express ,执行一下命令:

npm install express --save

为了开发过程中能够响应代码的变更,接下来安装 Nodemon,执行以下命令:

npm install nodemon --save-dev

nodemo 用来监听 node.js 项目中文件的更改并自动重启服务的工具,接下来为项目增加监听规则,如需要忽略的目录:

{
    "script": "./index.js",
    "ext": "js json",
    "ignore": [
        "node_modules/"
    ],
    "legacyWatch": true,
    "delay": 200,
    "verbose": true
}

修改项目 package.json ,在scripts属性下添加启动命令:

"start": "node ./index.js",
"debug": "nodemon --trace-warnings --inspect=0.0.0.0:9229 ./index.js",

这样在终端可以执行一下的命令:

  • npm start : 一般用于生产环境
  • npm run debug :用于开发调试

应用脚本 index.js

脚本在根路由下定义简单的响应请求

"use strict";
const port = process.env.NODE_PORT || 3005, // 定义HTTP默认端口或者从NODE_PORT环境变量获取
    express = require("express"),
    app = express();
// 根路由
app.get("/:title?", (req, res) => {
    const message = `Hello ${req.params.title || "Devpoint"}!`;
    if (req.xhr) {
        res.set("Access-Control-Allow-Origin", "*").json({ message });
    } else {
        res.send(message);
    }
});
// 启动HTTP服务
app.listen(port, () => console.log(`server running on port ${port}`));

接下来开始执行脚本:

npm run debug

打开浏览器输入http://localhost:3005/,可以看到响应的响应,如下

Docker 运行node应用效果

现在可以尝试去修改脚本 index.js 的内容,当有更新的时候,终端会重启服务,刷新浏览器即可看到更新。

docker 环境下调试node应用

到目前为止,一个简单的NodeJS应用程序已经完成。接下来将介绍如何在Docker环境里面运行调试。

后续可以结合谷歌浏览器调试Node.js应用

1在docker上安装pytorch环境需要多少内存?

PyTorch是一个基于Python的科学计算库,主要用于深度学习研究和开发。PyTorch提供了丰富的工具和接口,可以用于构建、训练和部署深度学习模型。

在Docker上安装PyTorch环境需要的内存取决于具体的应用场景和使用方式,但通常需要至少 2GB 的内存来运行PyTorch及其相关库。如果要使用 GPU 进行深度学习训练,还需要安装相应的 GPU 驱动和 CUDA 工具包,并且需要更多的内存和显存。

当然,对于 Docker 来说,可以通过设置资源限制来控制容器所占用的内存,这样可以避免应用程序占用过多的内存导致系统出现问题。可以通过Docker的 -m 选项来设置容器最大可以使用的内存限制,例如:

docker run -it -m 2g pytorch/pytorch:latest

上述命令会启动一个PyTorch容器,并将其最大内存限制设置为 2GB。这样即使应用程序出现了内存泄漏等问题,也不会占用过多的系统资源。

1Docker 动态扩容的方法有哪些

Docker 动态扩容指的是在应用程序负载增加时,自动增加 Docker 容器实例的数量,以应对高负载的需求。以下是几种 Docker 动态扩容的方法:

  1. Docker Swarm:Docker Swarm 是 Docker 官方提供的容器编排工具,它支持动态扩容和缩容,可以根据实际负载情况自动增加或减少 Docker 容器实例的数量。使用 Docker Swarm,可以通过命令行或 API 来创建和管理 Docker 服务,从而使容器的部署和管理更加方便和高效。
  2. Kubernetes:Kubernetes 是 Google 开源的容器编排工具,也支持自动伸缩。它提供了强大的自动化功能,可以通过自定义规则来调整容器的数量,以确保应用程序的高可用性和可扩展性。Kubernetes 还支持水平自动扩容和垂直自动扩容,可以根据容器内存使用率、CPU 使用率等指标来自动调整容器的数量。
  3. Docker Compose:Docker Compose 是 Docker 官方提供的容器编排工具,它支持通过命令行或 API 来创建和管理多个 Docker 容器,也可以通过使用 Docker Compose 文件来定义应用程序的各个服务以及它们之间的依赖关系。Docker Compose 还支持自动伸缩和负载均衡,可以根据应用程序负载情况动态调整容器的数量。
  4. 自定义脚本:如果以上方法不适用于您的需求,可以编写自定义脚本来实现容器的动态扩缩容。例如,可以编写 Python 脚本来监测容器的负载情况,当负载达到一定阈值时,自动增加容器实例的数量。这种方法需要一定的编程技能和经验,但可以根据具体需求进行定制。

Kubernetes 与 Docker Swarm

容器编排正在快速发展,Kubernetes 和 Docker Swarm 是该领域的两大参与者。Kubernetes 和 Docker Swarm 都是用于在集群内部署容器的重要工具。Kubernetes 和 Docker Swarm 在该领域有许多突出的利基 USP 和专业人士,它们将继续存在。尽管他们两人实现目标的方式截然不同且独特,但归根结底,他们的终点仍然很近。

Kubernetes 与 Docker Swarm

Kubernetes 概述

Kubernetes 基于谷歌多年在大规模生产中运行工作负载的经验。根据Kubernetes 网站,“Kubernetes 是一个开源系统,用于自动部署、扩展和管理容器化应用程序。”

它将构成应用程序的容器分组为逻辑单元,以便于管理和发现。Kubernetes 建立在谷歌 15 年运行生产工作负载的经验之上,并结合了来自社区的最佳创意和实践。

Docker Swarm 概述

Docker swarm 是 Docker 自带的容器的编排系统。它使用标准的 Docker API 和网络,可以很容易地进入您已经在使用 Docker 容器的环境。Docker Swarm 旨在围绕四个关键原则工作:

  1. 不那么杂乱/繁重,只用工作方法
  2. Docker Swarm 没有单点故障选项
  3. 由于自动生成安全证书而安全。
  4. 轻松兼容向后版本。

总之,以上是 Docker 动态扩容的常见方法,可以根据实际需求选择合适的方案。Docker Swarm、Kubernetes 和 Docker Compose 是 Docker 官方提供的容器编排工具,支持自动扩缩容,而自定义脚本可以根据具体需求进行定制。无论使用哪种方法,都需要对容器的资源利用情况进行监测和调整,以确保应用程序的高可用性和可扩展性。

 

1Docker 环境清理的常用方法有哪些?

Docker 让开发和部署变得容易了,正因为容易导致不经意的就在不断添加新的 docker 映像、容器等。这些都将占用了系统上的宝贵空间,而且是一直在快速地增加。所以有必要清理Docker环境,把一些不在使用的 Docker 资源清理掉。

首先使用 df 命令查看磁盘的使用情况:

docker system df

返回的结果如下:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          33        8         16.8GB    16.39GB (97%)
Containers      9         1         37.43kB   36.44kB (97%)
Local Volumes   7         2         0B        0B
Build Cache     507       0         21.19GB   21.19GB

请注意,Reclaimable 就是可以恢复的大小,它是通过从总图像大小中减去活动图像的大小来计算的。

接下来就可以使用以下方法来清理:

  1. 清理停止的容器:使用 docker rm 命令清理停止的容器,命令格式为:docker rm <container_id>
  2. 清理未使用的镜像:使用 docker image prune 命令清理未使用的镜像,命令格式为:docker image prune
  3. 清理无用的数据卷:使用 docker volume prune 命令清理无用的数据卷,命令格式为:docker volume prune
  4. 清理未使用的网络:使用 docker network prune 命令清理未使用的网络,命令格式为:docker network prune
  5. 清理Docker缓存:使用 docker builder prune 命令清理Docker缓存,命令格式为:docker builder prune
  6. 清理Docker日志:使用 docker logs 命令查看容器日志,确认无用日志后,使用 truncate 命令清空日志文件,命令格式为:truncate -s 0 <logfile>
1Docker 启动常见问题解决

Docker 无法启动 Failed to start LSB: Create lightweight, portable, self-sufficient containers.

解决办法执行以下命令:

wget -qO- https://get.docker.com/ | sh

Docker安装完启动时提示Failed to start docker.service: Unit docker.service is masked.

解决办法是按照顺序执行以下三条命令:

systemctl unmask docker.service
systemctl unmask docker.socket
systemctl start docker.service