如何使用本地主机从一个容器引用到另一个容器

时间:2019-08-08 08:24:32

标签: docker networking localhost containers

我正在为当前正在研究的Ruby-on-Rails项目构建docker容器,以便可以使用Visual Studio Code的远程功能来开发此项目。在不使用docker容器的情况下,该项目仍应继续工作,因此,我无法对现有代码进行重大更改,而这会危及这一点。

应用程序服务器(Rails)需要连接到在单独容器中运行的MySQL数据库。数据库容器名为db,我可以使用db主机名从应用程序容器连接到该容器。

rails的database.yml配置文件定义了如何连接到数据库,但这是我的问题所在。我不想将主机更改为db而不是localhost,因为这意味着普通用户(不使用Docker容器)将不再能够连接到数据库而无需更改此设置文件。我该如何以某种方式启动或更改docker配置,以便在应用程序容器内部以db而不是localhost的身份访问db

database.yml

default: &default
  adapter: mysql2
  username: ****
  password: ****
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: ****
  # setup local port forwarding for this to work
  host: db
  port: 3306

docker-compose.yml

version: '3.7'

services:
  db:
    build: ./unipept-db
    environment:
      MYSQL_ROOT_PASSWORD: ****
      MYSQL_DATABASE: ****
      MYSQL_USER: ****
      MYSQL_PASSWORD: ****
    restart: always
    ports:
      - "3306:3306"
    hostname: mysql
  phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin
    ports:
      - '8080:80'
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: ****
    restart: always
  app:
    depends_on:
      - db
    build: ./unipept-application
    command: sleep infinity
    ports:
      - '5000:5000'
    volumes:
      - ~/.gitconfig:/root/.gitconfig
      - ..:/workspace

2 个答案:

答案 0 :(得分:2)

用户network_mode: "host"在您的APP配置中,然后您可以使用DBAPP调用localhost:PORT

phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin
    ports:
      - '8080:80'
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: ****
    restart: always
    network_mode: "host"
  app:
    depends_on:
      - db
    build: ./unipept-application
    command: sleep infinity
    ports:
      - '5000:5000'
    network_mode: "host"
    volumes:
      - ~/.gitconfig:/root/.gitconfig
      - ..:/workspace

PS:使用主机网络模式时,已发布的端口将被丢弃

答案 1 :(得分:0)

如果将其设置为database.yml.erb文件中的环境变量,则可以配置它。您甚至已经有一个示例。您可以设置:

host: <%= ENV.fetch('DB_HOST', 'localhost') %>

在开发中,只需不设置环境变量,它将使用localhost。在Docker环境中,请进行设置,它将使用该主机名。

version: '3'
services:
  db:
    image: mysql
  app:
    build: .
    environment:
      DB_HOST: db
    ports:
      - '5000:5000'

您还应该以相同的方式传递数据库凭据之类的信息。