【问题标题】:How to solve "port is already allocated" error when running two docker-compose files at the same time?同时运行两个 docker-compose 文件时如何解决“端口已分配”错误?
【发布时间】:2016-10-31 08:36:34
【问题描述】:

我有许多基于具有不同设置的 docker-compose 文件的项目。 如果我想开始另一个项目,我会docker-compose stop当前项目和docker-compose up另一个。 但我的问题听起来是:如何同时使用任何项目启动 2 个或更多 docker-compose 图像? 我的操作系统 linux ubuntu。 我的 docker-compose 看起来像:

application:
    build: code
    volumes:
        - ./mp:/var/www/mp
        - ./logs/mp:/var/www/mp/app/logs
    tty: true
db:
    image: mysql
    ports:
        - 3306:3306
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: mp-DB
        MYSQL_USER: root
        MYSQL_PASSWORD: root
php:
    build: php-fpm
    ports:
        - 9000:9000
    volumes_from:
        - application
    links:
        - db
nginx:
    build: nginx
    ports:
        - 80:80
    links:
        - php
    volumes_from:
        - application
    volumes:
        - ./logs/nginx/:/var/log/nginx
elk:
    image: willdurand/elk
    ports:
        - 81:80
    volumes:
        - ./elk/logstash:/etc/logstash
        - ./elk/logstash/patterns:/opt/logstash/patterns
    volumes_from:
        - application
        - php
        - nginx

如果我尝试运行另一个项目,我得到了错误

'驱动程序在端点上编程外部连接失败 mpdockerenv_db_1 绑定 0.0.0.0:3306 失败:端口已经存在 分配'

我想我应该会从具有不同端口的容器中转发端口,但我不知道该怎么做。

【问题讨论】:

  • 那些项目在同一个文件夹中?图片是怎么命名的?你试过docker-compose up proj1docker-compose up proj2。 config docker-compose.yml 文件长什么样子?
  • 如果同时运行这两个项目会发生什么?
  • 每个项目区域设置在不同的文件夹中,并且有自己的 docker-compose 文件和设置。如果我尝试运行另一个项目,我会收到错误“驱动程序在端点 mpdockerenv_db_1 上编程外部连接失败,为 0.0.0.0:3306 绑定失败:端口已分配”

标签: docker docker-compose


【解决方案1】:

docker-compose 是一个为您的问题准确处理构建的工具。

我的意思是假设您有一个复杂的项目,您需要组织并以更简洁的方式来处理系统环境。

通常在 docker-compose.yml 文件中,您可以拥有将使用的任何 docker 镜像。

f.example 我使用的部分文件:

mongo:
image: mongo:latest
ports:
 - "3002:27017"
environment:
MONGODB_DATABASE: "meteor-console-dev"

php-fpm-dev:
image: jokediaz/php-fpm.5.6-laravel
volumes:
 - ./repos/datamigration:/usr/share/nginx/html/datamigration
 - ./unixsock:/sock
 - ./config/php-fpm-5.6/:/usr/local/etc/php
links:
 - mongo

所以如果我们看一下以下规则:

  • 端口:可以映射外部端口输出:内部 docker 端口

  • 环境:设置系统环境变量

  • volumes : 你正在将一个目录从你的 Filesystem : inside 映射到 docker 容器(所以即使你破坏了容器,这些数据也会被保存)

  • 链接:docker 内部有一点内部网络 DNS 管理,所以如果你输入:docker network inspect bridge 命令,你会看到子网范围和网关(通常是 172.17.0.1),这意味着你正在运行的应用程序在里面docker可以看到彼此内部认为这个ip,如果你输入链接和图像条目的名称,docker(小DNS)可以从一个容器ip映射到另一个。

另一点是在修改 docker-compose 以重新创建您所做的所有更改时制作一个 docker-compose up ,一个好主意是在之前制作 docker-compose down (小心这将删除任何未映射的volume ) 以清除和释放空间。

看看 docker-compose 文件参考:

docker-compose file reference

你的情况

 ports:
    - 3306:3306

主机正在使用端口 3306。 (可能您的系统中有一个正在运行的 mysql 实例,因此端口正在使用中)

所以干脆换成其他空闲端口:

 ports:
    - 3308:3306

【讨论】:

  • 谢谢。我解决了我的问题。我的问题出在端口上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多