Docker快速上手及常用命令速查
Docker快速上手
安装
在ubuntu上安装docker:
sudo apt-get install docker
docker -v #查看版本
在centos7上安装docker:(docker在YUM源的Extras仓库中)
yum install docker
systemctl start docker
docker常用命令速查
#查看docker信息
docker info
#查看本地镜像列表
docker images
docker rmi <IMAGE> #删除指定的本地镜像#只创建不启动容器
docker create --name mycntainer docker/getting-started
#启动处于停止状态的容器
docker start <CONTAINER_ID>
#创建并启动容器 -d表示在后台运行,终端不会停留在容器的输出界面。(冒号前是主机端口)
docker run -d -p 80:80 docker/getting-started
docker run -itd centos:7 bash
#用多个-p可以映射多个端口:
docker run -d -p 80:80 -p 88:8088 docker/getting-started
#指定entrypoint:
docker run -it --entrypoint=bash centos:7
#指定环境变量:
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name=mysql mysql:5.7
#连接到运行中的容器的终端(attach连接后,退出终端时容器也会退出,exec方式则不会)
docker attach <CONTAINER_ID>
docker exec -it <CONTAINER_ID> bashdocker ps #查看当前运行的容器
docker ps -a #查看当前所有容器,包括运行的和没有运行的
docker stop <CONTAINER ID> # 停止指定的容器
docker rm <CONTAINER ID> # 删除容器 加-f可删除运行中的容器
docker logs <CONTAINER ID> # 查看容器的控制台日志
docker inspect <CONTAINER OR IMAGE> #查看容器或镜像信息
docker cp xx <CONTAINER ID>:/xxx/xx #复制文件或目录到容器中(容器可以不运行)
docker cp <CONTAINER ID>:/xxx/xxx ./ #从容器复制文件或目录 (容器可以不运行)
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] #提交容器内的修改形成新的镜像
# 查看或修改已停止容器中的文件,方法一:创建新的镜像,使用新镜像运行容器再修改
docker commit <CONTAINER_ID> test_image
docker run -ti --entrypoint=bash test_image
# 查看或修改已停止容器中的文件,方法二:直接修改
直接修改/var/lib/docker/overlay2目录下的文件# 将镜像导出为文件,例如:
docker save busybox > busybox.tar
docker save myimage:latest | gzip > myimage_latest.tar.gz
docker save -o fedora-latest.tar fedora:latest
# 从文件导入镜像:
docker load < busybox.tar.gz
docker load --input fedora.tar# docker compose
#批量启动(-d选项表示后台运行,日志不在控制台输出)
docker compose -f XXXX.yml up -d
#批量停止
docker compose -f XXXX.yml stop
#批量删除
docker compose -f XXXX.yml rm
运行第一个容器
docker run -d -p 80:80 docker/getting-started
# -d表示该容器在后台运行
# -p表示将主机的指定端口映射到容器内(冒号前是主机端口),这样用主机IP和端口就能访问容器内的服务。
该命令会首先在本地找docker/getting-started镜像,本地没有则自动从dockerhub上下载到本地。
运行完成后用docker ps可以看到用docker/getting-started镜像启动的容器,该容器开放80端口,可在浏览器访问:


从dockerhub查找镜像
可以访问https://hub.docker.com/来查找镜像;
也可以通过命令行查找和下载镜像:
docker search centos #查找docker上的centos镜像
docker pull centos #最新的centos镜像,目前是centos8
docker pull centos:7 #下载tag(版本)为7的centos镜像
怎么查看某个镜像有哪些tag?目前没找到命令行方式,只能通过访问dockerhub去看。
制作第一个镜像
docker镜像是分层的,我们可以基于一个基础镜像,加上我们需要的东西形成自己的新镜像。
比如,现在我们有一个nodejs写的demo程序,想分享给其他人,如果直接只是分享源码或可执行文件,其他人还得搭建依赖环境才能运行起来,我们可以把环境和程序都打包成docker镜像,这样只要用这个镜像来启动容器就能够运行这个demo了。下面是镜像制作过程:
git clone https://github.com/docker/getting-started.git #获取源码到主机上(源码在getting-started/app目录)
# 源码结构:
dengrj@dengrjdev:~/docker$ ll getting-started/app/
total 192
drwxrwxr-x 4 dengrj dengrj 4096 5月 22 11:38 ./
drwxrwxr-x 6 dengrj dengrj 4096 5月 22 11:38 ../
-rw-rw-r-- 1 dengrj dengrj 646 5月 22 11:38 package.json
drwxrwxr-x 4 dengrj dengrj 4096 5月 22 11:38 spec/
drwxrwxr-x 5 dengrj dengrj 4096 5月 22 11:38 src/
-rw-rw-r-- 1 dengrj dengrj 174891 5月 22 11:38 yarn.lock
在app目录下创建Dockerfile文件,内容如下:
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
创建好Dockerfile后,在app目录下执行命令来构建镜像:
docker build -t getting-started .
使用该镜像来启动容器:
docker run -dp 3000:3000 getting-started
如果代码修改了,我们需要重新构建镜像,再用新镜像来启动容器
数据持久化
数据如果存放在容器中,如果该容器删除了,数据就删除了,为了使数据和容器分离,通常会给容器挂载存储卷(Volume),docker支持两种存储卷:
- named volume:需先创建卷再挂载,支持驱动插件来挂网络存储(SFTP、Ceph、NFS等),只能指定容器端挂载点;
- bind mounts:可指定主机端和容器端挂载点,无需创建卷,不支持驱动插件
named volume
创建卷:
docker volume create todo-db #todo-db是卷的名称
将卷挂载至容器:
# /etc/todos是容器内的挂载点,容器内程序向/etc/todos写文件就会存在主机的todo-db卷中
docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
bind mounts
无需创建卷,直接通过挂载将主机目录和容器内的目录建立映射关系:
# /etc/todos是容器内的挂载点,/data/app是主机中的挂载点
docker run -dp 3000:3000 -v /data/app:/etc/todos getting-started
容器网络连接
默认情况下,主机上的容器是相互隔离的,他们互相不知道对方的存在,那么如果两个容器之间需要能够进行网络通信,怎么实现?
在docker中,我们可以创建一个网络,那么在该网络内的所有容器都可以互相通信。
#创建一个名称为todo-net的网络
docker network create todo-net
#创建容器时指定网络,--network-alias mysql为该容器起了一个网络别名,
# todo-net网络中的其他容器可以通过mysql来访问mysql的容器,类似于DNS的主机名
docker run -d \--network todo-net --network-alias mysql \-v todo-mysql-data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=secret \-e MYSQL_DATABASE=todos \mysql:5.7
Dockerfile指令
docker在构建镜像时按步骤执行Dockerfile中的指令,每条指令执行完都会形成一层文件系统提交到新的镜像中,就像git中的commit一样。
FROM
Dockerfile必须以FROM指令开头,表示使用哪个父镜像来作为构建的基础。FROM支持三种格式:
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
ENV
ENV指令用于定义容器运行时的环境变量,不过ENV定义的环境变量也是可以在Dockerfile中通过$variable_name 或 ${variable_name}符来引用,${}用于变量和其他参数之间没有空格的情况,例如:${foo}_bar.
${variable:-word}表示:variable已定义则使用定义的值,未定义则使用word;
${variable:+word}表示:variable已定义则使用word,未定义则使用空字符串;
FROM busybox
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar
ADD . $FOO # ADD . /bar
COPY \$FOO /quux # COPY $FOO /quux
注意:在一条指令中,环境变量的代入使用的值只有一个:下面的例子中,def的值会是hello而不是bye,ghi的值则会是bye。
ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc
一行可以设置多个变量:
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \MY_CAT=fluffy
对于只在镜像构建阶段用到的环境变量,不建议使用ENV指令,而可以直接写在指令的参数中,或使用ARG指令,例如:
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
# 或
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y ...
ADD
将构建上下文的文件、目录或从URL获取文件添加到镜像的<dest>路径中。语法格式:
# --chown只对linux平台有效,路径中有空格时用双引号
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
如果<src>为相对路径,相对的是构建上下文,如果<dest>是相对路径,相对的是容器内的WORKDIR;
添加的所有的文件和目录,UID和GID都会设为0,除非使用--chown做了指定。
COPY
将构建上下文的文件、目录添加到镜像的<dest>路径中。语法格式:
# --chown只对linux平台有效,路径中有空格时用双引号
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
RUN
RUN用于在构建镜像时执行命令,支持两种格式
RUN <command> # 命令将在shell中执行
RUN ["executable", "param1", "param2"] # 通过exec调用,这里参数是以JSON array来解析的,所以里面带双引号
CMD
CMD用于指定容器启动时默认执行的程序(用户在docker run参数中指定的程序可覆盖CMD指定的程序),一个Dockerfile中只能有一个CMD指令生效,若有多个则最后一个生效。
CMD指令支持三种格式:
CMD ["executable","param1","param2"] #(官方推荐),通过exec调用,这里参数是以JSON array来解析的,所以里面带双引号
CMD ["param1","param2"] #作为ENTRYPOINT指令的默认参数
CMD command param1 param2 # 通过shell调用
CMD指令和ENTRYPOINT的区别:
ENTRYPOINT指令也可指定容器启动时要执行的命令,并且的ENTRYPOINT优先级最高。CMD和ENTRYPOINT同时出现时,CMD中的参数会被附加到ENTRYPOINT 指令的后面作为参数。 如果这时docker run命令带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。
EXPOSE
告诉Docker这个容器要监听的端口,还可指定使用的协议是tcp还是udp,或者tcp和udp都使用,不指定则默认为tcp。
注意:EXPOSE并不实际暴露接口,它的作用更像是用户手册,只是告诉用户要暴露什么端口,实际暴露的端口是由docker run的-p或-P参数指定的,可以和EXPOSE指定的不一样。
EXPOSE <port> [<port>/<protocol>...]
#监听tcp 80端口
EXPOSE 80/tcp
#监听udp 81端口
EXPOSE 81/udp
# 监听tcp和udp的82端口,则写两条EXPOSE指令
EXPOSE 82/tcp
EXPOSE 82/udp
ENTRYPOINT
用于指定容器启动时的入口程序,格式如下:
ENTRYPOINT ["executable", "param1", "param2"] # 通过exec执行,以JSON array解析,所有带双引号
ENTRYPOINT command param1 param2 # 通过shell来执行
ENTRYPOINT指令也可指定容器启动时要执行的命令,并且的ENTRYPOINT优先级最高。CMD和ENTRYPOINT同时出现时,CMD中的参数会被附加到ENTRYPOINT 指令的后面作为参数。 如果这时docker run命令带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。
VOLUME
VOLUME指令用于指定一个挂载点,容器启动时,该挂载点中的文件会被自动复制到挂载的卷中。
VOLUME ["/data"]
VOLUME /var/log /var/db
USER
用于指定RUN、CMD和ENTRYPOINT指令执行时所用的用户身份。
USER <user>[:<group>]
USER <UID>[:<GID>]
WORKDIR
用于设置RUN, CMD, ENTRYPOINT, COPY 和 ADD指令的工作目录(镜像内的),若工作目录不存在则会自动创建。
WORKDIR /path/to/workdir
WORKDIR在一个dockerfile中可以多次出现,如果使用相对路径,则表示相对前一个工作目录。
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd # 输出/a/b/c
WORKDIR可以引用ENV定义的环境变量,如果引用未定义的变量,则原样输出,例如:
ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd # 输出/path/$DIRNAME
如果没有设置WORKDIR则使用父镜像设置的工作目录,如果父镜像也没有设置,则使用/作为工作目录。为避免工作目录不清晰,建议在dockerfile中显式指定WORKDIR。
ARG
用于定义构建时使用的参数变量:
ARG <name>[=<default value>]
构建镜像时可传参指定变量值:
docker build --build-arg <varname>=<value>
ARG指令的作用域自定义所在行开始,到该stage结束,若要在多个stage中使用变量,那要在各个stage都定义:
FROM busybox
ARG SETTINGS
RUN ./run/setup $SETTINGSFROM busybox
ARG SETTINGS
RUN ./run/other $SETTINGS
预定义的变量
Docker包含以下预定义的变量,这些变量无需在dockerfile使用ARG指令定义就可以使用
HTTP_PROXYhttp_proxyHTTPS_PROXYhttps_proxyFTP_PROXYftp_proxyNO_PROXYno_proxy
ONBUILD
用于指定一个指令,在本镜像作为父镜像时触发,也就是在下游镜像Dockerfile的FROM指令执行时触发
ONBUILD <INSTRUCTION>
STOPSIGNAL
停止容器时给容器发什么信号,默认是SIGTERM
STOPSIGNAL signal
#例如:
STOPSIGNAL SIGKILL
STOPSIGNAL 9
HEALTHCHECK
指定用于检测容器健康状态的命令
HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE # 不开启健康检测
#例如:
HEALTHCHECK --interval=5m --timeout=3s \CMD curl -f http://localhost/ || exit 1
SHELL
SHELL ["executable", "parameters"]
用于指定执行shell命令的默认shell,如果不指定,在Linux下默认值为:["/bin/sh", "-c"]
镜像分享
在线分享
注册DockerHub账号,登录DockerHub创建仓库(Repository):

