docker-容器编排

前言

Docker Compose(容器编排)

基本概念

就是多个容器之间协作,用容器编排技术,相当于一个总指挥,容器就是相当于个人

什么是Docker Compose

docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了

Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器

比特就业课

的应用。

docker-compose 中有两个非常重要的概念:

• 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

• 项目( project ):由一组关联的应用容器组成的一个完整业务单元,在docker

compose.yml 文件中定义, 整个docker-compose.yml 定义一个项目。

Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周

期管理。

通过compose可以方便的管理多个服务。

就是对多个容器一起的启动

为什么要Docker Compose

• Docker 是一个轻量化的应用程序,Docker 官方推荐每个 Docker 容器中只运行一

个进程。

• 如果一个应用需要涉及到MySQL、nginx等环境, 那么我们需要分别为应用、数

据库和nginx 创建单独的 docker 容器,然后分别启动容器。

• 想象一下,当我们构建好 Docker 之后,每次启动应用,都至少需要 docker run

三次, 或者写一些脚本来实现, 这样会比较繁琐。

• 另外,这些 docker容器都是分散独立的,也不方便镜像管理。那既然这些 docker

容器 都是为了同一个应用服务,我们就应该把它们放到一起,这就引出了 docker

compose 来解决这类型的问题。

但是这个只是解决单机的问题,集群化的问题不是它来解决的

Docker Compose 的安装

安装docker的时候,我们默认已经安装了docker-compose,安装的组件包名称为

docker-compose-plugin,此处不再赘述

我们来检查一下

docker compose version就可以了

Docker Compose 的功能

使用步骤

Compose 使用的步骤:

• 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中

一起运行。

• 最后,执行 docker compose up 命令来启动并运行整个应用程序。

核心功能

Compose具有管理应用程序整个生命周期的命令:

• 启动,停止和重建服务

• 查看正在运行的服务的状态

• 流式传输运行服务的日志输出

• 在服务上运行一次性命令

Docker Compose 使用场景

单主机部署

快速搭建一个单节点开发或者测试环境,方便使用。

不同环境隔离

通过指定project来运行不同的环境,实现隔离的目的。

Docker Compose 文件(docker-compose.yml)

文件语法版本

目前官方支持三个大版本, 即Version 1、Version 2 及Version 3, 其中Version 1已

经被废弃掉了。

当前最新的版本是3.8,它支持的Docker Engine版本不得低于19.03.0。 本课程主

要基于3.8版本的Compose file语法进行讲解,其他版本介绍参见官方文档。

官方文档

文件基本结构及常见指令

YAML 文件

version: "3.8" # 定义版本, 表示当前使用的docker-compose语法的版本

services: # 服务,可以存在多个

servicename: # 服务名字,它也是内部bridge网络可以使用的DNS name,

如果不是集群模式相当于docker run的时候指定的一个名称,

#集群(Swarm)模式是多个容器的逻辑抽象

image: # 必选,镜像的名字

command: # 可选,如果设置,则会覆盖默认镜像里的 CMD命令

environment: # 可选,等价于 docker container run里的 --env选项

设置环境变量

volumes: # 可选,等价于docker container run里的 -v选项 绑定数据

networks: # 可选,等价于 docker container run里的 --network选项

指定网络

ports: # 可选,等价于 docker container run里的 -p选项指定端口映

expose: # 可选,指定容器暴露的端口

build: #构建目录

depends_on: #服务依赖配置

env_file: #环境变量文件

servicename2:

image:

command:

networks:

ports:

servicename3:

#...

volumes: # 可选,等价于 docker volume create

networks: # 可选,等价于 docker network create

每个参数功能

image

指定容器运行的镜像。以下格式都可以:

image: redis

image: redis:5

image:

redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398

bc4b991aac7

image: library/redis

image: docker.io/library/redis

image: my_private.registry:5000/redis

实操

我们先创建一个目录-->因为docker compoe有个参数是project,如果不指定的话,默认会使用配置文件所在目录,作为我们项目名称

