Docker 一篇到位

目录

01. Docker使用导航

02. Build Share Run 样例 

03. 理解容器

04. 安装 Docker

05. Docker 样例(常见命令使用)

下载镜像

启动容器

修改页面

保存镜像

docker commit

docker save

docker load

分享社区

docker login

docker tag

docker push

来到 web 主页查看推送

06. Docker 存储

目录挂载

卷映射

docker volume ls 

docker volume create 数据卷名

docker volume inspect 数据卷名

07. Docker 网络

ip -a 就可以看到docker的默认网络

docker [container] inspect app1 查看app1这个容器的细节

自定义docker网络

08. Redis 主从同步集群

run master

run slave

09. Docker Compose 批量管理容器

样例

以前的做法

现在的做法

测试 Docker Compose 常用功能

docker compose up p-d

docker compose down

down 同时移除 镜像 和 数据卷

10. Dockerfile 构建自定义镜像

基本知识

Dockerfile 常见指令

构建自定义镜像

11. Dockerfile 镜像分层机制

举例

可以用 docker image history 镜像名 查看历史信息

也可以用 docker image inspect 镜像名 查看 Layers(层级信息) 

镜像和容器的关系

docker ps -s

12. 安装常见中间件

yaml

启动

13. 常见中间件访问测试

14. 总结图


博主wx:yuanlai45_csdn 博主qq:2777137742

后期会创建粉丝群,为同学们提供分享交流平台以及提供官方发送的福利奖品~

01. Docker使用导航

hub.docker.com

port # 查看映射端口对应的容器内部源端口
pause # 暂停容器
ps # 猎户容器列表
pull # 从docker镜像源服务器拉取指定镜像或者库镜像
push # 推送指定镜像或者库镜像至docker源服务器
restart # 重启运行的容器
rm # 移除一个或多个容器
rmi # 移除一个或多个镜像 (无容器使用该镜像才可删除,否则需要删除相关容器才可继续或 -f 强制删除)
run # 创建一个新的容器并运行一个命令
save # 保存一个镜像为一个 tar 包【对应 load】
search # 在 docker hub 中搜索镜像
start # 启动容器
stop # 停止容器
tag # 给源中镜像打标签
top # 查看容器中运行的进程信息
unpause # 取消暂停容器
version # 查看 docker版本号
wait # 截取容器停止时的退出状态值

02. Build Share Run 样例 

03. 理解容器

04. 安装 Docker

上面的不用执行官网的,换一下:

也是按下面的整,顺便配置国内的 docker hub 镜像源地址

05. Docker 样例(常见命令使用)

下载镜像

下载特定版本的镜像的话推荐去网站搜索:

启动容器

docker ps -a 就可以查看已经停了的容器信息

docker run -d(后台启动) --name(给启动的容器一个名字不然是随机) mynginx nginx

但是还是无法公网访问(业因为启动的容器是运行在自己的环境内),解决(端口映射):

PS:88不可以重复(公网的),80可以(每个小容器的)

修改页面

需要用到 docker exec 进入到 ngin 的那个容器里面,在那个容器里面有一个文件路径:

/user/share/nginx/html

nginx的默认页就在那里面存着的(nginx的文档告诉的)

命令:

docker exec -it(交互模式) mynginx /bin/bash(使用bash控制台模式交互)

但是容器为了保持他的轻量级,容器纯净到 vi 都没有,所以想要修改页面只能:

但是这样太麻烦了,后面会讲一个简单的事情,就是 docker 的存储去把内部的一个文件夹,直接映射到我们外部主机的一个位置,以后直接在我们主机位置改,内部也会发生变(数据卷)        

保存镜像

docker commit

可以把整个容器以及他的变化打包成一个新的镜像

docker save

把这个文件保存为一个tar包

docker load

加载完了就可以 docker run 运行了

分享社区

分析到官方的 docker hub 仓库

先登录到 docker hub 网站,然后按照要求起一个名字,然后推送上去

docker login

docker tag

就是新做(copy && rename)了一个镜像,为了上传到 docker hub

docker hub 为了区分,每一个镜像名都是用户名加上镜像名

虽然镜像名不一样但是镜像id是一样的说明还是同一个镜像

