【问题标题】:How to handle IP addresses when linking docker containers with each other using docker-compose?使用 docker-compose 将 docker 容器相互链接时如何处理 IP 地址?
【发布时间】:2016-01-06 09:18:56
【问题描述】:

我正在使用 docker-compose 构建一个完整的开发堆栈。

应用程序需要一个 mysql 服务器才能工作。

mysql 服务器是 docker-compose 设置的外部容器:

mysql:
    image: mysql:5.6
    volumes:
        - /data/mysql:/var/lib/mysql
        - ./docker/mysql.d:/etc/mysql/conf.d
    ports:
        - "3306:3306"
    environment:
        MYSQL_ROOT_PASSWORD: password

应用程序有自己的 docker-compose.yml 并引用 mysql 容器:

my-application:
    build: . # the Dockerfile resides in the current folder
    ports:
        - "9180:80"
        - "9543:443"
    external_links:
        - mysql_mysql_1:mysql
environment:
    DOCKER_ENVIRONMENT: dev
    DB_NAME: local_db
    DB_PASS: password
    DB_USER: root
    DB_HOST: # how to set the mysql's IP address?

我无法在 docker-compose 中传递它们,因为它是动态的。

我知道应用程序知道 mysql IP 地址,因为我设置了某些变量:

application-container$ env|grep ADDR 
    MYSQL_PORT_3306_TCP_ADDR=172.17.0.241

但这不是我需要的DB_HOST。

我可以以某种方式将变量映射到DB_HOST 或进行不同的设置吗?

【问题讨论】:

  • 为什么你的 mysql 服务器在一个外部的 docker-composer.yml 文件上?这真的需要吗?通常,如果您有需要一起运行的容器化应用程序,则必须仅在一个 docker-composer.yml 中进行配置。
  • @nessuno 我想将那个 mysql 容器用于多个项目。我不需要 12 台 mysql 服务器飞来飞去。此外,我将 mysql 数据映射到位于/data/mysql 的大型 HDD,因为 mysql 数据库可能变得非常庞大。如果你有多个 mysql 实例映射到同一个文件夹会导致文件系统锁定问题。
  • 你可以把mysql容器配置和你的应用程序放在一起,我猜你只需要运行带有--no-recreate标志的docker-compose。之后你只有一个 mysql 容器,你可以直接在 docker-compose.yml 文件中使用他的名字引用那个容器。因此使DB_HOST: mysql.
  • @nessuno 然而,当我有另一个项目也需要一个 mysql 容器时,如果两个 mysql 容器都启动了,我将拥有两个 mysql 容器。如果两者都映射到同一个目录,它们就会互相锁定。我只想要一个 mysql 容器,用于我可能在我的机器上开发的所有应用程序。
  • 旁注:我不认为我最初的目标是让外部数据库容器成为一个好的解决方案。相反,每个应用程序堆栈都应该独立工作。

标签: docker ip docker-compose


【解决方案1】:

您不必设置 IP,但可以引用容器的虚拟 主机名,这与您命名链接容器的值相同。

这意味着您确实可以在docker-compose.yml 中设置 DB_HOST,可以使用links(推荐)或external_links:

your_application:
    build: .
    ports:
        - "9180:80"
        - "9543:443"
    external_links:
        - mysql_mysql_1:docker-mysql
    environment:
        DB_HOST: docker-mysql

当你连接到你的 docker 容器时,你可以连接到你的 mysql 容器:

application-container $ mysql -h docker-mysql -uroot -ppassword -p 3360

当您从同一个 docker-composer.yml 链接容器时,它的工作原理也是一样的。

这也是documented:

链接到另一个服务中的容器。要么指定服务 名称和链接别名 (SERVICE:ALIAS),或者只是服务名称 (也将用于别名)。

links:
 - db
 - db:database
 - redis

将在 /etc/hosts 里面创建一个带有别名的条目 此服务的容器,例如:

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

还将创建环境变量 - 有关详细信息,请参阅 environment variable reference。

【讨论】:

  • 注意,从今天开始使用 docker-compose 文件的第 2 版,不再创建环境变量引用。见docs.docker.com/compose/link-env-deprecated
  • @MartinGOYOT 这是真的。在版本 2 中,由于网络发生了变化,容器应该能够开箱即用地相互连接。我会检查是否可以添加版本 2 示例。如果您现在正在创建它,您也可以发布版本 2 的新答案。
  • 你的答案在版本 2 上运行良好。我只是说“环境变量也将被创建 - 有关详细信息,请参阅环境变量参考。”
  • 谢谢!我一直尝试连接到“localhost”或“127.0.0.1”,但我从来没有想过使用可以在docker-compose ps 中找到的容器名称。
猜你喜欢
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
相关资源
最近更新 更多