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: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. 总结图

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Leetcode 566】【Easy】重塑矩阵

目录 题目描述 整体思路 具体代码 题目描述&#xff1a; 原题链接 整体思路 首先要确保重塑后的矩阵内元素个数和原矩阵元素个数要相同&#xff0c;如果不同则原样返回原矩阵。 按行遍历顺序遍历原矩阵&#xff0c;设一个临时vector<int>存放新矩阵的每一行的元素…

Go线程实现模型-G

G 概述 一个G就代表一个goroutine(或称Go例程)&#xff0c;也与go函数相对应。作为编程人员&#xff0c;我们只是使用go语句向Go的运行时系统提交一个并发任务&#xff0c;而Go的运行时系统则会按照我们要求并发地执行它 Go编译器会把go语句变成对内部函数newproc的调用&…

张嘴就能生图?一分钟教会你使用魔法!(Stable Diffusion进阶:SDXL-Turbo)

大家好我是极客菌&#xff01;&#xff01;&#xff01;Stable Diffusion&#xff0c;一款基于深度学习的图像生成模型&#xff0c;以其强大的图像生成能力和个性化风格迁移能力&#xff0c;在艺术创作领域掀起了一场革命。而SDXL-Turbo&#xff0c;作为Stable Diffusion的进阶…

ADS基础教程23 - 有限元电磁仿真(FEM)可视化操作

EM介绍 一、引言二、FEM可视化操作流程1.打开可视化界面2.查看介质的网格3.设置网格颜色4.选择网格5.传感器选择6.编辑传感器7.选择频率8.动画 三、总结 一、引言 在ADS基础教程22中介绍了如何在ADS进行有限元电磁仿真&#xff08;FEM&#xff09;&#xff0c;本文将继续介绍F…

MD5算法详解

哈希函数 是一种将任意输入长度转变为固定输出长度的函数。 一些常见哈希函数有&#xff1a;MD5、SHA1、SHA256。 MD5算法 MD5算法是一种消息摘要算法&#xff0c;用于消息认证。 数据存储方式&#xff1a;小段存储。 数据填充 首先对我们明文数据进行处理&#xff0c;使其…

Jasper studio报表工具中,如何判断subDataSource()子报表数据源是否为空

目录 1.1、错误描述 1.2、解决方案 1.1、错误描述 今天在处理一个有关Jasper Studio报表模板制作的线上问题&#xff0c;需要根据某个报表子数据源是否为空&#xff0c;来决定对应的组件是否显示&#xff0c;找了好久的资料都没有实现&#xff0c;最后找到一种解决办法。就是…

专为运维工程师设计!阿里藏经阁出品的Python实战手册被我搞来了

Python 可能是极少数既简单又强大的编程语言中的一种。更重要的是&#xff0c;用它来编程是非常快乐的事。 今天给小伙伴们分享的是阿里“藏经阁”出品的专门给运维工程师设计的Python实战手册 废话不多说&#xff0c;下面把内容展示给大家 01 Python快速回顾 02 Python脚本…

Linux下SUID提权学习 - 从原理到使用

目录 1. 文件权限介绍1.1 suid权限1.2 sgid权限1.3 sticky权限 2. SUID权限3. 设置SUID权限4. SUID提权原理5. SUID提权步骤6. 常用指令的提权方法6.1 nmap6.2 find6.3 vim6.4 bash6.5 less6.6 more6.7 其他命令的提权方法 1. 文件权限介绍 linux的文件有普通权限和特殊权限&a…

【剑指Offer系列】68-二叉树的最近公共祖先(哈希)

思路&#xff1a;使用map存储每个节点的父节点&#xff0c;则两个节点的最近公共祖先&#xff0c;即二者的最近父节点 1、中序遍历二叉树&#xff08;当前节点的下一个节点&#xff09; 2、记录每个节点的父节点 3、列出p的族谱、q的族谱 4、寻找二者最近的祖先 class Soluti…

