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.mzph.cn/pingmian/39358.shtml

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

相关文章

数字化转型过程中企业会遇到哪些挑战?该如何应对?

你是否与我一样&#xff0c;也曾有过类似的疑惑&#xff1a; 企业数字化转型过程中会遇到哪些挑战&#xff1f;其中苦难&#xff0c;我们又该如何应对&#xff1f;有什么可借鉴的方法&#xff1f; 有了这些疑问&#xff0c;你肯定想知道答案。 为了解决你的心头之患&#xf…

rocketmq实现多数据源配置

rocketmq实现多数据源配置 背景&#xff1a;一 添加ExtRocketMQTemplateConfiguration配置类二 添加非标mq的配置参数三 非标准RocketMQTemplate 背景&#xff1a; 在实际项目中我们可能会遇到在springboot项目中使用多个mq数据源&#xff0c;那我们该如何配置呢&#xff1f; …

基于若依(ruoyi-vue)的周报管理系统

喂wangyinlon 填报人页面 审批人 审批不通过,填报人需要重新填写.

自动编码器简单理解及简单使用描述

1. 什么是自动编码器&#xff1f; 自动编码器分为编码器和解码器&#xff0c;其中解码器只在训练阶段用到。具体过程就是&#xff1a; 首先&#xff0c;输入训练样本&#xff0c;编码器对输入样本进行编码&#xff0c;对其进行降维&#xff0c;直到到达某个瓶颈层&#xff1b…

2024年江西省研究生数学建模竞赛B题投标中的竞争策略问题论文和代码分析

2024年江西省研究生数学建模竞赛B题投标中的竞争策略问题论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建…

oracle体系结构详解(实例+数据文件)

提示&#xff1a;主要总结oracle数据库&#xff1a;物理结构&#xff0c;逻辑结构&#xff0c;内存结构以及oracle进程 文章目录 Oracle服务器由&#xff08;实例和数据库文件组成&#xff09;1、实例2、数据文件1.oracle物理体系结构2.oracle数据库逻辑结构3oracle数据库内存结…

如何通过指纹浏览器使用代理IP?

1.指纹浏览器定义 指纹浏览器是 一种浏览器技术&#xff0c;它根据用户设备的硬件、软件和配置等特征生成唯一标识符&#xff08;称为“指纹”&#xff09;。此指纹用于识别和追踪用户身份&#xff0c;即使用户更改其 IP 地址或清除浏览器数据&#xff08;如缓存和 Cookie&…

AI生成商品图软件哪个好用

&#x1f31f; AI生成商品图软件哪个好用 —— 触站AI&#x1f680; &#x1f3a8;在AI技术的浪潮中&#xff0c;触站AI以其专业和创新&#xff0c;成为广州AI设计服务的领军企业。 专注于企业AI图像领域的技术解决方案&#xff0c;触站AI提供包括AI绘画模型训练、AI绘图模型定…

HBM是什么?因AI而崛起,它有哪些优势?

南韩存储大厂SK海力士宣布&#xff0c;将与台积电公司密切合作&#xff0c;联手生产下一代HBM——即预计在2026年投产的第六代HBM产品HBM4&#xff0c;双方并于近期签署合作备忘录&#xff08;MOU&#xff09;。 SK海力士以往的HBM产品&#xff0c;包括HBM3E&#xff08;第五代…

python本学期所有代码!

第一单元 ----------------------------------------------------------------------- #圆面积的计算 radius 25 area 3.1415 * radius * radius print(area) print("{:.2f}".format(area)) --------------------------------------------------------------------…

昇思25天学习打卡营第1天|yulang

今天主要了解了深度学习框架之昇思MindSpore的初学入门&#xff0c;没想到 ai学习入门如此简单&#xff0c;不愧是华为大手笔&#xff0c;提供的学习环境配置如此之高。这个平台有点类似百度飞桨&#xff0c;大大降低了AI开发门槛&#xff0c;使用户能够快速实现想要的模型&…

Hadoop3:Yarn的Tool接口案例

一、需求 依然以wordcount案例为基础&#xff0c;进行开发 我们知道&#xff0c;用hadoop自带的example.jar执行wordcount 命令如下 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -D mapreduce.job.queuename…

如何选择品牌推广公司?哪家好?收费标准及评价!

不管是什么品牌&#xff0c;推广对公司的成败起了很关键的作用。然而&#xff0c;面对市面上琳琅满目的品牌推广公司&#xff0c;如何选择一家既熟悉又靠谱的公司&#xff0c;成为许多企业主面临的难题。 作为一家手工酸奶品牌的创始人&#xff0c;目前全国也复制了100多家门店…

深度探索“目录名称无效“:原因、解决方案与最佳实践

目录名称无效&#xff1a;现象背后的秘密 在日常使用电脑或移动设备时&#xff0c;我们时常会遇到“目录名称无效”的错误提示&#xff0c;这一提示仿佛是一道无形的屏障&#xff0c;阻断了我们与重要数据的联系。从本质上讲&#xff0c;“目录名称无效”意味着系统无法识别或…

Windows下快速安装Open3D-0.18.0(python版本)详细教程

目录 一、Open3D简介 1.1主要用途 1.2应用领域 二、安装Open3D 2.1 激活环境 2.2 安装open3d 2.3测试安装是否成功 三、测试代码 3.1 代码 3.2 显示效果 一、Open3D简介 Open3D 是一个强大的开源库&#xff0c;专门用于处理和可视化3D数据&#xff0c;如点云、网格和…

Android原生与flutter模块交互

Flutter定义了三种不同类型的Channel&#xff1a; BasicMessageChannel&#xff1a;用于传递字符串和半结构化的信息&#xff0c;持续通信&#xff0c;收到消息后可以回复此次消息&#xff0c;如&#xff1a;Native将遍历到的文件信息陆续传递到Dart&#xff0c;在比如&#xf…

无法下载 https://mirrors./ubuntu/dists/bionic/main/binary-arm64/Packages

ubuntu系统执行sudo apt update命令的时候&#xff0c;遇到如下问题&#xff1a; 忽略:82 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/universe arm64 Packages 错误:81 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/main arm64 Packa…

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

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

VMware Mac/Win 虚拟机软件介绍

VMware作为全球领先的虚拟化技术提供商&#xff0c;其Mac/Win虚拟机软件为用户带来了前所未有的跨平台操作体验。这款软件凭借其强大的功能和稳定的性能&#xff0c;成为了众多开发者、设计师、企业用户以及个人用户的首选工具。 强大的多操作系统支持 VMware Mac/Win 虚拟机…

轻松创建对象——简单工厂模式(Python实现)

1. 引言 大家好&#xff0c;又见面了&#xff01;今天我们要聊的是设计模式中的“万能钥匙”——简单工厂模式。想象一下&#xff0c;如果每次你都得亲自动手创建各种对象&#xff0c;不仅累得像个陀螺&#xff0c;还可能搞得一团糟。别怕&#xff0c;简单工厂模式来拯救你&am…