Docker入门与实战——实战案例(编程开发)(一)

实战案例(编程开发)

1、C/C++

C是一门古老的语言,在今天仍然是系统领域和高性能计算的主要选择,它在1969年由贝尔实验室设计开发。C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点。C++在C的基础上,支持了数据的抽象与封装、面向对象和泛型编程。功能与性能的平衡使C++成为目前应用最广泛的系统编程语言之一。

1.1、GCC

GCC(GNU Compiler Collection,GNU编译器套装)是一套由GNU开发的编程语言编译器,是一套根据GPL及LGPL许可证发行的自由软件,也是GNU计划的关键部分。GCC(特别是其中的C语言编译器)通常被认为是跨平台编译器的事实标准。

GCC可处理C/C++、Fortran、Pascal、Objective-C、Java、Ada等多种语言。

1.1.1、使用官方镜像

将C/C++代码运行在容器内的最简方法,就是将编译指令写入Dockerfile中,然后使用此Dockerfile构建自定义镜像,最后直接运行此镜像,即可启动程序。

如果对GCC版本有要求,则可以在以上命令中加入镜像标签,并在下一步Dockerfile的FROM指令中明确GCC版本号。

然后,在Dockerfile中,加入需要执行的GCC编译命令:

bash 复制代码
FROM gcc:4.9
COPY . usr/src/myapp
WORKDIR /usr/src/myapp
RUN gcc -o myapp main.c
CMD ["./myapp"]

编辑main.c,内容如下:

c 复制代码
#include<stdio.h>

int main()
{
	printf("Hello World\n");
	return 0;
}

现在,就可以使用Dockerfile来构建镜像my-gcc-app:

bash 复制代码
docker build -t gcc-image .

用户可以使用docker images命令查看生成的镜像:

bash 复制代码
$ docker images
                                                                               i Info →   U  In Use
IMAGE                   ID             DISK USAGE   CONTENT SIZE   EXTRA
gcc-image:latest        0ff8c88cbf54       1.37GB             0B

创建并运行此容器,会编译并运行程序,输出Hello World语句:

bash 复制代码
$ docker run -it --rm --name gcc-container gcc-image
Hello World

如果只需要容器编译程序,而不需要运行它,则可以使用如下命令:

bash 复制代码
docker run --rm -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp gcc gcc -o myapp
1.1.2、定制镜像

下面,笔者给出了基于buildpack-deps:wheezy镜像创建GCC镜像的Dockerfile供读者参考:

1.2、LLVM

LLVM(Low Level Virtual Machine,底层虚拟机)是美国伊利诺伊大学的一个研究项目,试图提供一个现代化的,基于SSA的编译策略,同时支持静态和动态编程语言。和之前为大家所熟知的JVM以及.net Runtime这样的虚拟机不同,这个虚拟系统提供了一套中立的中间代码和编译基础设施,并围绕这些设施提供了一套全新的编译策略(使得优化能够在编译、连接、运行环境执行过程中,以及安装之后以有效的方式进行)和其他一些非常有意思的功能。

LLVM包括若干重要的子项目,其中Clang将在后面讲解。

1.2.1、使用官方镜像

Docker Hub中已经有用户提供了LLVM镜像,读者可以直接下载使用,不再赘述:

1.2.2、定制镜像

读者可以基于前面提到的SSHD基础镜像来定制GCC镜像,构建后直接运行。也可以使用Docker Hub中提供的第三方Dockerfile,定制或修改后构建镜像,然后运行容器即可。

1.3、Clang

Clang是一个由Apple公司用C++实现、基于LLVM的C/C++/Objective-C/Objective-C++编译器,其目标就是超越GCC成为标准的C/C++编译器,它遵循LLVM BSD许可。Clang很好地兼容了GCC。

Clang的特性包括以下几点。

  • 快:在OSX上的测试中,Clang比GCC 4.0快2.5倍。
  • 内存占用小:Clang内存占用一般比GCC要小得多。
  • 诊断信息可读性强:Clang对于错误的语法不但有源码提示,还会在错误的调用和相关上下文上有更好的提示。
  • 基于库的模块化设计:Clang将编译过程分成彼此分离的几个阶段,将大大增强了IDE对于代码的操控能力。
