【问题标题】:Docker Compose: Allow images to access host resources (like postgresql)Docker Compose:允许镜像访问主机资源(如 postgresql)
【发布时间】:2016-07-31 16:51:51
【问题描述】:

我们的基础架构使用 Docker 容器来分离我们的服务。我开始设置我们的 docker-compose 来帮助本地开发。

我们的一些服务使用 Ruby on Rails 框架,通过在本地运行服务器和数据库(传统的 Rails 开发),在本地进行开发是最快的。

为了更接近地模拟生产环境,docker-compose 会很有用。我们的数据库不是临时的(它们曾经是:P),因此我们不会将它们作为 docker 容器运行。

鉴于此,如何构建我的 docker-compose 以允许 Rails 容器连接到主机的数据库(本例中为 Postgresql)?本地数据库中有大量数据可用于对应用程序进行冒烟测试。

【问题讨论】:

  • 数据库经常在容器中运行,数据只是存储在一个volume中以保持持久性。

标签: ruby-on-rails postgresql docker docker-compose


【解决方案1】:

我猜你不想手动访问server容器内的主机IP地址。

您可以使用extra_hosts并将主机IP地址导出为环境变量:

service:
  image: alpine:3.4
  extra_hosts:
    - "host:${HOST_IP}"
  command: cat /etc/hosts

很遗憾docker-compose 不支持"host:$(ip -4 addr show ...)" 之类的东西。 因此,要使此功能正常工作,每个开发人员都必须编辑他们的 .bashrc(或他们正在使用的任何内容)。

在我的机器上,这给了我正确的本地 IP 地址:

ip -4 addr show|grep brd|egrep -o 'inet ([0-9]+\.){3}[0-9]+'|cut -d ' ' -f2

替代方案

或者您也可以将数据库配置为也侦听docker0 接口,然后将您的docker-compose.yml 编辑为如下所示:

service:
  image: alpine:3.4
  extra_hosts:
    - "host:172.17.0.1"
  command: cat /etc/hosts

【讨论】:

    【解决方案2】:

    最好的方法是在容器中运行数据库。

    数据库不是临时的,因此我们不会将它们作为 docker 容器运行。

    这个说法是错误的。您可以在 Docker 容器中运行数据库。只需确保使用卷将数据存储在主机上的知名目录中即可。这样,如果数据库停止,它将返回相同的数据。

    一旦您在容器中拥有数据库,就很容易从其他容器连接到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-12
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多