docker push

来到 web 主页查看推送

06. Docker 存储

对于运行的容器,如果运行期间崩溃,那么我们如果删掉整个容器重新运行的话,之前的数据就会丢失,而且平时修改也十分不方便,但是为了解决这种情况,就有了 容器挂载,就相当于在外面插了一个U盘,修改容器内的数据或者外面的数据都是双方同步且可见的,同时起到了保存数据的作用

目录挂载

启动命令

/app/nghtml 就是外部linux主机的目录对应容器的/usr/share/nginx/html 外部linux没有的话还会自动创建这个目录(挂载目录和文件都是可以的,但是要对应)

如果这个时候容器崩溃我们把容器删除之后,重新用相同的命令启动,结果依旧和之前是一样的,就是可以说,我们把配置保存到了linux服务器上面,避免了数据丢失

卷映射

但是对于上面的目录挂载,有些情况是不满足需求的,比如我们现在执行一个nginx容器,我们想要很方便修改他的/etc/nginx配置文件,想到的办法可能是在用 目录挂载 的方式在外部进行挂载,但是如果这样做,外面的目录是默认为空目录,再去执行容器就会报错(配置文件数据丢失)

所以我们现在需要的是,在容器启动的时候,外部挂载容器内目录的同时,同时同步数据,那么就要用到我们的 数据卷

目录挂载和卷映射写法差不多,区别就是目录挂载是以 ./ 或者 / 开头,而卷映射是直接创建了一个 卷名 为某某的 数据卷,而且 docker 会自动为他创建一个存储位置(docker统一放到了 /var/lib/docker/volume/<volume-name>),去把容器内部的内容在容器初始启动的时候就保持同步(目录挂载是 外面->(映射)里面 数据卷是 里面->(映射)外面)

docker volume ls 

docker volume create 数据卷名

docker volume inspect 数据卷名

07. Docker 网络

掌握 docker 网络机制,可以轻松构建集群

先举一个样例,现在有两个容器启动了,如何让这两个容器进行数据交互呢?

curl http://ip:port 去访问,但是这样访问有一点奇怪

奇怪的原因就是 app1 是通过外部机器的 ip 加上 app2 在这个机器提供的端口进行访问的,也就是说app1访问app2会先跳出这个容器,通过外界的网络来到这个机器,再通过这个机器来到app2的端口再访问内部的数据,这样确实奇怪(明明很近但是绕了远路)

docker考虑到了这个,他有一个机制,就是每一个应用启动的时候,都会加入一个docker的默认网络,叫 docker0 ,在安装docker的时候就有了这个网络:

ip -a 就可以看到docker的默认网络

然后docker每启动的一个应用都相当于添加了docker0这个网络环境,而且每个应用docker都会为他再分配ip

docker [container] inspect app1 查看app1这个容器的细节

也就是说这些容器再在内部就有一个默认网络,内部之间大家用容器的ip就可以互相访问

bash:

docker exec -it app1 bash

curl http://172.17.0.3:80 (这里就要注意了,虽然app2对外提供的是99端口,但是我们这次并不是通过外部提供的端口访问的,而是直接用容器内部的应用端口就可以直接访问了)(这里就是app1通过容器内app2的ip地址加上他的应用端口就直接访问到了app2)

自定义docker网络

但是这种通过容器ip访问也有缺点,比如容器迁移或者删了,重启等,我们希望有一个稳定的访问方式去访问,那就是用 域名 去访问,docker就提供了自定义网络的机制,默认docker0不支持主机域名的方式去访问的,需要我们创建一个自定义网络,比如 mynet,以后让启动的容器加入到这个自定义网络,接下来容器的名字就可以当作主机的域名,作为一个稳定的访问地址

然后我们再启动两个容器

然后现在容器内部网络访问我们就可以直接域名加上容器应用端口访问了

08. Redis 主从同步集群

我们使用 docker 启动一个 redis 的主从同步集群,redis 是一个存储 kv 的数据库,在开发期间通常用来做缓存

我们现在有两个 redis ,一个主redis master,一个从redis slave,slave需要去同步master的数据,然后我们来实现读写分离,写请求教给master主机,所有的读请求,都交给slave从机