我本地有一个drjdemo的镜像:

如何push到dockerhub上的dengruijin/demo仓库:
# 先将镜像名称修改为和dockerhub一致
docker tag drjdemo dengruijin/demo
# push前要先登录:(dengruijin是dockerhub登录名)
docker login -u dengruijin
# 下面就可以push了
docker push dengruijin/demo
离线分享
- 将镜像导出为文件
可以使用docker save将镜像保存为一个tar包:
docker save [OPTIONS] IMAGE [IMAGE...]
例如:
docker save busybox > busybox.tar
docker save myimage:latest | gzip > myimage_latest.tar.gz
docker save -o fedora-latest.tar fedora:latest
- 导入镜像:
docker load [OPTIONS]
例如:
docker load < busybox.tar.gz
docker load --input fedora.tar
相关文章:
Docker快速上手及常用命令速查
Docker快速上手 安装 在ubuntu上安装docker: sudo apt-get install docker docker -v #查看版本在centos7上安装docker:(docker在YUM源的Extras仓库中) yum install docker systemctl start dockerdocker常用命令速查 #查看docker信息 docker info #查看本地镜…...
学习笔记:解决拖延
1 解决拖延、减轻压力的关键心态和方法 1.1 要点梳理 拖延是因为自己一直在逃避,重点是要有效突破逃避圈,进入学习圈,扩展成长圈。 毒蛇曲线(见思维导图)中越是临近截止期限,拖延的焦虑越上升࿰…...
第一个Swift程序
要创建第一个Swift项目,请按照以下步骤操作: 打开Xcode。如果您没有安装Xcode,可以在App Store中下载并安装它。在Xcode的欢迎界面上,选择“Create a new Xcode project”(创建新Xcode项目)。在模板选择界面上,选择“App”(应用程序)。在应用模板选择界面上,选择“Si…...
Anthropic Claude 3 加入亚马逊云科技 AI“全家桶”
编辑 | 宋慧 出品 | CSDN AIGC 每天都有新动态发生。最新的消息是亚马逊在 3 月底完成了对 Anthropic 的 40 亿美元投资(也是亚马逊 30 年来最大一笔外部投资),以及 GPT-4 最强对手的 Anthropic Claude 3 已经在亚马逊云科技 Amazon Bedrock…...
学习基于pytorch的VGG图像分类 day3
注:本系列博客在于汇总CSDN的精华帖,类似自用笔记,不做学习交流,方便以后的复习回顾,博文中的引用都注明出处,并点赞收藏原博主. 目录 VGG模型训练 1.导入必要的库 2.主函数部分 2.1使用cpu或gpu 2.2对数据…...
Spring Boot统一功能处理之拦截器
本篇主要介绍Spring Boot的统一功能处理中的拦截器。 目录 一、拦截器的基本使用 二、拦截器实操 三、浅尝源码 初始化DispatcherServerlet 处理请求(doDispatch) 四、适配器模式 一、拦截器的基本使用 在一般的学校或者社区门口,通常会安排几个…...
stm32之基本定时器的使用
在上文我们使用到了HAL库的自带的延时函数,HAL_Delay();我们来看一下函数的原型 __weak void HAL_Delay(uint32_t Delay) {uint32_t tickstart HAL_GetTick();uint32_t wait Delay;/* Add a freq to guarantee minimum wait */…...
单片机为什么还在用C语言编程?
单片机产品的成本是非常敏感的。因此对于单片机开发来说,最重要的是在极其有限的ROM和RAM中实现最多产品的功能。或者反过来说,实现相同的产品功能,所需要的ROM和RAM越小越好,在开始前我有一些资料,是我根据网友给的问…...
IO流的基础详解
文件【1】File类: 封装文件/目录的各种信息,对目录/文件进行操作,但是我们不可以获取到文件/目录中的内容。 【2】引入:IO流: I/O : Input/Output的缩写,用于处理设备之间的数据的传输。 【3】…...
实战攻防 | 记一次项目上的任意文件下载
1、开局 开局一个弱口令,正常来讲我们一般是弱口令或者sql,或者未授权 那么这次运气比较好,直接弱口令进去了 直接访问看看有没有功能点,正常做测试我们一定要先找功能点 发现一个文件上传点,不过老规矩,还…...
熔断之神:探寻Hystrix的秘密与实践指南
引言: 在微服务架构中,服务之间的依赖复杂且难以控制,容灾机制成为确保系统稳定性的重要手段。Hystrix作为Netflix开源的断路器实现,提供了一系列强健的容错功能。 Hystrix的核心概念与作用: Hystrix是一个由Netflix开…...
Web功能测试测试点总结!
web测试就是基于BS架构的软件产品的测试,通俗点来说就是web网站的测试。 一 、界面检查 当我们进入一个页面时,首先应该检查title,页面排版(即页面的展示),而不是马上进入字段校验页面面包屑导航是否正确当前位置是否可见 您的位…...
关于vue3的简单学习
Vue 3 简介 Vue 3 是一个流行的开源Java框架,用于构建用户界面和单页面应用。它带来了许多新特性和改进,包括更好的性能、更小的打包大小、更好的Type支持、全新的组合式 API,以及一些新的内置组件。 一. Vue 3 的新特性 Vue 3引入了许多新…...
windows server 2019 -DNS服务器搭建
前面是有关DNS的相关理论知识,懂了的可以直接跳到第五点。 说明一下:作为服务器ip最好固定下来,以DNS服务器为例子,如果客户机的填写DNS信息的之后,服务器的ip如果变动了的话,客户机都得跟着改,…...
使用 XCTest 进行 iOS UI 自动化测试
使用 XCTest 进行 iOS UI 自动化测试是一种有效的方法,可以帮助你验证应用界面的行为和功能。以下是使用 XCTest 进行 iOS UI 自动化测试的基本步骤: 设置项目: 确保你的 Xcode 项目已经包含了 XCTest 测试目标。在测试目标中创建一个新的测试类…...
【Python】FANUC机器人OPC UA通信并记录数据
目录 引言机器人仿真环境准备代码实现1. 导入库2. 设置参数3. 日志配置4. OPC UA通信5. 备份旧CSV文件6. 主函数 总结 引言 OPC UA(Open Platform Communications Unified Architecture)是一种跨平台的、开放的数据交换标准,常用于工业自动化…...
Linux 中断处理
一、基本概念 1、中断及中断上下文 中断是一种由硬件设备产生的信号,不同设备产生的中断通过中断号来区分。CPU在接收到中断信号后,根据中断号执行对应的中断处理程序(Interrupt Service Routine) 内核对异常和中断的处理类似&a…...
人大金昌netcore适配,调用oracle模式下存储过程\包,返回参数游标
using KdbndpConnection conn new KdbndpConnection("Host192.168.133.221;Port54321;Databasedb1;Poolingtrue;User IDsystem;Password123");conn.Open();//存储过程调用也是类似using var cmd conn.CreateCommand();cmd.CommandText "模式.包名称.存储过程…...
pandas常用的一些操作
EXCLE操作 读取Excel data1 pd.read_excel(excle_dir) 读Excel取跳过前几行: data1 pd.read_excel(excle_dir,skiprows1) 获取总行数 data1.shape[0] 获取总列数 data1.shape[1] 指定某列数据类型 data1 pd.read_excel("C:数据导入.xlsx",dtype…...
【鸿蒙开发】系统组件Row
Row组件 Row沿水平方向布局容器 接口: Row(value?:{space?: number | string }) 参数: 参数名 参数类型 必填 参数描述 space string | number 否 横向布局元素间距。 从API version 9开始,space为负数或者justifyContent设置为…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

