簡體   English   中英

使用docker-compose的Rails應用不會連接到mysql容器

[英]Rails app using docker-compose wont connect to the mysql container

嘗試使用docker-compose運行Rails應用程序。 我運行docker-compose build,它沒有錯誤完成。 然后我運行docker-compose up,兩個容器都啟動了。 然后我運行docker-compose運行web rake db:create db:migrate並遇到錯誤:

耙子流產了! Mysql2 :: Error :: ConnectionError:無法連接到“ 127.0.0.1”上的MySQL服務器(111“連接被拒絕”)

我的Dockerfile:

FROM ruby:2.5.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs mysql-client sqlite3 zlib1g-dev libxslt-dev git  && \
gem install bundler
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

Docker組成

version: '3.3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'online_community_development'
      MYSQL_ROOT_PASSWORD: '******'
      MYSQL_HOST: 'localhost'
    ports:
      # <Port exposed> : < MySQL Port running inside container>
      - '3306:3306'
    expose:
      # Opens port 3306 on the container
      - '3306'
      # Where our data will be persisted
    volumes:
      - 'my-db:/var/lib/mysql'
    container_name: datab




  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
    - web-app:/myapp
    ports:
    - "3000:3000"
    depends_on:
    - db
    links:
      - db:db
    restart: always

volumes:
  my-db: {}
  web-app: {}

數據庫.yml

development:
  adapter: mysql2
  encoding: utf8
  database: online_community_development
  pool: 5
  username: root
  password: slumland
  socket: /var/run/mysqld/mysqld.sock
  host: db

docker的新手,所以甚至不確定我是否正確發出了命令。 我需要創建數據庫並為其添加種子,並讓應用容器連接到該數據庫。 我認為問題與嘗試通過localhost連接有關,但是即使將主機更改為db,我仍然得到相同的結果。 任何幫助將不勝感激。

tl; dr:
試試這個docker-compose.yml

version: '3.3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'online_community_development'
      MYSQL_ROOT_PASSWORD: '******'
      MYSQL_HOST: 'localhost'
    expose:
    # Opens port 3306 on the container
      - '3306'
    # Where our data will be persisted
    volumes:
      - 'my-db:/var/lib/mysql'
    container_name: datab

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    environment:
      DATABASE_URL: 'mysql2://db'
      RAILS_ENV: 'development'
    volumes:
    - web-app:/myapp
    ports:
    - "3000:3000"
    depends_on:
    - db
    restart: always

volumes:
  my-db: {}
  web-app: {}

詳細:
首先,您的docker-compose -file有點配置錯誤。
因此,在轉到您的問題之前,我將對docker docker-compose.yml -files做一個docker-compose.yml說明。

links: -thing是遺留下來的特征docker ,你應該嚴格避免:
https://docs.docker.com/compose/compose-file/#links
而且,在使用docker-compose時甚至不需要

另外,在定義數據庫服務時,您使用的是expose:ports:
ports -key在主機上打開一個端口,並將其轉發到docker-service:
https://docs.docker.com/compose/compose-file/#ports
在數據庫定義上使用ports -key可使www訪問數據庫-在大多數情況下,這不是您想要的。

expose鍵在創建的docker網絡中本地打開端口。
https://docs.docker.com/compose/compose-file/#expose
這就是我們想要的數據庫。

編輯docker-compose.yml -file將導致以下結果:

version: '3.3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'online_community_development'
      MYSQL_ROOT_PASSWORD: '******'
      MYSQL_HOST: 'localhost'
    expose:
    # Opens port 3306 on the container
      - '3306'
    # Where our data will be persisted
    volumes:
      - 'my-db:/var/lib/mysql'
    container_name: datab

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
    - web-app:/myapp
    ports:
    - "3000:3000"
    depends_on:
    - db
    restart: always

volumes:
  my-db: {}
  web-app: {}

回到您的主要問題:
rake aborted! Mysql2::Error::ConnectionError: Can't connect to MySQL server on '127.0.0.1' (111 "Connection refused")

看起來rake希望該數據庫可在localhost -因此,我認為此問題的原因是配置錯誤。
不幸的是,我對rake不太熟悉,但是您的database.yaml看起來正確。
我做了一些研究,發現這篇文章:
瑞克任務似乎忽略了database.yml配置
也許您可以嘗試在docker-compose -file文件中設置環境變量DATABASE_URLDATABASE_URL=mysql://db
我還建議設置正確的context-environment-variable: RAILS_ENV=development

當您進行所有這些更改時,您應該想到以下docker-compose.yml

version: '3.3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'online_community_development'
      MYSQL_ROOT_PASSWORD: '******'
      MYSQL_HOST: 'localhost'
    expose:
    # Opens port 3306 on the container
      - '3306'
    # Where our data will be persisted
    volumes:
      - 'my-db:/var/lib/mysql'
    container_name: datab

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    environment:
      DATABASE_URL: 'mysql2://db'
      RAILS_ENV: 'development'
    volumes:
    - web-app:/myapp
    ports:
    - "3000:3000"
    depends_on:
    - db
    restart: always

volumes:
  my-db: {}
  web-app: {}

希望這可以幫助。

問候,
赫爾姆西

您的數據庫似乎配置為僅在本地主機上偵聽。 不幸的是,由於您的應用程序在技術上是組合網絡中的另一個網絡主機(容器),因此無法使用。 嘗試讓您的數據庫在所有網絡接口上偵聽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM