docker compose如何使用同一图像创建多个容器

docker compose如何使用同一图像创建多个容器,docker,Docker,出于某种原因,我需要创建具有相同图像的容器,但当我启动第二个容器时,它只是重新启动了第一个容器 第一个yml文件: version: "3.1" services: php: image:php:php73-fpm restart: always ports: - "9000:9000" - "9501:9501" volumes: - $PWD/../:/var/www/html/ networks:

出于某种原因,我需要创建具有相同图像的容器,但当我启动第二个容器时,它只是重新启动了第一个容器

第一个yml文件:

version: "3.1"
services:

  php:
    image:php:php73-fpm
    restart: always
    ports:
      - "9000:9000"
      - "9501:9501"
    volumes:
      - $PWD/../:/var/www/html/
    networks:
      - app_net
    container_name: php
networks:
  app_net:
    driver: bridge
version: "3.1"
services:

  php:
    image:php:php73-fpm
    restart: always
    ports:
      - "19000:19000"
      - "19501:19501"
    volumes:
      - $PWD/../:/var/www/html/
    networks:
      - app_net2
    container_name: php73
networks:
  app_net2:
    driver: bridge
第二个yml文件:

version: "3.1"
services:

  php:
    image:php:php73-fpm
    restart: always
    ports:
      - "9000:9000"
      - "9501:9501"
    volumes:
      - $PWD/../:/var/www/html/
    networks:
      - app_net
    container_name: php
networks:
  app_net:
    driver: bridge
version: "3.1"
services:

  php:
    image:php:php73-fpm
    restart: always
    ports:
      - "19000:19000"
      - "19501:19501"
    volumes:
      - $PWD/../:/var/www/html/
    networks:
      - app_net2
    container_name: php73
networks:
  app_net2:
    driver: bridge
当我运行
docker compose up-d
启动第一个时:

$ cd ~/Document/php/work/docker/
$ docker-compose up -d
Creating network "docker_app_net" with driver "bridge"
Creating php ... done
然后我将目录切换到第二个yml文件

$ cd ../../private/docker/
$ docker-compose up -d
Recreating php ... done

不能有两个同名的容器。由于这两个名称都是php,Docker认为它们是应该为同一个容器合并的设置。重命名其中一个。Compose有一个。默认情况下,项目名称是包含
docker compose.yml
文件的目录的基本名称。在您的示例中,两个目录都名为
docker
(即使它们位于不同的父目录中),因此Compose会查找名为
docker
的项目和名为
php
的容器,并找到匹配项

有四种方法可以覆盖此选项:

  • 重命名其中一个目录
  • 设定目标
  • 在当前目录中创建,并在其中设置
    COMPOSE\u PROJECT\u NAME
  • 使用(在每个
    docker compose
    命令上)
  • 在您的
    docker compose.yml
    文件中,
    端口的第二部分:
    需要匹配容器正在侦听的内容;这允许与第一部分不同。因此,在两个文件中使用相同的9500/9501

    Compose项目命名的另一个结果是,Compose创建的容器、卷和网络的标准名称将以项目名称作为前缀。如果项目名称(当前目录名称)为
    docker2
    ,并且您将撰写文件缩减为

    版本:“3.1”
    服务:
    php:
    生成:。
    重新启动:始终
    端口:
    - "19000:9000"
    - "19501:9501"
    #无手动容器名称:或网络:
    

    该容器将命名为
    docker2_php_1
    ,并将连接到名为
    docker2_default
    的网络;这些将不同于在
    docker1
    项目/目录中创建的容器/网络。

    很好,它可以工作,但我仍然有一个问题,实际上,我还有其他docker-compose.yml,简单地说,我将它们命名为a.yml和B.yml。他们都启动了三个容器,其中一个是相同的图像:
    redis:5.0.5
    ,服务名称相同:
    redis
    。但当我开始B.yml时,它并没有像:
    创建xxx done。。。正在创建xxx已完成。。。重新启动redis-A已完成…
    (redis-A是A.yml中的容器名称,B.yml的容器名称是redis-B)@fear.jpg拥有两个同名服务也会有糟糕的结局。也不要那样做,太好了!,你的回答很好地告诉了我为什么以及如何去做,我尝试了你的建议,而且效果很好。