Docker 一篇到位

news2024/11/17 3:28:38

目录

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:latest
    restart: always
    container_name: redis
    environment:
      - REDIS_PASSWORD=123456
    ports:
      - '6379:6379'
    volumes:
      - redis-data:/bitnami/redis/data
      - redis-conf:/opt/bitnami/redis/mounted-etc
      - /etc/localtime:/etc/localtime:ro

  mysql:
    image: mysql:8.0.31
    restart: always
    container_name: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    ports:
      - '3306:3306'
      - '33060:33060'
    volumes:
      - mysql-conf:/etc/mysql/conf.d
      - mysql-data:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro

  rabbit:
    image: rabbitmq:3-management
    restart: always
    container_name: rabbitmq
    ports:
      - "5672:5672"
      - "15672:15672"
    environment:
      - RABBITMQ_DEFAULT_USER=rabbit
      - RABBITMQ_DEFAULT_PASS=rabbit
      - RABBITMQ_DEFAULT_VHOST=dev
    volumes:
      - rabbit-data:/var/lib/rabbitmq
      - rabbit-app:/etc/rabbitmq
      - /etc/localtime:/etc/localtime:ro
  opensearch-node1:
    image: opensearchproject/opensearch:2.13.0
    container_name: opensearch-node1
    environment:
      - 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 plugin
    ulimits:
      memlock:
        soft: -1 # Set memlock to unlimited (no soft or hard limit)
        hard: -1
      nofile:
        soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536
        hard: 65536
    volumes:
      - opensearch-data1:/usr/share/opensearch/data # Creates volume called opensearch-data1 and mounts it to the container
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 9200:9200 # REST API
      - 9600:9600 # Performance Analyzer

  opensearch-node2:
    image: opensearchproject/opensearch:2.13.0
    container_name: opensearch-node2
    environment:
      - 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 plugin
    ulimits:
      memlock:
        soft: -1 # Set memlock to unlimited (no soft or hard limit)
        hard: -1
      nofile:
        soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536
        hard: 65536
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - opensearch-data2:/usr/share/opensearch/data # Creates volume called opensearch-data2 and mounts it to the container

  opensearch-dashboards:
    image: opensearchproject/opensearch-dashboards:2.13.0
    container_name: opensearch-dashboards
    ports:
      - 5601:5601 # Map host port 5601 to container port 5601
    expose:
      - "5601" # Expose port 5601 for web access to OpenSearch Dashboards
    environment:
      - 'OPENSEARCH_HOSTS=["http://opensearch-node1:9200","http://opensearch-node2:9200"]'
      - "DISABLE_SECURITY_DASHBOARDS_PLUGIN=true" # disables security dashboards plugin in OpenSearch Dashboards
    volumes:
      - /etc/localtime:/etc/localtime:ro
  zookeeper:
    image: bitnami/zookeeper:3.9
    container_name: zookeeper
    restart: always
    ports:
      - "2181:2181"
    volumes:
      - "zookeeper_data:/bitnami"
      - /etc/localtime:/etc/localtime:ro
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes

  kafka:
    image: 'bitnami/kafka:3.4'
    container_name: kafka
    restart: always
    hostname: kafka
    ports:
      - '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:ro
  kafka-ui:
    container_name: kafka-ui
    image: provectuslabs/kafka-ui:latest
    restart: always
    ports:
      - 8080:8080
    environment:
      DYNAMIC_CONFIG_ENABLED: true
      KAFKA_CLUSTERS_0_NAME: kafka-dev
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
    volumes:
      - kafkaui-app:/etc/kafkaui
      - /etc/localtime:/etc/localtime:ro

  nacos:
    image: nacos/nacos-server:v2.3.1
    container_name: nacos
    ports:
      - 8848:8848
      - 9848:9848
    environment:
      - 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=true
    volumes:
      - /app/nacos/standalone-logs/:/home/nacos/logs
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      nacos-mysql:
        condition: service_healthy
  nacos-mysql:
    container_name: nacos-mysql
    build:
      context: .
      dockerfile_inline: |
        FROM mysql:8.0.31
        ADD https://raw.githubusercontent.com/alibaba/nacos/2.3.2/distribution/conf/mysql-schema.sql /docker-entrypoint-initdb.d/nacos-mysql.sql
        RUN chown -R mysql:mysql /docker-entrypoint-initdb.d/nacos-mysql.sql
        EXPOSE 3306
        CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
    image: nacos/mysql:8.0.30
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=nacos_devtest
      - MYSQL_USER=nacos
      - MYSQL_PASSWORD=nacos
      - LANG=C.UTF-8
    volumes:
      - nacos-mysqldata:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "13306:3306"
    healthcheck:
      test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
      interval: 5s
      timeout: 10s
      retries: 10
  prometheus:
    image: prom/prometheus:v2.52.0
    container_name: prometheus
    restart: always
    ports:
      - 9090:9090
    volumes:
      - prometheus-data:/prometheus
      - prometheus-conf:/etc/prometheus
      - /etc/localtime:/etc/localtime:ro

  grafana:
    image: grafana/grafana:10.4.2
    container_name: grafana
    restart: always
    ports:
      - 3000:3000
    volumes:
      - grafana-data:/var/lib/grafana
      - /etc/localtime:/etc/localtime:ro