1.3.1、使用官方镜像

在Docker Hub中已经有用户提供了Clang的镜像,读者可以直接下载使用:

读者可以通过Docker Hub的镜像详情查看实际安装指令,确认是否符合需求,如下所示:

1.3.2、定制镜像

如前文所说,读者可以基于SSHD镜像自定义Dockerfile,也可以使用Docker Hub中的第三方镜像构建Clang容器。

这里以ubuntu:bionic系统为例,给出了示例Dockerfile文件:

1.3.3、相关资源

2、Java

Java是广受欢迎的编程语言和开发平台,有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今,Java仍是企业和开发人员的首选开发平台,全球有数百万开发人员运行超过60亿台Java虚拟机。Java是一种跨平台、面向对象、泛型编程的编译型语言,广泛应用于企业级应用开发和移动应用开发领域,由SUN公司在1995年推出。Java是基于类的面向对象的高级语言,其设计理念是尽可能减少部署依赖,致力于允许Java应用的开发者"开发一次,到处运行"​。这就意味着Java的二进制编码不需要再次编译,即可运行在异构的JVM上。Java在大型互联网项目,特别是互联网金融和电子商务项目中非常受欢迎。OpenJDK(Open Java Development Kit)是免费开源的Java平台,支持Java SE(Standard Edition)。从Java7开始,OpenJDK就是官方的Java SE环境。

2.1、使用官方镜像

在容器中运行Java代码最简单的方法就是将Java编译指令直接写入Dockerfile。然后使用此Dockerfile构建并运行此镜像,即可启动程序。

首先,从官方仓库获取某版本Java基础镜像:

bash 复制代码
docker pull eclipse-temurin:8-jdk 

然后,在本地新建一个空目录,在其中创建Dockerfile文件。在Dockerfile中,加入需要执行的Java编译命令,例如:

bash 复制代码
FROM eclipse-temurin:8-jdk
COPY . /usr/src/javaapp
WORKDIR /usr/src/javaapp
RUN javac HelloWorld.java
CMD ["java", "HelloWorld"]
java 复制代码
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

如果希望使用最新的Java 10,则可以修改基础镜像为FROM eclipse-temurin:10-jdk。下面继续使用此Dockerfile构建镜像java-image:

bash 复制代码
docker build -t java-image .

用户可以通过docker images命令查看生成的镜像:

bash 复制代码
$ docker images
                                                                             i Info →   U  In Use
IMAGE                   ID             DISK USAGE   CONTENT SIZE   EXTRA
eclipse-temurin:8-jdk   1f884d67c72d        314MB             0B

然后,运行此镜像即自动编译程序并执行:

bash 复制代码
$ docker run -it --rm --name java-container java-image
Hello World!

如果只需要在容器中编译Java程序,而不需要运行,则可以使用如下命令:

bash 复制代码
docker run --rm -v "$(pwd)":/usr/src/javaapp -w /usr/src/javaapp eclipse-temurin:8-jdk javac HelloWorld.java

以上命令会将当前目录("$(pwd)")挂载为容器的工作目录,并执行javac HelloWorld.java命令编译HelloWorld.java代码,然后生成HelloWorld.class类文件至当前目录下:

bash 复制代码
$ ls
Dockerfile       HelloWorld.class HelloWorld.java

2.2、Spring Boot

Spring Boot是由Pivotal团队开发的框架,其设计目的是简化新Spring应用的初始搭建以及开发过程。SpringBoot致力于在蓬勃发展的快速应用开发领域成为领导者,旨在简化创建产品级的Spring应用和服务。Spring Boot是一个基于Spring框架的快速开发的框架,可以用来创建独立、可运行的、生产级别的Spring应用程序。使用Spring Boot可以大大简化Spring应用程序的开发过程,通过自动配置Spring和第三方库,减少了大量烦琐的配 置,从而让开发人员更加专注于业务代码的编写。

下图显示了Spring Boot在Spring生态中的位置。

Spring Boot的特性包括:

  • 创建独立的Spring应用。
  • 内嵌Tomcat、Jetty或Undertow(无须部署WAR文件)。
  • 提供starter POM,简化Maven配置。
  • 尽可能地实现Spring项目配置自动化。
  • 提供工业级特性,如Metrics、健康检查等。
  • 不生成代码,不需要XML配置。

使用compose搭建Spring Boot应用

下面介绍如何使用compose搭建Spring Boot应用,环境要求是JDK 1.8或以上版本,Maven 3.0或以上版本。

下面创建一个Spring Boot应用。

2.3、相关资源

3、Python

Python是一种解释型动态语言,是功能强大的面向对象语言,集成了模块(module)、异常处理(exception)、动态类型(dynamic typing)、高级数据结构(元组、列表、序列)​、类(class)等高级特性。Python设计精良,语法简约,表达能力很强。目前,所有主流操作系统(Windows、Linux、类UNIX系统)都支持Python。

3.1、使用官方镜像

首先,推荐用户使用Docker官方提供的Python镜像作为基础镜像。

第一步,新建项目目录py-official,进入此目录,然后使用docker pull命令拉取官方镜像:

bash 复制代码
docker pull python

接下来,在项目中新建一个Dockerfile文件,内容如下:

bash 复制代码
FROM python
COPY . /usr/src/py
WORKDIR /usr/src/py
CMD ["python", "./sample.py"]

新建sample.py文件,计算Fibonacci数列:

python 复制代码
def fib(n):
	a, b = 0, 1
	while a < n:
		print(a, end=' ')
		a, b = b, a + b
	print()
fib(1000)

新建requirements.txt依赖文件,读者可以在此文件中加入项目依赖程序,如Django等。此处仅新建空文件:

bash 复制代码
touch requirements.txt

第二步,使用docker build命令构建名为py3-image的镜像:

bash 复制代码
docker build -t py3-image .

可见至此用户已经成功构建了镜像,可以通过dockerimages命令进行查看:

bash 复制代码
$ docker images
                                                                             i Info →   U  In Use
IMAGE                   ID             DISK USAGE   CONTENT SIZE   EXTRA
py3-image:latest        111c004ee5b2       1.12GB             0B

第三步,通过docker container run命令创建并运行容器:

bash 复制代码
$ docker run -it --rm --name py3-container py3-image
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

如果只需要运行单个Python脚本,那么无须使用Dockerfile构建自定义镜像,而是通过以下命令直接使用官方Python镜像,带参数运行容器:

bash 复制代码
docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp python:3 python your-daemon-or-script.py

如果读者希望深入了解Python的官方镜像,包括镜像的原始Dockerfile、ONBUILD指令的具体执行内容等,则可以参考GitHub上的docker-library/official-images仓库。

3.2、使用PyPy

PyPy是一个Python实现的Python解释器和即时编译(JIT)工具,它专注于速度、效率,和CPython的完全兼容性。通过JIT技术,PyPy可以使Python的运行速度提高近十倍,同时保证兼容性。

使用官方镜像

首先,设置项目目录,并新建hi.py实例程序:

然后,在根目录新建Dockerfile,其内容基于pypy3的onbuild版本镜像:

如果用户需要使用pypy2,则可以使用FROM pypy:2-onbuild。

onbuild版本的镜像内含若干onbuild触发器,它们可以在镜像构建期间完成一些必要的初始化操作,便于项目直接运行。pypy的onbuild镜像会复制一个requirements.txt依赖文件,运行RUN pip install安装依赖程序,然后将当前目录复制到/usr/src/app。

下面,用户开始构建和运行此镜像:

如果用户只需要运行单个pypy脚本,并希望避免新建Dockerfile,那么可以直接使用如下指令:

如果需要使用pypy2运行,则可以使用如下指令:

3.3、使用Django

Django是一个开放源代码的Web应用框架,是基于Python实现的流行的Web框架之一,于2005年7月在BSD许可证下发布。Django采用了MVC(模型、视图、控制器)的经典软件设计模式,主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和可插拔性,以及敏捷开发和DRY(Don't Repeat Yourself)法则。

相比Tornado、Flask、Web.py等框架,Django要"重"一些,但它自带了很多工具包,包括认证系统、站点管理系统、评论系统等,便于进行中小型站点的快速开发。

3.3.1、使用Django镜像

在本地可通过pip安装Django,十分简单:

下面创建一个容器镜像。

  • 第一步,新建项目目录django-official,新建一个名为dockerdjango的Django项目:

    新建Dockerfile文件,内容如下:

    使用onbuild标签意味着在执行docker build命令的过程中,docker engine会执行ONBUILD命令中的操作。具体的ONBUILD命令可以在GitHub上的docker-library仓库中看到,即:
  • 第二步,新建requirements.txt文件,内容为Django:
  • 第三步,使用docker build命令构建此Django镜像:

    可见Django镜像构建成功,并生成相应的镜像。下面,用户可以使用dockercontainerrun命令运行此镜像,并得到相应的容器ID:

    使用docker ps命令可见Django容器已暴露8000端口,但是没有绑定访问端口:

    再次使用docker ps命令可见Django容器不仅暴露8000端口,还映射到了本地端口32768:
  • 第四步,通过浏览器访问主机的32768端口来访问此Django服务,如图所示。

    还可以通过docker logs django-container命令查看日志。还可以使用dockercontainerrun的entrypoint进入容器,执行更多操作:
3.3.2、使用Compose搭建Django应用

Compose是一个定义和运行服务(多容器应用)的官方工具。用户可以通过一个Compose配置文件定义服务,然后使用up命令创建并启动服务。关于Compose的详细讲解,可参阅本书第四部分相关章节。

首先安装docker-compose:

下面用户使用Docker Compose来配置和运行一个简单的Django/PostgreSQL应用。

  • 第一步,用户需要创建一个Dockerfile,一个Python依赖文件,还有一个docker-compose.yml文件。

    新建一个项目文件夹,例如命名为djangocompose,并在其根目录新建一个Dockerfile文件,文件内容如下:

    在项目文件夹的根目录新建一个requirements.txt文件,文件内容如下:

    注意psycopg2是Python与PostgreSQL的数据库连接池。

    最后,在项目文件夹的根目录新建一个docker-compose.yml文件,内容如下:

  • 第二步,新建一个Django项目,在其中用docker-compose命令新建一个Django项目:

  • 第三步,配置Django的数据库连接。

    进入项目文件夹,编辑djangocompose/settings.py文件。设置DATABASES=...字段:

    运行docker-compose up命令:

    此时用户的Django应用已经开始运行了,访问容器的8000端口,即可看到运行效果,如图所示。

    下面用户可以登录容器查看此Django应用的运行状态。

    首先使用docker ps查看当前主机运行的容器:

    可见Web服务的容器ID是eb078d59a780,用户可以使用docker exec命令登录到容器的bash环境中:

3.3.3、使用Docker Hub镜像

Django+uWSGI+Nginx的技术组合拥有优异的性能,也是常用的Django Web技术栈。下面用户使用Docker Hub上的dockerfiles/django-uwsgi-nginx镜像构建Django应用。

首先,使用docker pull命令获取镜像:

然后,使用build命令构建名为django-uwsgi-nginx-image的Django镜像:

用户可以使用docker images查看镜像信息:

然后,构建并运行django-uwsgi-nginx-image镜像:

这里的-d参数表示后台运行容器,并打印出容器ID。用户可以使用docker ps-a查看所有容器:

3.3.4、自定义uWSGI+Nginx+Django镜像

用户也可以通过本地编译自定义uWSGI+Nginx+Django镜像。

首先,新建Dockerfile文件,内容如下:

然后,在Dockerfile同级目录下新建app文件夹,内含requirements.txt文件,文件内容如下:

然后,新建Nginx配置文件django.conf,内容如下:

新建run.sh文件,内容如下:

新建supervisord.conf文件,内容如下:

新建uwsgi.ini文件,内容如下:

新建uwsgi_params文件,内容如下:

下面,用户可以使用docker create构建镜像,使用dockerpush将镜像提交至仓库,然后用户可以登录到生产环境,使用docker pull从仓库拉取此镜像,最后运行此镜像:

目前容器内的默认卷地址是/opt/django/app,读者可以挂载特定的应用卷,例如:

至此,用户可以成功地在Nginx+uWSGI环境下运行Django应用了。

3.4、使用Flask

Flask是一个使用Python编写的轻量级Web应用框架,该框架基于Werkzeug WSGI工具箱和Jinja2模板引擎。Flask使用BSD授权,也被称为microframework,因为它仅仅使用简单的核心,使用extension来增加其他功能。

Flask的特色:

  • 内置开发用服务器和debugger。
  • 支持集成单元测试(unit testing)。
  • 支持RESTful请求调度。
  • 支持使用Jinja2模板引擎。
  • 支持Secure Cookies(客户端sEssion)。
  • 与WSGI 1.0 100%兼容。
  • 基于Unicode。
  • 有详细的文件、教学手册。
  • 与Google App Engine兼容。
  • 可用Extensions增加其他功能。

Flask是目前广受欢迎的常用Python Web方案之一。

3.4.1、使用Docker Hub镜像
  • 第一步,项目准备工作。构建Flask App目录:

    run.py内容如下:

    __init.py_内容如下:
  • 第二步,获取Docker Hub的Flask镜像:
  • 第三步,创建并运行Flask容器(Flask的App代码作为Docker数据卷):
3.4.2、使用Compose构建Flask+MongoDB服务

MongoDB是一个基于分布式文件存储的数据库,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。将Flask与MongoDB结合使用,是一种简单高效的Web服务架构,可以以较高的性能支撑图片服务等各种常见Web服务。

  • 第一步,新建mongo-flask项目文件夹,并新建Flask框架的核心文件app.py,内容如下:
  • 第二步,新建templates文件夹,放置Flask框架的前端模板文件index.html,内容如下:
  • 第三步,回到项目根目录,新建requirements.txt文件,内容如下:
  • 第四步,新建Dockerfile文件,内容如下:
  • 第五步,新建docker-compose.yml文件,内容如下:

3.5、使用Sentry

Sentry是一个实时的事件日志和聚合平台,基于Django构建。Sentry可以将Python程序的所有异常自动记录下来,然后在一个好用的UI上呈现和搜索。处理异常是每个程序的必要部分,所以Sentry是Python后端系统常用的组件。

使用Docker Hub镜像

为了使用Sentry服务,用户需要按照以下步骤操作:

  • 1)启动一个功能完整的Sentry实例;
  • 2)配置初始化用户;
  • 3)配置环境变量。

启动一个功能完整的Sentry实例的步骤如下。

首先,启动一个Redis容器:

之后,启动一个Postgres容器:

最后,生成一个新的密钥,供所有Sentry容器使用。SENTRY_SECRET_KEY环境变量即此密钥:

如果用户需要升级,可以使用以下命令:

现在用户可以启动Sentry服务:

默认配置需要一个Celery Beat(任务调度器)和CeleryWorker(执行具体任务的工作进程)​,用户可以按需启动相应数量的Worker(工作进程)​(每个Worker独占名称)​。

启动Celery Beat和Celery Worker:

此时用户可以通过docker ps命令查看当前运行的容器:

用户可以使用标准的容器端口映射,在运行dockercontainerrun命令时添加-p 8080:9000参数,然后打开浏览器输入http://localhost:8080或http://host-ip:8080,即可访问Sentry服务。

关于用Sentry配置初始化用户以及环境变量,可以参考Sentry官方镜像文档。

3.6、相关资源

4、JavaScript

JavaScript(JS)是主流浏览器上支持的脚本语言,这也是早期JavaScript的唯一用途。Node.js自2009年发布,使用Google Chrome浏览器的V8引擎。Node.js的出现,让服务端应用也可以基于JavaScript进行编写。它采用事件驱动,性能优异,同时还提供了很多系统级API,如文件操作、Socket、HTTP网络编程等,支持主流操作系统。Node.js应用通过非驻塞IO和异步事件将系统吞吐能力和效率最大化。

4.1、使用Node.js

Node.js是基于Chrome V8引擎的JavaScript运行时环境,可用于构建服务端应用程序。Node.js具有以下优点。

  • 高性能:Node.js采用事件驱动、非阻塞I/O模型,能够处理大量并发连接,提高Web应用程序的响应速度和吞吐量。
  • 跨平台:Node.js可在Windows、Linux、macOS等多个操作系统上运行,具有很好的跨平台兼容性。
  • 易于学习和使用:Node.js的API简单易用,语法与前端JavaScript类似,容易上手学习。
  • 强大的社区支持:Node.js拥有庞大的社区,有很多优秀的第三方模块和工具可供使用,且社区活跃度高。
  • 可扩展性强:Node.js的模块化开发方式和NPM包管理工具,使得应用程序的开发和维护更加容易,可扩展性强。
  • 同构渲染:Node.js可用于实现前后端同构渲染,提高Web应用程序的性能和SEO效果。
  • 适用于实时通信:Node.js的Socket.IO库可用于构建实时通信应用程序,如聊天室、游戏等。
4.1.1、使用官方镜像

可以通过docker run命令直接使用官方镜像:

bash 复制代码
docker run -it node:latest bash
root@7bfbcc718209:/# node --version
v26.11.1

Node.js拥有3种官方镜像:node:<version>、node:<version>-alpine、node:<version>-slim。其中常用的是带有版本标签的,以及带有onbuild标签的Node镜像。

首先,在Node.js项目中新建一个Dockerfile:

bash 复制代码
FROM node
COPY . /usr/src/node
WORKDIR /usr/src/node
EXPOSE 8888

然后,新建server.js文件,内容如下:

js 复制代码
'use strict';

var connect = require('connect');
var serveStatic = require('serve-static');

var app = connect();
app.user('/', serveStatic('.', {'index':['index.html']}));
app.listen(8080);

console.log('MyApp is ready at http://localhost:8080');

之后,通过npm init命令来新建Node项目必需的package.json文件:

下面使用docker build命令构建Node镜像:

用户可以通过docker images命令查看已创建的Node镜像:

此时可以使用浏览器查看到MyApp应用的服务页面。

首先,使用docker ps命令查看端口绑定情况:

也可以使用curl命令访问:

访问效果如图所示。

如果出现无法访问等问题,可以使用entrypoint参数进入容器进行操作:

如果需要使用netstat等网络工具,可以在容器内使用以下命令进行安装:

如果需要查看容器日志,可以使用docker log命令:

如果只需要运行单个Node脚本的容器,则无须通过Dockerfile构建镜像,可以使用以下指令:

也可以参考Node官方提供的最佳实践:https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md。

4.1.2、使用alpine精简版Node镜像

随着Docker官方提供基于alpine精简系统的各类镜像,这种平均大小只有10MB的镜像可以方便地应用于各种开发测试或生产环境中。读者可以在Node官方镜像页面查找所需版本,并使用docker run命令直接运行,进入Node环境。

若需查看官方镜像对应的Dockerfile,则可以进入Node的GitHub官方仓库nodejs/docker-node/20/alpine3.17/Dockerfile查看。

4.2、相关资源

相关推荐
Wang's Blog1 小时前
Java 项目部署之 Docker工具快速入门: Docker 数据卷命令与挂载实操
java·开发语言·docker
空空dream1 小时前
04 | 用 Jenkins 打通 CI自动构建镜像并推送到本地 Harbor
运维·ci/cd·jenkins
海宇AI1 小时前
零信任架构实战:基于海宇运营商近3个月平均账单构建自动化免押租赁授信网关
运维·人工智能·架构·自动化
此生决int1 小时前
Linux系列(06)——进程概念(上)
linux·运维·服务器
海宇服务1 小时前
零信任架构实战:基于海宇股权穿透构建自动化招投标供应商关联排查网关
运维·人工智能·架构·自动化
wdfk_prog2 小时前
LWIP教程 13:从 `dhcp_start()` 到 `DHCP_STATE_BOUND`——DHCPv4、ACD、Timer 与真实抓包
运维·网络协议
星云低代码开发平台2 小时前
AI 连接器运行健康度:指标、异常恢复和联调清单
大数据·运维·网络·数据库·人工智能·mcp
死磕音视频2 小时前
自己搭一个“私人版 ChatGPT“:Open WebUI 一条命令部署 + 接入本地/云端模型保姆级教程
docker·开源·open webui·大模型部署
Sayai2 小时前
Hadoop 集群安全加固实战:YARN 未授权访问漏洞修复,firewalld 白名单 + Nginx 反向代理 Basic Auth 全流程
运维·hadoop·nginx·安全·网络安全