mkdir -p /data/maxhou/mycompose

cd /data/maxhou/mycompose

mkdir prj1

cd prj1

vi docker-compose.yml

注意这个里面不能使用tab,只能使用空格

version:"3.8"

services:

web:

image: nginx:1.24.0

这样我们的一个web站点就弄好了

docker compose up -d

就是把compose文件解析,把所有的服务全部up启动,-d就是后台运行了

这个表示创建了一个默认的的网络,和容器

prj1就是我们项目的名称

default表示默认网络

prj1-web-1表示这个是我们web服务的第一个容器

docker network ls

可以看到默认多了一个桥的网络

docker inspect prj1_default

可以看到创建的容器

所以我们把容器加入了这个工程的默认网络,与docker的默认网络不混用

docker ps

docker compose ps

可以看到我们创建的容器,service服务是web

docker compose down

这个就是销毁

默认读的是本目录下的配置文件

这样就删除了容器和网络了

docker ps -a

docker network ls都找不到了

command

覆盖容器启动的默认命令。

Shell

cpp 复制代码
command: ["bundle", "exec", "thin", "-p", "3000"] 
command: bundle exec thin -p 3000 

docker compose up -d

这个时候容器的启动命令没有被覆盖掉

docker inspect prj1-web-1

这个就是nginx的默认启动命令

cd ...

cp -r prj1 prj2

在拷贝一下

cd prj2

vi docker-compose.yml

cpp 复制代码
version:"3.8"
  services:
    web:
      image: nginx:1.24.0
      command:["tail","-f","/etc/hosts"]

"tail","-f"就是永远会执行的意思

docker compose up -d

docker ps

docker network ls

docker inspect prj2-web-1

cmd也是变了

这样会导致我们的nginx根本就没有启动

docker exec -it prj1-web-1 curl 127.0.0.1

这个的意思就是进入容器默认访问curl 127.0.0.1,如果启动了nginx的话,就会打印出内容

所以nginx启动了,第一个容器

docker exec -it prj2-web-1 curl 127.0.0.1

我们发现第二个容器根本没有启动,所以80端口没有访问到内容,

docker compose down

cd ...

cd prj1

docker compose down

这样两个都清理掉了

entrypoint

覆盖容器默认的 entrypoint。 也是覆盖默认的命令

Shell

entrypoint: /code/entrypoint.sh

也可以是以下格式:

Shell

cpp 复制代码
entrypoint: 
    - php 
    - -d 
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non
zts-20100525/xdebug.so 
    - -d 
    - memory_limit=-1 
    - vendor/bin/phpunit

cd ...

cp -r prj1/ prj3

cd prj3

vi docker-compose.yml

version:"3.8"

cpp 复制代码
  services:
    web:
      image: nginx:1.24.0
      entrypoint:
        - tail
        - -f
        - /etc/os-release

docker compose up -d

docker ps

我们发现两个的启动命令是不一样的

docker inspect prj1-web-1
docker inspect prj3-web-1

docker exec -it prj3-web-1 curl 127.0.0.1

docker exec -it prj1-web-1 curl 127.0.0.1

说明启动命令也被覆盖了

如果entrypoint和command同时使用,command会作为entrypoint的参数使用的

environment

添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以

确保 YML 解析器不会将其转换为 True 或 False。

cpp 复制代码
Shell 
#map语法 
environment: 
  RACK_ENV: development 
  SHOW: "true" 
  USER_INPUT: 
#数组语法 
environment: 
  - RACK_ENV=development 
  - SHOW=true 
  - USER_INPUT 

cd ...

cp -r prj1/ prj3

cd prj3

vi docker-compose.yml

cpp 复制代码
version: "3.8"
  services:
    web:
      image: nginx: 1.24.0
      environment:
         TEST: 1

docker compose up -d----》如果以前没有销毁的话,这次就会重启一下

docker ps

注意冒号后面要有空格

docker inspect prj3-web-1

这样就有了

docker exec -it prj1-web-1 bash

env | grep TEST

networks

指定容器运行的网络:

配置容器网络

cpp 复制代码
Shell 
services: 
  frontend: 
    image: awesome/webapp 
    networks: 
      - front-tier 
      - back-tier 
  monitoring: 
    image: awesome/monitoring 
    networks: 
      - admin 
  backend: 
    image: awesome/backend 
    networks: 
      back-tier: 
        aliases: 
          - database 
      admin: 
        aliases: 
          - mysql 
networks: 
  front-tier: 
  back-tier: 
  admin: 
配置网络驱动和子网信息
Shell 
services: 
  frontend: 
    image: awesome/webapp 
    networks: 
      front-tier: 
        ipv4_address: 172.16.238.10 
networks: 
  front-tier: 
    ipam: 
      driver: default 
      config: 
        - subnet: "172.16.238.0/24"

cd ...

cp -r prj1/ prj4

cd prj4

vi docker-compose.yml

cpp 复制代码
version: "3.8"
  services:
    web:
      image: nginx: 1.24.0
      environment:
         TEST: 1
       networks:
         - mywebnet1
         - mywebnet2
networks:
  mywebnet1:
  mywebnet2:

输入docker compose config

如果正常打印说明我们写的文件是OK的

docker compose up -d

docker ps

docker network ls

docker inspect prj4-web-1

还可以调整网络的ip地址的

cpp 复制代码
networks:
  mywebnet1:
  mywebnet2:是创建了两个网络
         networks:
         - mywebnet1
         - mywebnet2是加入了这两个网络

volumes

将主机的数据卷或者文件挂载到容器里。

cpp 复制代码
Shell 
#短语法 
services: 
  db: 
    image: postgres:latest 
    volumes: 
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock" 
      - "/localhost/data:/var/lib/postgresql/data" 
       
#完整语法 
services: 
  backend: 
    image: awesome/backend 
    volumes: 
      - type: volume 
        #命名卷 
        source: db-data 
        target: /data 
        volume: 
          nocopy: true 
       #绑定卷 
      - type: bind 
        source: /var/run/postgres/postgres.sock 
        target: /var/run/postgres/postgres.sock 
 
volumes: 
  db-data: 

cd ...

cp -r prj1/ prj5

cd prj5

vi docker-compose.yml

cpp 复制代码
version: "3.8"
  services:
    web:
      image: nginx: 1.24.0
      environment:
         TEST: 1
      volumes:
        - /data/maxhou.vol1:/usr.share.nginx.html/
复制代码
    - /data/maxhou.vol1:/usr.share.nginx.html/中前面是宿主机目录,不存在会自动创建的,后面是容器目录

输入docker compose config

可以看出是绑定类型的卷

docker compose up -d

docker ps

docker compose ps

docker network ls

docker inspect prj5-web-1

docker exec -it prj5-web-1 bash

curl 127.0.0.1

为什么会这样呢,因为宿主机里面的内容会覆盖容器里面的内容,因为这是-v的

另一个shell

cd /data/maxhou.vol1

vi index.html

hello

curl 127.0.0.1

这样就成功了

ports

指定端口映射。以下格式都可以:

cpp 复制代码
Shell 
#完整语法 
ports: 
  - target: 80 
    host_ip: 127.0.0.1 
    published: 8080 
    protocol: tcp 
    mode: host 
 
  - target: 80 
    host_ip: 127.0.0.1 
    published: 8000-9000 
    protocol: tcp 
    mode: host 
#短语法 
ports: 
  - "3000" 
  - "3000-3005" 
  - "8000:8000" 
  - "9090-9091:8080-8081" 
  - "49100:22" 
  - "127.0.0.1:8001:8001" 
  - "127.0.0.1:5000-5010:5000-5010" 
  - "6060:6060/udp"

cd ...

cp -r prj1/ prj6

cd prj6

vi docker-compose.yml

cpp 复制代码
version: "3.8"
  services:
    web:
      image: nginx: 1.24.0
      environment:
         TEST: 1
      ports:
       - 8977:80

输入docker compose config

可以看出是绑定类型的卷

docker compose up -d

docker ps

docker compose ps

docker network ls

docker inspect prj6-web-1

docker port prj6-web-1

我们发现端口已经暴露了

然后去浏览器上访问8977也是可以的

expose

cpp 复制代码
暴露端口,但不映射到宿主机,只被连接的服务访问。 
仅可以指定内部端口为参数: 
expose: 
 - "3000" 
 - "8000" 

cd ...

cp -r prj1/ prj7

cd prj7

vi docker-compose.yml

cpp 复制代码
version: "3.8"
  services:
    web:
      image: nginx: 1.24.0
      environment:
         TEST: 1
      expose:
        - 80

就是把这个容器的80端口暴露出去

输入docker compose config

可以看出是绑定类型的卷

docker compose up -d

docker ps

docker compose ps

docker network ls

docker inspect prj6-web-1

docker port prj6-web-1

docker exec -it prj7-web-1 bash

curl 127.0.0.1

exit

curl 127.0.0.1

这个返回的是宿主机的nginx的页面,并不是容器的nginx页面

所以expose就是声明我要暴露这个端口,但是没什么用

build

后面dockefile的时候在用

cpp 复制代码
指定为构建镜像上下文路径: 
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像: 
Shell 
version: "3.7" 
services: 
  webapp: 
    build: ./dir 
或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args: 
Shell 
version: "3.7" 
services: 
  webapp: 
    build: 
      context: ./dir 
      dockerfile: Dockerfile-alternate 
      args: 
        buildno: 1 
      labels: 
        - "com.example.description=Accounting webapp" 
        - "com.example.department=Finance" 
        - "com.example.label-with-empty-value" 
• context:上下文路径。 
• dockerfile:指定构建镜像的 Dockerfile 文件名。 
• args:添加构建参数,这是只能在构建过程中访问的环境变量。 
• labels:设置构建镜像的标签。

depends_on

设置依赖关系。 ,比如要先启动数据库mysql和redis,在启动web应用

cpp 复制代码
设置依赖关系。 
• docker compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 
redis ,才会启动 web。 
• docker compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,
docker compose up web 还将创建并启动 db 和 redis。 
• docker compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 
redis 之前停止。 
Shell 
version: "3.7" 
services: 
  web: 
    build: . 
    depends_on: 
      - db 
      - redis 
  redis: 
    image: redis 
  db: 
    image: postgres 
可以指定条件,healthy需要配置healthcheck来完成 

Shell 
services: 
  web: 
    build: . 
    depends_on: 
      db: 
        condition: service_healthy 
      redis: 
        condition: service_started 
  redis: 
    image: redis 
  db: 
    image: postgres 
health check样例 
Shell 
version: "3.8" 
services: 
  web: 
    image: nginx:1.24.0 
    environment: 
      TEST: 1 
    depends_on: 
      mysql: 
         condition: service_healthy  
  mysql: 
    image: mysql:5.7 
    environment: 
      MYSQL_ROOT_PASSWORD: "bit@123" 
    volumes: 
      - /data/maxhou/mysqldata/varlib/:/var/lib/mysql 
    healthcheck: 
      test:  mysql --user=root --password='bit@123' -e "SELECT 1;" 
      interval: 10s 
      timeout: 5s 
      retries: 10

cd ...

cp -r prj1/ prj9

cd prj9

vi docker-compose.yml

cpp 复制代码
version: "3.8"
  services:
    web:
      image: nginx: 1.24.0
      environment:
        TEST: 1
      depends_on:
        mysql:
          condition: service_healthy
    mysql:
      image: mysql:5.7
      environment:
        MYSQL_ROOT_PASSWORD: bit@123
      healthcheck:
        test: mysql -u root -pbit@123 -e 'select 1;'
        interval: 10s
        timeout: 5s
        retries: 10

MYSQL_ROOT_PASSWORD这个是mysql的密码

然后我们要保证mysql是健康的,然后才能去启动这个mysql--->healthcheck来

healthcheck:

test: mysql -u root -pbit@123 -e 'select 1;'的意思是用root账号登录执行select 1

如果能执行的话就是正确的,就会正常启动mysql

interval: 10s-->10s检测一次

timeout: 5s--》查询时间

retries: 10 --》重试次数

depends_on:

mysql:

condition: service_healthy的意思是web启动依赖于mysql,mysql健康的时候才会启动web应用

输入docker compose config

可以看出是绑定类型的卷

docker compose up -d

可以看出,创建的过程中要等mysql健康的话,才能创建成功web

docker ps

docker compose ps

docker network ls

docker inspect prj6-web-1

docker compose stop

可以看出是先停应用再停mysql

启动就是先启动mysql,等mysql健康了,在启动web

env_file

cpp 复制代码
从文件添加环境变量。可以是单个值或列表的多个值。 
Shell 
env_file: .env 
比特就业课
 
 
也可以是列表格式: 
Shell 
env_file: 
  - ./common.env 
  - ./apps/web.env 
  - /opt/secrets.env 

cd ...

cp -r prj1/ prj10

cd prj10

vi docker-compose.yml

cpp 复制代码
version: "3.8"
  services:
    web:
      image: nginx: 1.24.0
      environment:
        TEST: 1
      env_file:
        - ./commenv
        - ./webenv

然后就是编辑两个配置文件

vi commenv

TEST2=2

TEST2_2=2.2

vi webenv

TEST3_1=3.1

TEST3_2=3.2

输入docker compose config

可以看出是绑定类型的卷

docker compose up -d 默认启动当前页面的compose 文件

docker ps

docker compose ps

docker network ls

docker inspect prj6-web-1

docker exec -it prj10-web-1 bash

env | grep TEST

文件参数官网

Docker Compose命令清单

官网

命令清单如下

docker compose build 构建服务

docker compose config 规范的格式来显示服务配置

docker compose cp 在本地系统和服务容器直接拷贝文件

docker compose create 创建服务的容器

docker compose down 停止所有容器,并删除容器

docker compose events 从服务器获取实时事件

docker compose exec 在容器中执行命令

docker compose images 列出所有容器使用的镜像

docker compose kill 强制停止服务的容器

docker compose logs 显示日志

docker compose ls 显示所有项目

docker compose pause 暂停服务

docker compose port 列出所有的端口映射

docker compose ps 该命令可以列出项目中目前的所有容器

docker compose pull 拉取服务镜像

docker compose push 推送服务镜像

docker compose restart 重启或者重启某个服务

docker compose rm 删除服务停止的容器

docker compose run 在指定服务容器上执行相关的命令

docker compose start 启动当前停止的某个容器

docker compose stop 停止当前运行的某个容器

docker compose top 显示运行的进程

docker compose unpause 恢复服务

docker compose up up命令会构建,(重新)创建,启动,链接一个服务相关的容器。默认情况下如果容器已经存在,将会停止并尝试重新创建他们。并使用之前挂载的卷。--no-recreate参数可以让容器不被停止或者重新创建,-d表示后台运行

docker compose version 查看版本

这些命令都和容器的命令差不多

docker compose stop 停止当前运行的某个容器 ,如果不输入具体的服务的话,删除的就是停掉所有服务

命令格式

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的

服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服

务都会受到命令影响。

docker-compose 命令的基本的使用格式为

docker compose [OPTIONS] COMMAND [ARGS...]