volumes:
  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.coloradmin.cn/o/1883031.html

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

相关文章

浅聊JavaScript中的栈(stack)

前言 这篇文章结合leetcode题目讲解一下栈这种结构 第20题&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 第LCR-147题LCR 147. 最小栈 - 力扣&#xff08;LeetCode&#xff09; 栈&#xff08;stack&#xff09; 在讲解题目之前&#xff0c;我们先来…

天池大赛Higress插件官方demo详细部署+调试

天池大赛Higress插件官方demo详细部署调试 契机 ⚙ 使用Higress AI网关优化AI调用成本。就是基于向量召回相似问题的缓存&#xff0c;降低LLM API调用成本。就是开发一个网关插件做QA缓存嘛。前文已经成功复现了hello-world插件&#xff0c;这次结合官方提供的AI-Cache插件自…

二叉树遍历练习题

2.已知某二叉树的前序遍历序列为5 7 4 9 6 2 1&#xff0c;中序遍历序列为4 7 5 6 9 1 2&#xff0c;则其后序遍历序列为&#xff08; &#xff09; A.4 2 5 7 6 9 1 B.4 2 7 5 6 9 1 C.4 7 6 1 2 9 5 D.4 7 2 9 5 6 1 答案&#xff1a;C 解析&#xff1a; 通过前序遍历找…

失眠焦虑植物神经紊乱应该怎么改善饮食?

在快节奏的现代社会中&#xff0c;越来越多的人受到植物神经紊乱的困扰&#xff0c;尤其是失眠、焦虑、胸闷气短等症状频发。这些症状不仅影响日常生活和工作效率&#xff0c;还可能引发一系列健康问题。今天&#xff0c;我们就来谈谈如何通过调整饮食来改善这些症状。 饮食调整…

Java [ 基础 ] 方法引用 ✨

✨探索Java基础✨ Java基础&#xff1a;方法引用 方法引用是Java 8中引入的一种新特性&#xff0c;它使得代码更加简洁和易读。方法引用提供了一种可以直接引用已有方法作为Lambda表达式的替代方案。本文将深入介绍方法引用的基本概念、使用方法、具体实例及其在实际开发中的…

HCIA4.26-5.10

OSPF ——开放式最短路径优先协议 无类别链路状态IGP动态路由协议 距离矢量协议 运行距离矢量协议的路由器会周期性的泛洪自己的路由表&#xff0c;通过路由之间的交互&#xff0c;每台路由器都从相邻的路由器学习到路由条目&#xff0c;随后加载进自己的路由表中。对于网络…

简单分享下python封装

目录&#xff1a; 一、简介&#xff0c;什么是封装 二、封装的优点与好处 三、封装的示例 四、可封装的场景 一、简介&#xff0c;什么是封装 通俗理解&#xff1a;封装&#xff0c;简而言之&#xff0c;就是把数据&#xff08;变量&#xff09;和操作这些数据的方法&#xff0…

全球AI新闻速递7.1

全球AI新闻速递 1.科大讯飞发布讯飞星火 V4.0。 2.成都人形机器人创新中心&#xff1a;基于视觉扩散架构的人形机器人任务生成式模型 R-DDPRM。 3.安徽省人形机器人产业创新中心获批&#xff0c;将打造国内首创、世界领先研究基地。 4.亳州牵手华为打造华佗中医药大模型。 …

系统安全及应用(命令)

