■ 実現したいことは以下の通りです。
①ローカルでDocker-compose.ymlにてアプリ用コンテナ(Rails)とデータベース用コンテナ(MySQL)を作成
②作成したアプリ用コンテナとデータベース用コンテナからDockerイメージを作成 (docker commitコマンド使用)
③作成したアプリ用コンテナイメージとデータベース用コンテナイメージを第三者に公開
④第三者がアプリ用コンテナイメージとデータベース用コンテナイメージから各々、コンテナを起動
■前提
Mac Catalina(10.15.4)
Rails:6.0.3
Ruby:2.6.5
MySQl:5.6
発生している問題・エラーメッセージ
上の手順において、④で配布したイメージからアプリ用コンテナ、データベース用コンテナを起動しましたが、
ブラウザで「localhost:3000」接続した時に、以下エラーが表示されます。railsとdbの接続がうまくいっていない模様。
Mysql2::Error::ConnectionError Unknown MySQL server host 'db' (-2) Extracted source (around line #90): 88 89 90 91 92 93 conn_attrs = parse_connect_attrs(opts[:connect_attrs]) connect user, pass, host, port, database, socket, flags, conn_attrs end def parse_ssl_mode(mode)
①で使用したDockerComposeファイル
version: "2" services: db: #データベース用コンテナの定義 image: mysql:5.6 #ベースとなるバージョン5,6のmysqlイメージを公式リポジトリより取得 command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci #文字コードの設定 environment: MYSQL_ROOT_PASSWORD: xxxxxxx #データベースユーザ「root」のパスワード MYSQL_DATABASE: memory_tank_development #データベース名 volumes: - mysql-data:/var/lib/mysql #名前付きボリュームでデータを永続化 ※ Dockerの管理下にデータを保管 ports: - "4306:3306" #ポート設定 app: #アプリ用コンテナの定義 tty: true #コンテナ上でbinding.pryするために必要 stdin_open: true #コンテナ上でbinding.pryするために必要 build: . #DockerFileを素にコンテナイメージを作成 command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" #railsの起動 volumes: - .:/memory_tank #ローカルのディレクトリをコンテナにマウント - bundle:/usr/local/bundle #bundle installした後buildし直さなくてよくなる ports: - "3000:3000" #ポート設定 depends_on: #作成順序の設定 「db」→「app」 - db volumes: mysql-data: #名前付きボリューム bundle: #bundle installした後buildし直さなくてよくなる
①で使用したDockerファイル
#アプリ用コンテナの素 #以下、「memory_tank」の部分は適宜、自分のアプリ名にする #ベースとなるバージョン2.6.5のrubyイメージを公式リポジトリより取得 FROM ruby:2.6.5 #コンテナ内のパッケージ管理を最新状態にする #前提ソフトウェア(nodejs、mysql)や保守用にvimをインストール。「--no-install-recommends」オプションを付け、recommendされた不要なソフトウェアはインストールしない #イメージ軽量化のためにapt-getリストをクリア RUN apt-get update && \ apt-get install -y nodejs default-mysql-client vim --no-install-recommends && \ rm -rf /var/lib/apt/lists/* #アプリ用ディレクトリの作成 RUN mkdir /memory_tank #ワークディレクトリを設定 WORKDIR /memory_tank #ローカルのGemfileをアプリ用コンテナにコピーする ADD Gemfile /memory_tank/Gemfile ADD Gemfile.lock /memory_tank/Gemfile.lock #アプリ用コンテナにgemをインストール RUN gem install bundler RUN bundle install #ローカルのアプリファイルをまるっとアプリ用コンテナにコピー ADD . /memory_tank
ローカルのrailsアプリにおける「database.yml」ファイル
default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: xxxxxxx host: db ←docker-compose.ymlの記載と合わせる development: <<: *default database: memory_tank_development test: <<: *default database: memory_tank_test production: <<: *default database: memory_tank_production username: memory_tank password: <%= ENV['MEMORY_TANK_DATABASE_PASSWORD'] %>
④にてきちんとコンテナ自体は起動できています
docker run -d --network test-network -p 3000:3000 (②で作成したイメージのID) ←アプリコンテナの起動 docker run -d --network test-network -p 4306:3300 (②で作成したイメージのID) ←データベース用コンテナの起動 name@nameMacBook-Pro ~ % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 12e7c17671af 7f34804a3d43 "docker-entrypoint.s…" 11 seconds ago Up 7 seconds 0.0.0.0:4306->3306/tcp, :::4306->3306/tcp kind_kapitsa a390537ec8e3 b1a36b20edc6 "/bin/sh -c 'rm -f t…" About a minute ago Up About a minute 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp goofy_gagarin 022d3a5f2721 b1a36b20edc6 "/bin/sh -c 'rm -f t…" 2 minutes ago Created admiring_euler
最後に
Docker学習仕立てで理解が不十分なところもありますが、アドバイス等頂けますと幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。