实现这样的效果我们就需要先把两个容器放到同一个网络mynet,第一个容器启用占用6379端口,外部提供6379,第二个启用6379端口,占用外部的6380,为了数据不丢失,还可以把保存redis数据的的目录/bitnami/redis/data挂载到机器外面/app/rd1,两个都保存,然后做一些参数设置,才可以让redis2同步redis1的数据,因为默认启动的两个redis实例是独立的

主机和从机的配置

通过这样的设置从机就知道主机的位置以及端口和密码,以后主机有什么样的数据变化,从机就能跟他同步上,这些参数设置项,并不是redis官方提供的设置项,我们是使用的redis镜像不是官方镜像,而是bitnami提供的镜像

他提供的redis镜像,所有的配置不用修改配置文件只要定义一些环境变量就可以了

run master

如果启动失败可能是linux下/app/rd1文件权限问题,chmod改一下

run slave

09. Docker Compose 批量管理容器

Docker Compose 是 docker 批量管理容器的工具

如何使用:首先需要准备一个 .yaml 文件,然后把所有要启动容器的配置都写到这个里面,就可以用 docker compose 命令将这个文件中指定的所有容器全部批量的启动停止或者删除,比如:

上线:第一次上线并启动

下线:移除之前创建的容器以及相关的资源

启动:之前已经上线过了,但是停了又重新运行

也就是说有了compose.yaml 这个文件以后,docker compose 命令就可以根据这个文件批量管理这些容器

样例

我们来启动一个 wordpress 一个开源的博客系统,所有的博客内容会存到 mysql 数据库里面

以前的做法

先创建一个blog网络 docker network create blog

然后启动两个容器

但是如果是这样做,假设要在一台新的机器去安装 wordpress,要一次安装这两个

还要记住以前的 docker run 命令,去来运行会比较麻烦,所以我们直接编写 compose.yaml 文件,在这个文件里面一次性把要启动的所有应用全部写好,在本机使用 docker compose 命令一键启动,就算我们要迁移机器,只需要把 compose.yaml 文件交给对方,对方也可以使用 docker compose 一键启动

现在的做法

具体 compose.yaml 文件的语法可以参考:hrrps://docs.docker.com/compose/compose-file

注意如果是用到了数据卷,就需要在顶级元素 volumes 声明一下

测试 Docker Compose 常用功能

比如修改了 compose.yaml 文件

docker compose up p-d

-f 是指定的文件

docker compose down

down 会移除我们启动的所有容器以及网络,但是为了安全不会移除我们之前的数据卷,这样我们在下次重新启动的时候数据也不会丢失

down 同时移除 镜像 和 数据卷

10. Dockerfile 构建自定义镜像

可以把自己的软件制作一个镜像

基本知识

比如我现在用 java 编写了一个应用,并把它打包成 app.jar,想要把这个java包制作成一个镜像,分享给别的机器快速启动。此时就需要编写一个 Dockerfile,在 Dockerfile 里面编写制作镜像的指令,让然后 docker 的 Build 构建器,就会根据 Dockerfile 里面制作镜像的指令,拿着这个软件包,制作成一个镜像,而这个镜像就最起码包含这个软件包运行的基础环境,比如Ubuntu什么系统,比如什么样的java环境,其次镜像里面要包含软件包和这个软件包的启动命令

Dockerfile 常见指令

详细可见:https://docs.docker.com/reference/dockerfile/

FORM:直接下载需要的系统或者java环境

COPY app.jar /app.jar:把dockerfile同目录下的 app.jar 放到镜像的 分目录下的app.jar文件里面,至此软件包就放到了镜像的系统里面(大家要把一个镜像就当作一个新的操作系统一样)

ENTRYPOINT:去指定镜像的启动命令

构建自定义镜像

然后执行:

docker build -f Dockerfile -t myjavaapp:v1.0 .

-f 就是 --file 哪个文件,-t 就是 --tag 构建镜像的镜像名是什么,最后还跟了一个 . ,这个 . 就是 ./,代表我们构建的整个上下文目录就是当前目录,这个目录层级非常重要,因为当前目录下就有一个 app.jar,所以上面的 build 命令才会运行成功