目录 一、账号安全控制 1.1 系统账号清理 1.2 密码安全控制 1.3 历史记录控制 1.4 终端自动注销 二、系统引导和登陆控制 2.1 限制su命令用户 2.2 PAM安全认证 示例一&#xff1a;通过pam 模块来防止暴力破解ssh 2.3 sudo机制提升权限 2.3.1 sudo命令&#xff08;ro…

SRS流媒体服务器安装与推拉流测试

一、首先打开SRS Github https://github.com/ossrs/srs二、在Linux系统下安装SRS 1. git clone https://github.com/ossrs/srs2、克隆完后进入trunk文件夹 cd srs/trunk3.进行环境配置 ./configure 检测当前环境是否满足 4.进行编译 make 5.编译完成后运行 ./objs/srs …

统计学期末名词解释说明

基本名词解释P值、显著性、显著水平、样本量、三大分布等 20基本名词详细解释&#xff1a; √P值&#xff1a; 相关名词&#xff1a;显著性、显著性差异、0.01水平显著、0.05水平显著。 P值&#xff0c;也称显著性值或者Sig.值&#xff0c;用于描述某件事情发生的概率情况&a…

器件频频更换为哪桩

曾想象&#xff0c;在一家大型研发型企业里有如下案例&#xff1a; 硬件工程师设计电路选择了器件库中的某器件&#xff0c;在批量试产产品时&#xff0c;却发现没有库存&#xff0c;即时申请采购&#xff0c;却发现货期相当长&#xff0c;一时难以采购&#xff0c;甚至根本不…

【ElementPlus源码】Scrollbar 滚动条

文章目录 thumbclickThumbHandlerstartDragmouseMoveDocumentHandlermouseUpDocumentHandlerclickTrackHandler其他 barScrollbar导出的方法noresize更新滚动条相关属性 utilsruntime.tsbuildProps 看源码时候做的笔记。若有问题&#xff0c;请指出&#xff01; 路径相关格式请…

什么是协程?协程和线程的区别

文章目录 前置知识应用程序和内核阻塞和非阻塞同步和异步并发和并行IO 发展历史同步编程异步多线程/进程异步消息 回调函数&#xff08;响应式编程&#xff09; 协程协程基本概念go 示例代码协程和线程的区别 个人简介 前置知识 在了解协程前&#xff0c;我们先理解一些相关的…

VBA数据库解决方案第十二讲:如何判断数据库中数据表是否存在

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

平安养老险陕西分公司参加2024上半年省级单位驻富平帮扶团联席会

6月28日&#xff0c;平安养老险陕西分公司工会副主席武媛携驻村工作队赴富平县庄里镇永安村参加2024上半年度省级单位驻富平帮扶团联席会议。 会议由省委金融办副主任、省委金融工委委员李嘉辉及省委金融办选派挂职干部、富平县副县长席玮共同主持。 会上&#xff0c;席玮县长带…

全球AI新闻速递6.28

全球AI新闻速递 1.首款 Transformer 专用 AI 芯片 Sohu 登场。 2.钉钉&#xff1a;宣布对所有AI大模型厂商开放&#xff0c;首批7家接入。 3.华为联合清华大学发布《AI 终端白皮书》。 4.国家卫生健康委&#xff1a;推动AI技术在制定个性化营养、运动干预方案中的应用。 …

地下水电站3D虚拟仿真展示平台

借助先进的VR技术&#xff0c;我们将水电站的每一个角落、每一处细节都以三维全景的形式真实呈现。您可以自由穿梭于水电站的各个区域&#xff0c;无论是发电机组、巍峨的水坝&#xff0c;还是错综复杂的输水管道&#xff0c;都近在咫尺。感受水流的澎湃力量&#xff0c;聆听机…

中文TeX,各种数学符号和表格

\documentclass{article} \usepackage{amsmath,amssymb,amsfonts} \usepackage{CJKutf8} \begin{document}\begin{CJK}{UTF8}{gkai}%正文放在此行下与\end{CJK}之间就行你好, LaTeX!平方根 $\sqrt{x}$立方根 $\sqrt[3]{x}$分数的代码是 $\frac{a}{b}$求和的代码是 $\sum_{i1}^{…

自闭症儿童能不能用药

在星贝育园自闭症儿童康复学校&#xff0c;我们一直秉持着谨慎且保守的态度对待自闭症儿童的用药问题。我们坚定地认为&#xff0c;在大多数情况下&#xff0c;药物并非自闭症儿童康复的首选。 自闭症是一种神经发育障碍&#xff0c;其核心症状包括社交沟通障碍、重复刻…