ARGS...\] 就是指定某个具体的服务,或者某个参数比如-a ### 常见选项说明 • -f, --file指定使用的 Compose 模板文件,默认为 docker-compose.yml,可 以多次指定 • -p, --project-name 指定项目名称,默认将使用所在目录名称作为项目名 如果指定项目名称,那么就可以通过一个compose.yml创建两个项目,两个容器内容一模一样,不一样的就是名字,这就实现了项目的隔离 cp docker-compose.yml dockercompose.txt cd ... docker compose up -d ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/47370e8812d046bb8805d7a3b0221957.png) 发现这样就找不到配置文件了 docker compose -f ./prj9/dockercompose.txt -p prj92 up -d 这个就是启动指定目录./prj9/dockercompose.txt下的配置文件dockercompose.txt,启动为一个项目,项目的新名字为prj92 docker compose ps ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0bbb79b2933c42f78ac40dad87b2dba9.png) 又说我们的配置文件没有指定,因为这个命令都是默认执行当前目录下的配置文件的项目,当前没有配置文件,就找不到项目了 docker compose-p prj92 ps 这个就是指定查看某个项目了 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a99d7685b26941b2aa7ef147008ff009.png) 如果不指定就是默认查看当前目录下的项目的,当前目录对应的配置文件对应的项目 cd prj9 docker compose up -d 这个就是默认启动docker-compose.yml这个配置文件了,然容器的名称默认就是目录的名称了 docker ps ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c08c552d4acf4be58c3d63cbf0a7c3b5.png) docker compose -p prj93 up -d 这个就是以配置文件docker-compose.yml生成的一个项目名为prj93 ,如果不指定名字的话,就是相当于把prj9这个对应的项目重启了 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/de69e94a72d342dd8a723afd41e57e9e.png) docke ps ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/726f191b43054c9d97ff5d7a9914265c.png) 我们可以看到prj9和prj93的容器都是存在的,都在这个目录下的 这两个项目是互不干扰的 docker network ls ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/54a6ac003a1748f7884c1bcb1e6df04f.png) 网络也是互不干扰的,也是隔离的 -p这样就实现了容器的隔离 -f指定使用哪个模版文件。就是指定那个配置文件,文件名与后缀名不重要 ### 常见命令说明 ### up 该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服 务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。 Shell docker compose up \[options\] \[SERVICE...

• -d 在后台运行服务容器, 推荐在生产环境下使用该选项

• --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用

• --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force

recreate 同时使用

options是选项,SERVICE是一个或者多个服务

如果没有SERVICE的话,默认是这个project的所有服务,输入服务的话,就是把这个服务和依赖的服务启动起来

cat docker-compose.yml

docker compose up

这个就是前台运行了,直接把启动信息打到shell控制台了

另一个shell

docker ps

docker network ls

我们直接在前台运行的服务ctrl+c,它就停止了

docker ps -a | grep prj1-web-1

这样就看出服务就停止了

但是容器没有删除的

docker compose down

就是清理这个服务了

docker compose up -d

这样就后台启动了

ctrl+c不影响的

docker compose up -d --force-recreate

这个就是强制重新创建这个服务的意思,重新加载这个配置文件

我们来修改一下配置文件

docker compose up -d --no-recreate

docker ps
可以发现这个并没有重新去启动这个容器

docker inspect prj1-web-1

这里的test=2,是因为docker compose up -d --force-recreate的原因

说明--no-recreate并不会重新创建容器,意思就是容器已经创建了,就不会管它了

总结

相关推荐
java资料站1 小时前
docker中间件部署
docker·中间件·容器
极客先躯3 小时前
高级java每日一道面试题-2025年3月12日-微服务篇[Eureka篇]-说一说Eureka区域感知路由策略?
java·微服务·eureka
咯拉咯啦11 小时前
Docker安装 Nacos 微服务
docker·微服务
一直走下去-明12 小时前
docker简单使用
运维·docker·容器
程序员柒叔14 小时前
制作PaddleOCR/PaddleHub的Docker镜像
python·docker·ocr·paddle
PenguinLeee15 小时前
需求导向的K8S网络原理分析:Kube-proxy、Flannel、Calico的地位和作用
网络·容器·kubernetes
咯拉咯啦16 小时前
Docker 安装 RabbitMQ
docker·rabbitmq
容器魔方17 小时前
KubeCon Europe 2025 | 一图速览华为云精彩议程
云原生·容器·云计算
檀越剑指大厂17 小时前
【Docker系列八】使用 Docker run 命令部署 Nginx
nginx·docker·容器
59803541517 小时前
【docker】docker-compose安装RabbitMQ
docker·容器·rabbitmq