然后我们就可以去用这个镜像去启动一个容器

11. Dockerfile 镜像分层机制

Docker 在底层存储一个镜像是分层存储的,而这些层产生于编写的 dockerfile 文件,当构建器 Build 利用这些dockerfile文件帮你构建一个镜像的时候,因为文件里面编写了非常多的指令,每行指令都可能下载或者更改文件系统的一些东西,所以每一行指令就会产生一个存储层,这个指令引起的内容变化就存到他这一层里面,这样做的好处就可以减轻存储压力

举例

当两个应用依赖有相同的资源时,就可以只需要一份,这就是分层存储的好处,可以共用相同的底层,只需要存储自己增量的部分

对于之前只更改的首页,看着是这两个镜像各占188M,其实是总共占188M+几kb,因为只要html那里改变

可以用 docker image history 镜像名 查看历史信息

也可以用 docker image inspect 镜像名 查看 Layers(层级信息) 

只多了这一层,这一层就是我们修改的页面,其他的都是一样的也就是说是共用的

镜像和容器的关系

假设我们要启动一个容器,这个容器是基于某个镜像的,而这个镜像在整个磁盘里面已经存储了,整个镜像存储的内容我们称为镜像层,这层是R/O只读的,而如果我们的容器按照这个镜像启动了,容器要对这个镜像里面的内容有所修改,容器要单独开一层存储,这一层是R/W可读可写层,容器将所有的修改都放到这一层里面,这样就会导致一个效果,为什么容器删掉数据就丢了,因为容器把所有的数据都写到了自己层,容器一删,读写层就丢了,但是镜像只要不删,他的基础数据还在磁盘里面

如果是一个镜像启动了多个容器,那么每一个容器都有自己的存储层互不相干,这也是容器隔离机制的一种,同样容器删了他的读写层也就删了,这就是为什么我们在容器启动期间修改的数据推荐挂载到外面,这样容器删掉以后外面的数据依旧还在,数据就不会丢失

docker ps -s

这个前面的 kb 那个就是这个容器自己的读写层,只占了这么一点kb,如果写入操作增加这个就会增加,后面的是说他的镜像占了多少MB,在磁盘里面存着

12. 安装常见中间件

一个 compose.yaml 一键启动

这个脚本和指令集是用于修改Linux系统的内存管理配置,以达到优化性能的目的

#Disable memory paging and swapping performance
sudo swapoff -a# Edit the sysctl config file
sudo vi /etc/sysctl.conf# Add a line to define the desired value
# or change the value if the key exists,
# and then save your changes.
vm.max_map_count=262144# Reload the kernel parameters using sysctl
sudo sysctl -p# Verify that the change was applied by checking the value
cat /proc/sys/vm/max_map_count

yaml

注意:

  • 将下面文件中 kafka119.45.147.122 改为你自己的服务器IP。
  • 所有容器都做了时间同步,这样容器的时间和linux主机的时间就一致了

准备一个 compose.yaml文件,内容如下:

name: devsoft
services:redis:image: bitnami/redis:latestrestart: alwayscontainer_name: redisenvironment:- REDIS_PASSWORD=123456ports:- '6379:6379'volumes:- redis-data:/bitnami/redis/data- redis-conf:/opt/bitnami/redis/mounted-etc- /etc/localtime:/etc/localtime:romysql:image: mysql:8.0.31restart: alwayscontainer_name: mysqlenvironment:- MYSQL_ROOT_PASSWORD=123456ports:- '3306:3306'- '33060:33060'volumes:- mysql-conf:/etc/mysql/conf.d- mysql-data:/var/lib/mysql- /etc/localtime:/etc/localtime:rorabbit:image: rabbitmq:3-managementrestart: alwayscontainer_name: rabbitmqports:- "5672:5672"- "15672:15672"environment:- RABBITMQ_DEFAULT_USER=rabbit- RABBITMQ_DEFAULT_PASS=rabbit- RABBITMQ_DEFAULT_VHOST=devvolumes:- rabbit-data:/var/lib/rabbitmq- rabbit-app:/etc/rabbitmq- /etc/localtime:/etc/localtime:roopensearch-node1:image: opensearchproject/opensearch:2.13.0container_name: opensearch-node1environment:- cluster.name=opensearch-cluster # Name the cluster- node.name=opensearch-node1 # Name the node that will run in this container- discovery.seed_hosts=opensearch-node1,opensearch-node2 # Nodes to look for when discovering the cluster- cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 # Nodes eligibile to serve as cluster manager- bootstrap.memory_lock=true # Disable JVM heap memory swapping- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # Set min and max JVM heap sizes to at least 50% of system RAM- "DISABLE_INSTALL_DEMO_CONFIG=true" # Prevents execution of bundled demo script which installs demo certificates and security configurations to OpenSearch- "DISABLE_SECURITY_PLUGIN=true" # Disables Security pluginulimits:memlock:soft: -1 # Set memlock to unlimited (no soft or hard limit)hard: -1nofile:soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536hard: 65536volumes:- opensearch-data1:/usr/share/opensearch/data # Creates volume called opensearch-data1 and mounts it to the container- /etc/localtime:/etc/localtime:roports:- 9200:9200 # REST API- 9600:9600 # Performance Analyzeropensearch-node2:image: opensearchproject/opensearch:2.13.0container_name: opensearch-node2environment:- cluster.name=opensearch-cluster # Name the cluster- node.name=opensearch-node2 # Name the node that will run in this container- discovery.seed_hosts=opensearch-node1,opensearch-node2 # Nodes to look for when discovering the cluster- cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 # Nodes eligibile to serve as cluster manager- bootstrap.memory_lock=true # Disable JVM heap memory swapping- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # Set min and max JVM heap sizes to at least 50% of system RAM- "DISABLE_INSTALL_DEMO_CONFIG=true" # Prevents execution of bundled demo script which installs demo certificates and security configurations to OpenSearch- "DISABLE_SECURITY_PLUGIN=true" # Disables Security pluginulimits:memlock:soft: -1 # Set memlock to unlimited (no soft or hard limit)hard: -1nofile:soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536hard: 65536volumes:- /etc/localtime:/etc/localtime:ro- opensearch-data2:/usr/share/opensearch/data # Creates volume called opensearch-data2 and mounts it to the containeropensearch-dashboards:image: opensearchproject/opensearch-dashboards:2.13.0container_name: opensearch-dashboardsports:- 5601:5601 # Map host port 5601 to container port 5601expose:- "5601" # Expose port 5601 for web access to OpenSearch Dashboardsenvironment:- 'OPENSEARCH_HOSTS=["http://opensearch-node1:9200","http://opensearch-node2:9200"]'- "DISABLE_SECURITY_DASHBOARDS_PLUGIN=true" # disables security dashboards plugin in OpenSearch Dashboardsvolumes:- /etc/localtime:/etc/localtime:rozookeeper:image: bitnami/zookeeper:3.9container_name: zookeeperrestart: alwaysports:- "2181:2181"volumes:- "zookeeper_data:/bitnami"- /etc/localtime:/etc/localtime:roenvironment:- ALLOW_ANONYMOUS_LOGIN=yeskafka:image: 'bitnami/kafka:3.4'container_name: kafkarestart: alwayshostname: kafkaports:- '9092:9092'- '9094:9094'environment:- KAFKA_CFG_NODE_ID=0- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9094- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://119.45.147.122:9094- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- ALLOW_PLAINTEXT_LISTENER=yes- "KAFKA_HEAP_OPTS=-Xmx512m -Xms512m"volumes:- kafka-conf:/bitnami/kafka/config- kafka-data:/bitnami/kafka/data- /etc/localtime:/etc/localtime:rokafka-ui:container_name: kafka-uiimage: provectuslabs/kafka-ui:latestrestart: alwaysports:- 8080:8080environment:DYNAMIC_CONFIG_ENABLED: trueKAFKA_CLUSTERS_0_NAME: kafka-devKAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092volumes:- kafkaui-app:/etc/kafkaui- /etc/localtime:/etc/localtime:ronacos:image: nacos/nacos-server:v2.3.1container_name: nacosports:- 8848:8848- 9848:9848environment:- PREFER_HOST_MODE=hostname- MODE=standalone- JVM_XMX=512m- JVM_XMS=512m- SPRING_DATASOURCE_PLATFORM=mysql- MYSQL_SERVICE_HOST=nacos-mysql- MYSQL_SERVICE_DB_NAME=nacos_devtest- MYSQL_SERVICE_PORT=3306- MYSQL_SERVICE_USER=nacos- MYSQL_SERVICE_PASSWORD=nacos- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true- NACOS_AUTH_IDENTITY_KEY=2222- NACOS_AUTH_IDENTITY_VALUE=2xxx- NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789- NACOS_AUTH_ENABLE=truevolumes:- /app/nacos/standalone-logs/:/home/nacos/logs- /etc/localtime:/etc/localtime:rodepends_on:nacos-mysql:condition: service_healthynacos-mysql:container_name: nacos-mysqlbuild:context: .dockerfile_inline: |FROM mysql:8.0.31ADD https://raw.githubusercontent.com/alibaba/nacos/2.3.2/distribution/conf/mysql-schema.sql /docker-entrypoint-initdb.d/nacos-mysql.sqlRUN chown -R mysql:mysql /docker-entrypoint-initdb.d/nacos-mysql.sqlEXPOSE 3306CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]image: nacos/mysql:8.0.30environment:- MYSQL_ROOT_PASSWORD=root- MYSQL_DATABASE=nacos_devtest- MYSQL_USER=nacos- MYSQL_PASSWORD=nacos- LANG=C.UTF-8volumes:- nacos-mysqldata:/var/lib/mysql- /etc/localtime:/etc/localtime:roports:- "13306:3306"healthcheck:test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]interval: 5stimeout: 10sretries: 10prometheus:image: prom/prometheus:v2.52.0container_name: prometheusrestart: alwaysports:- 9090:9090volumes:- prometheus-data:/prometheus- prometheus-conf:/etc/prometheus- /etc/localtime:/etc/localtime:rografana:image: grafana/grafana:10.4.2container_name: grafanarestart: alwaysports:- 3000:3000volumes:- grafana-data:/var/lib/grafana- /etc/localtime:/etc/localtime:rovolumes:redis-data:redis-conf:mysql-conf:mysql-data:rabbit-data:rabbit-app:opensearch-data1:opensearch-data2:nacos-mysqldata:zookeeper_data:kafka-conf:kafka-data:kafkaui-app:prometheus-data:prometheus-conf:grafana-data:

启动

# 在 compose.yaml 文件所在的目录下执行
docker compose up -d
# 等待启动所有容器
#不用 -f 告诉他文件名,因为默认会执行 compose.yaml

tip:如果重启了服务器,可能有些容器会启动失败。再执行一遍 docker compose up -d即可。所有程序都可运行成功,并且不会丢失数据。请放心使用

13. 常见中间件访问测试

  • zookeeper可视化工具下载:https://github.com/vran-dev/PrettyZoo/releases/download/v2.1.1/prettyZoo-win.zip
  • redis可视化工具下载:https://github.com/qishibo/AnotherRedisDesktopManager/releases/download/v1.6.4/Another-Redis-Desktop-Manager.1.6.4.exe

组件(容器名)

介绍

访问地址

账号/密码

特性

Redis(redis)

k-v 库

你的ip:6379

单密码模式:123456

已开启AOF(持久化机制)

MySQL(mysql)

数据库

你的ip:3306

root/123456

默认utf8mb4字符集

Rabbit(rabbit)

消息队列

你的ip:15672

rabbit/rabbit

暴露5672和15672端口

OpenSearch(opensearch-node1/2)

检索引擎

你的ip:9200

内存512mb;两个节点

opensearch-dashboards

search可视化

你的ip:5601

Zookeeper(zookeeper)

分布式协调

你的ip:2181

允许匿名登录

kafka(kafka)

消息队列

你的ip:9092
外部访问:9094

占用内存512mb

kafka-ui(kafka-ui)

kafka可视化

你的ip:8080

nacos(nacos)

注册/配置中心

你的ip:8848

nacos/nacos

持久化数据到MySQL

nacos-mysql(nacos-mysql)

nacos配套数据库

你的ip:13306