CesiumJS【Basic】- #041 绘制纹理线(Entity方式)- 需要自定义着色器

文章目录 绘制纹理线(Entity方式)- 需要自定义着色器1 目标2 代码2.1 main.ts3 资源文件绘制纹理线(Entity方式)- 需要自定义着色器 1 目标 使用Entity方式绘制纹理线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer

美团外卖异地点餐怎么更改定位位置信息?

美团外卖异地点餐怎么更改定位位置信息&#xff1f; 1、打开「词令」关键词口令直达工具&#xff0c;输入词令「外卖红包88」&#xff0c;搜索直达该词令关联的目标&#xff0c;获得外卖红包天天领入口&#xff1b; 2、成功领取后&#xff0c;打开美团外卖APP&#xff0c;切换…

互联网场景下人脸服务基线方案总结

1.简介 1.1目的 在过去的一段时间里&#xff0c;因为听见业务对人脸服务方案的需求&#xff0c;针对网络视频中关键人物定位的检索任务&#xff0c;完成了基于互联网场景的人脸基线服务的构建。本文档是对当前基线服务以后之后解决方案的优化进行总结。 1.2范围 本文档描述的人…

华为防火墙在广电出口安全方案中的应用(方案设计、配置、总结)

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好&#xff0c;我的网工朋友。 不知道你有没有想过&#xff0c;我们每天看电视、上网追剧的广电网络&#xff0c;它的背后是如何确保安全稳定…

Git 命令学习之推送本地项目到 Gitee 托管

引言 在软件开发中&#xff0c;版本控制是不可或缺的一环。Git 作为目前最流行的分布式版本控制系统&#xff0c;广泛应用于各种项目中。而 Gitee&#xff08;原名码云&#xff09;作为国内知名的代码托管平台&#xff0c;为开发者提供了稳定、安全的代码托管服务。下面将详细…

Eclipse配置Tomcat时无Apache选项问题

有可能你会遇到&#xff0c;安装最新版本Eclipse&#xff0c;但是 Window——Preferences——Servers——Runtime Environments。发现没有Apache选项。&#xff0c;这是因为&#xff0c;默认没有安装J2EE组件&#xff0c;我们可以通过手动安装&#xff0c;来解决这个问题。 一…

vue3中的图片懒加载指令及全局注册

vue3中的图片懒加载指令及全局注册 最近重新刷了一遍黑马的小兔鲜前端项目&#xff0c;发现有个懒加载的指令之前还没有用过。而且写法相对固定&#xff0c;因此记录一下 首先&#xff0c;懒加载&#xff08;Lazy Loading&#xff09;的作用是延迟加载某些资源或组件&#xf…

【秋招突围】2024届秋招笔试-科大讯飞笔试题-03-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

日期时间显示网页

SweetOrange_Clock &#x1f558; 一、简介 1、这个项目包括一个HTML文件&#xff0c;其中包含页面的样式和脚本。 2、页面以优雅的黑白配色为主题&#xff0c;突出了实用性和视觉冲击力&#xff0c;使得显示内容在视觉上更为突出和易于阅读。 3、这是一个日期时间显示器。通…

数据库定义语言(DDL)

数据库定义语言&#xff08;DDL&#xff09; 一、数据库操作 1、 查询所有的数据库 SHOW DATABASES;效果截图&#xff1a; 2、使用指定的数据库 use 2403 2403javaee;效果截图&#xff1a; 3、创建数据库 CREATE DATABASE 2404javaee;效果截图&#xff1a; 4、删除数据…

Supabase 自托管部署实践

Supabase 是 Firebase 的开源替代品。使用 Postgres 数据库、身份验证、即时 API、边缘函数、实时订阅、存储和向量嵌入来启动您的项目。 Supabase介绍 Supabase 是一个开源的后端即服务&#xff08;BaaS&#xff09;平台&#xff0c;提供了一系列工具和服务&#xff0c;帮助…