5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Docker内mysqlを繋ぐまでの話。【コピーOK】

Last updated at Posted at 2020-04-23

####環境
mysql8.0.9
rails2.6.3

##config/database.ymlファイルは以下の通り。

config/database.yml
    default: &default
      adapter: mysql2 #使うデータベースはmysqlを宣言する。アプリ内にもインストールしといてください。
      encoding: utf8mb4
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
      username: root  #mysqlのユーザ名です。docker_compose.ymlmのMYSQL_USERと同じにする必要があります。
      password: password  #mysqlにログインするために必要なパスワード。docker_compose.ymlmのMYSQL_PASSWORDと同じにする必要がある。

    development:
      <<: *default
      host: db  #docker_compose.ymlと同じにする必要がある。今回はdbという名前になります。
      database: portfolio_development  #docker_compose.ymlのMYSQL_DATABASEと同じ名前にする必要がある。

    test:
      <<: *default
      database: portfolio_test  #ここはとりあえずこの名前にしとく。

    production:
      <<: *default
      database: AWSのRDSの識別子
      host: エンドポイント

##docker_compose.ymlファイルは以下の通り。
わかりやすいように環境変数を使わない形で記述しました。実際に参考にする場合は環境変数を使用してください。

docker_compose.yml
version: '3'
services:
  db:  #database.ymlのhostと同じにする必要がある。今回はdbという名前にします。
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password   #必須です。ないと動きません。docker_compose.ymlファイルだけに書けばOKです。
      MYSQL_DATABASE: portfolio_development   #database.ymlのdevelopmentと同じ名前にする必要があります。
      MYSQL_USER: root  #mysqlにログインするユーザー。database.ymlのusernameと同じにする必要がある。
      MYSQL_PASSWORD: password  #mysqlにログインするパスワードです。自身で設定する必要があり、database.ymlのpasswordと同じにする必要がある。
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
    - ./tmp/db:/var/lib/mysql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
    command: bundle exec rails server -b 0.0.0.0
volumes:
  mysql-data:
    driver: local

##上記ファイルのポイント
・ローカルアプリ内のdocker-compose.ymlファイルにはMYSQL_ROOT_PASSWORDが必須。

・ローカルアプリ内のdocker-compose.ymlファイル内のコンテナ名を、database.ymlファイル内のdevelopment内のhost名にする必要がある。

・docker-compose.ymlファイル内のMYSQL_USER名とMYSQL_PASSWORDはdatabase.ymlファイルで設定したユーザ名、パスワード名と一致させる必要がある。

・MYSQL_ROOT_PASSWORDはdocker-compose.ymlファイル内で定義する。

・dockr-compose.ymlファイルのMYSQL_DATABASEはdatabase.ymlファイルで設定したdatabase:と同じにする。

これら5こ覚えてりゃOK。だいたいミスするのは上記の部分。

##つまづいた点

image.png

#Unknown MySQL server host 'db' (-2)。

gemfile内のdevwlopmentnimysql2を書いてなかったのが原因かも。
他にも解決策はあるので注意。

###Docker内でmysqlを繋ぐ際に便利なコマンド

 mysql -u root -p

ユーザ名が合わなくて何度も使った。
mysqlにログインする。事前にmysql.server startを行う必要がある。
このコマンドを入力した後にパスワードを求められるが、初めて使用する場合は間髪入れずエンター押してもOK。その場合のパスワードは空白になる。そんな感じでいろいろパスワードを決めれます。
初めてではない場合は登録しているパスワードを入力して、中でパスワードを更新する必要がある。この更新のsql文がmysqlのバージョンによって異なるようなので注意。
当然パスワードを空白にすればdatabase.ymlとdocker_compose.ymlのパスワードの欄は空白で良い。

 docker rmi $(docker images -q)

イメージを削除する。ちょっと危険。

docker-compose down --volumes

ボリュームを削除する。
database.yml、dockder_compose.ymlが正しく入力されているのにUnknown database ''とか言われる場合は過去のボリュームを参考にしてる場合が多い。

docker-compose up -d --build

コンテナの作成。

docker rmi ID名  -f

強制削除。docker imagesで表示したイメージ名のIDを指定すれば削除できる。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?