root/root

prometheus(prometheus)

时序数据库

你的ip:9090

grafana(grafana)

你的ip:3000

admin/admin

14. 总结图

创作不易,希望读者三连支持 💖
赠人玫瑰,手有余香 💖

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

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

相关文章

MySQL 9.0 发布了!

从昨晚开始&#xff0c;在DBA群里大家就在讨论MySQL 9.0发布的事情&#xff0c;但是Release Note和官方文档都没有更新&#xff0c;所以今天早上一上班就赶紧瞅了下具体更新了哪些内容&#xff1f; 整体看来&#xff0c;基本没什么创新。下面是9.0新增或废弃的一些特性。 &…

【Qt知识】Geometry属性

一、走进Geometry的世界 Geometry属性是Qt框架中用于处理和操作几何形状的一系列类的集合。它包括了QPoint、QPointF、QSize、QSizeF、QRect和QRectF等。这些类分别代表点、大小、矩形等基本几何概念&#xff0c;它们的存在让图形界面的创建变得既简单又直观。 位置和尺寸。 其…

如何获取音频伴奏

如何获取音频伴奏 在今天的互联网上,有许多好听的音乐.面对这些音乐,我们有时需要伴奏音频,许多音频在网站上可以查找到,但有些不行,今天,我们要通过audacity软件截取音频伴奏. 下载audacity软件 audacity-64.exe 访问密码&#xff1a;8221 或官方网站(访问较慢) 选择简体…

Modbus TCP与TCP/IP协议间的差异与应用场景

Modbus TCP概述 Modbus协议简介 Modbus是一种专为工业自动化系统设计的通信协议&#xff0c;采用主从模式&#xff0c;即一个主设备&#xff08;通常是计算机或可编程逻辑控制器&#xff09;与多个从设备&#xff08;如传感器、执行器等&#xff09;进行通信。Modbus协议具有…

(漏洞检查项) | 任意文件包含漏洞 file-include

(漏洞检查项)|任意文件包含漏洞 file-include 漏洞场景 1.含有动态包含语句 2.有类似于文件读取的url 漏洞描述 攻击者可以利用任意文件包含漏洞&#xff0c;读取任意文件&#xff0c;对服务器造成危害。 程序开发人员为了代码的灵活性&#xff0c;常常会将包含文件的路径…

Spring Cloud Circuit Breaker基础入门与服务熔断

官网地址&#xff1a;https://spring.io/projects/spring-cloud-circuitbreaker#overview 本文SpringCloud版本为&#xff1a; <spring.boot.version>3.1.7</spring.boot.version> <spring.cloud.version>2022.0.4</spring.cloud.version>【1】Circu…

KVM性能优化之CPU优化

1、查看kvm虚拟机vCPU的QEMU线程 ps -eLo ruser,pid,ppid,lwp,psr,args |awk /^qemu/{print $1,$2,$3,$4,$5,$6,$8} 注:vcpu是不同的线程&#xff0c;而不同的线程是跑在不同的cpu上&#xff0c;一般情况&#xff0c;虚拟机在运行时自身会点用3个cpus&#xff0c;为保证生产环…

TensorRT学习(二)TensorRT使用教程(Python版)

本文适合快速了解TensorRT使用的整体流程,具体细节还是建议参考TensorRT的官方文档。 加速原理: 加速原理比较复杂,它将会根据显卡来优化算子,以起到加速作用(如下图所示)。简单的来说,就是类似于你出一个公式1+1+1,而你的显卡支持乘法,直接给你把这个公式优化成了1*…

windows远程连接无法复制文件

windows远程桌面无法复制文件 解决方案 打开任务管理器管理器,在详细信息界面,找到rdpclip.exe进程&#xff0c;选中并点击结束任务&#xff0c;杀死该进程。 快捷键 win r 打开运行界面&#xff0c;输入 rdpclip.exe &#xff0c;点击确定运行。即可解决无法复制文件问题。…

prescan软件中导入路径文件txt/lpx

由于博主收到的是lpx格式的路径文件&#xff0c;因此&#xff0c;第一步 1.记事本打开 ctrla 全选 ctrlc 复制 2.新建一个excel 鼠标定位到第一行第一列的格子 ctrlv 复制 3.数据栏“分列”功能 4. (0.1递增的数列&#xff0c;纬度&#xff0c;经度&#xff0c;高程) 导入…

简单爬虫案例——爬取快手视频

网址&#xff1a;aHR0cHM6Ly93d3cua3VhaXNob3UuY29tL3NlYXJjaC92aWRlbz9zZWFyY2hLZXk9JUU2JThCJTg5JUU5JTlEJUEy 找到视频接口&#xff1a; 视频链接在photourl中 完整代码&#xff1a; import requestsimport re url https://www.kuaishou.com/graphql cookies {did: web_…

解决VSCode无法用ssh连接远程服务器的问题

原因&#xff1a; 因为windows自带的ssh无法连接远程服务器&#xff0c;需要用git底下的ssh.exe。 搜了很久&#xff0c;试过很多方法&#xff0c;包括替换掉环境变量中的ssh&#xff0c;但是都无效&#xff0c;最后发现是要在VSCode中配置需要使用哪个ssh.exe。 步骤&#…

深入分析 Android BroadcastReceiver (七)

文章目录 深入分析 Android BroadcastReceiver (七)1. 高级应用场景1.1 示例&#xff1a;动态权限请求1.2 示例&#xff1a;应用内通知更新 2. 安全性与性能优化2.1 示例&#xff1a;设置权限防止广播攻击2.2 示例&#xff1a;使用 LocalBroadcastManager2.3 示例&#xff1a;在…

【博主推荐】HTML5实现简洁好看的个人简历网页模板源码

文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 工作经验界面1.4 学习教育界面1.5 个人技能界面1.6 专业特长界面1.7 朋友评价界面1.8 获奖情况界面1.9 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c…

食品行业的安全护照:企业发展不可或缺的认证导航

在全球化的食品市场中&#xff0c;安全、质量和环境保护是企业通往成功的三大支柱。对消费者而言&#xff0c;这些因素是选择产品的核心考量&#xff1b;对企业来说&#xff0c;则是赢得市场和信任的基石。从农田到餐桌&#xff0c;食品的每一次加工和转换都承载着对健康和环境…

20240703 每日AI必读资讯

&#x1f916;爆火Character AI惨遭阉割 美国00后集体“失恋” - Character AI曾是00后最火爆的社交软件&#xff0c;但用户发现对话模型变得冷淡&#xff0c;失去趣味。 - 用户流失严重&#xff0c;面临成本高、竞争激烈的挑战&#xff0c;甚至遭到挖角。 - 尽管困难重重&a…

RabbitMQ进阶篇

文章目录 发送者的可靠性生产者重试机制实现生产者确认 MQ的可靠性数据持久化交换机持久化队列持久化消息持久化 Lazy Queue(可配置~)控制台配置Lazy模式代码配置Lazy模式更新已有队列为lazy模式 消费者的可靠性消费者确认机制失败重试机制失败处理策略 业务幂等性唯一消息ID业…

springboot数字化医院产科系统源码

目录 一、系统概述 二、开发环境 三、功能设计 四、功能介绍 一、系统概述 数字化产科是为医院产科量身定制的信息管理系统。它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。该系统由门诊系统、住院系统、数据统计模块三部分组成&#xff0c;与医院HIS、LI…

智能版面设计:指令跟随模型在自动布局规划中的应用

在广告行业一个吸引人的视觉布局能够显著提升信息的传播效果。但对于非专业设计师来说&#xff0c;创建既美观又功能性强的布局常常是一项挑战。他们往往缺乏必要的设计技能、审美训练或资源来快速实现创意构想。传统的设计软件和在线工具虽然提供了一些模板和指导&#xff0c;…

让 SwiftUI 原生 TabView 支持标签页切换转场动画

功能需求 何曾几时,秃头码农们多么希望 SwiftUI 里原生 TabView 的标签页切换能够有转场动画效果。 如上图所示,我们在 SwiftUI 原生 TabView 视图的标签页切换时展现出美美哒的转场动画,本实现支持最新的 iPadOS 18 和 iOS 18 系统。这是怎么做到的呢? 在本篇博文中,您…