20210413のdockerに関する記事は11件です。

【Docker】MySQLに接続できないエラー(php_network_getaddresses: getaddrinfo failed: Name or service not known)

Dockerを用いてlaravelの環境構築を試みている時に起こったエラーです。 開発環境 Docker 20.10.5 docker-compose 1.28.5 php 7.2 laravel 7.30.4 Composer 2.0.12 MySQL 8.0 nginx 1.15.12-alpine エラー Dockerで作成したコンテナに入り、MySQLに接続するために php artisan migrateを実行するとターミナルに下記のエラーが表示される。 Illuminate\Database\QueryException SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (SQL: select * from information_schema.tables where table_schema = development and table_name = migrations and table_type = 'BASE TABLE') at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671 667| // If an exception occurs when attempting to run a query, we'll format the error 668| // message to include the bindings with SQL, which will make this exception a 669| // lot more helpful to the developer instead of just the database's errors. 670| catch (Exception $e) { > 671| throw new QueryException( 672| $query, $this->prepareBindings($bindings), $e 673| ); 674| } 675| +36 vendor frames 37 artisan:37 Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 解決策 調べてみると上記エラーは.envでホスト名が間違ってる時に出るものだそうです。 .env DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=laravel_local DB_USERNAME=laravel_user DB_PASSWORD=laravel123 docker-compose.yml version: '3' services: #省略 mysql: image: mysql:8.0 container_name: app_db ports: - 3306:3306 environment: MYSQL_DATABASE: laravel_local MYSQL_ROOT_USER: root MYSQL_ROOT_PASSWORD: root MYSQL_USER: laravel_user MYSQL_PASSWORD: laravel123 TZ: 'Asia/Tokyo' volumes: - ./docker-config/mysql/data:/var/lib/mysql - ./docker-config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf depends_on: - mysql-volume mysql-volume: image: busybox volumes: - ./docker-config/mysql/data:/var/lib/mysql #省略 .envの中のDB_HOST=dbが誤ってるということなので調べてみると、 DB_HOSTはserviceの名前らしいです。 今回はdocker-compose.ymlでmysqlと命名しているので合わせる必要があります。 .env DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=laravel_local DB_USERNAME=laravel_user DB_PASSWORD=laravel123 これで再度コンテナ内でphp artisan migrateを実行すれば上記のエラーは解消されます。 おまけ(SQLSTATEエラー) このエラーは.envのどこの設定が間違っているかで表示されるものが違うんじゃないかと思い、ロールバックして試してみます。 DB_CONNECTIONが異なる場合 Database connection [DB] not configured. DB_PORTが異なる場合 SQLSTATE[HY000] [2002] Connection refused DB_HOSTが異なる場合 SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known DB_DATABASEが異なる場合 SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'%' (using password: YES) DB_USERNAMEが異なる場合 SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client DB_PASSWORDが異なる場合 SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'%'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails6にdelayed_jobでメールの非同期実行を実装し、AmazonLinux2のマルチDockerのコンテナで動かす

新規サービスの立ち上げでメールの非同期実行処理を実装するのに、delayed_jobを使う。 まだユーザーも多くないし、実装やお金の面でもとりあえず低コスト。 AWSのElasticBeanstalkでAmazonLinux2のマルチDokckerプラットフォームでの実装の備忘録。 前提 docker for mac でrailsアプリケーションを動作させていること。 アプリケーションのコンテナ名をwebとし、docker-compose run --rm webのエイリアスを dcrw として登録していること。(コマンドで使っているので読み替えて下さい。) delayed_jobの基本的な実装 Gemfile gem 'delayed_job_active_record' gem 'devise-async' # devise のメールを非同期実行するのに必要。 docker-compose build dcrw rails g delayed_job:active_record dcrw rails db:migrate bin/delayed_job が生成される。 delayed_jobsテーブルがcreateされる。 que_adapterを設定。 config/application.rb config.active_job.queue_adapter = :delayed_job コンテナとして起動。 本番用のdocker-compose.ymlもこれに準拠。 docker-compose.yml version: '3' services: # webコンテナとworkerのコンテナを共通化。 app: build: . ... web: extends: service: app command: ["sh", "-c", "rm -f tmp/pids/server.pid; bin/rails server -b 0.0.0.0"] ... jobworker: # このコンテナを追加。 extends: service: app command: bundle exec bin/rails jobs:work ... 参考 GitHub - collectiveidea/delayed_job: Database based asynchronous priority queue system -- Extracted from Shopify Railsでの非同期処理とDelayed Job | RE:ENGINES Railsで非同期処理の実装 - eviry tech & service blog deviseのメール対応 これだけだとdeviseが送信するメールは非同期処理の対象にならない。 devise-asyncgemをインストールし、deviseを適用しているモデルのdeviseの設定に:asyncを追加。 Readmeで書かれているオプションのDevise::Async.enabled = trueだけでは非同期にならず。 devise :database_authenticatable, :recoverable, :rememberable, :validatable, :async # 追加 参考 deviseで送信されるメールを非同期処理にする方法 - Qiita GitHub - mhfs/devise-async: Send Devise's emails in background. Supports Resque, Sidekiq, Delayed::Job and QueueClassic. Rspecでキューイングしたメールのテストを行う 細かいことは参考のリンク先参照。 メールの本文までテストするのに、キューに入れたメールを実行する必要がある。 perform_enqueued_jobs メソッドを使う。 spec/rails_helper.rb RSpec.configure do |config| config.include ActiveJob::TestHelper # 追加 end specのメール送信処理をperform_enqueued_jobs ブロックで囲う。 spec/feature/xxx_spec.rb ... expect { perform_enqueued_jobs { click_button '送信する' } }.to change { ActionMailer::Base.deliveries.size }.by(1) mail = ActionMailer::Base.deliveries.last expect(mail.subject).to have_content('メールタイトル') expect(mail.body).to have_content('メール本文…') 参考 RSpec でキューイングした ActiveJob を同期実行する - Qiita ActiveJob::TestHelper AWSでのエラー備忘録 AWSにデプロイした際に、コンテナが落ちる現象が発生。 ログの出力を制御できていなくて時間食ったが、アプリケーションのログにエラーを吐いていた。 docker logs [docker id] するとアプリケーションのログが見れる。 原因はDBに接続していなかったこと。 ENVの設定が必要だった。 参考 How to know the reason why a docker container exits? - Stack Overflow
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IntelliJ + Dockerでローカル環境を極力汚さずPHP+MySQL開発環境を構築する

概要 PHP + MySQL の環境を docker-compose で構築し、IntelliJ上でdockerに接続してPHPUnitをする手順を記載してます。 Docker上に構築した実行環境を使うようにすることで、いちいちローカルにPHPやMySQLをインストールしなくてもよくなるようになり、ローカル環境の汚染を防ぐことができ、「案件によって使うMySQLのバージョンが異なるせいで毎回再インストールしないといけないんだよぉ」みたいな煩わしさから解放されます。 かつ、ローカルに環境を構築していた時と同様にIDEからサクっとテストを走らせることができるため、なんかハッピーなアレになれます。多分。 実行環境 Windows 10 64bit IntelliJ Ultimate Edition 2021.1 Docker Desktop v20.10.5 今回はWindowsで構築したけど、Macでも普通にできるはず。 前提 DockerやIntelliJ はインストール済 IntelliJ のプラグインのインストール 以下をインストールしておきます。 PHP PHP Docker PHP Remote Interpreter PHPUnit Enhancement Docker とりあえずトライ&エラーで入れたプラグインなんで、いくつか不要なものもあるのかも。 Dockerfileなどの作成 以下のフォルダ構成にします。 <Root> ・ local // Docker環境用 ├ php │ ├ php.ini │ └ Dockerfile └ mysql // 最終的にデータファイルが入る ・ src // ソースファイル ・ docker-compose.yml local/php/Dockerfile FROM php:7.2-fpm RUN apt-get update RUN apt-get install -y vim git zip unzip RUN docker-php-ext-install pdo_mysql COPY --from=composer /usr/bin/composer /usr/bin/composer COPY php.ini /usr/local/etc/php/ local/php/php.ini date.timezone = "Asia/Tokyo" docker-compose.yml version: '3' services: # Webサーバーとして動かす場合(今回はユニットテスト書くのが目的なのでこの部分は割愛) # nginx: # image: nginx:latest # ports: # - 8080:80 # volumes: # - ./local/nginx/nginx.conf:/etc/nginx/conf.d/default.conf # - ./src:/var/www/html # depends_on: # - php php: build: ./local/php volumes: - ./src:/var/www/html depends_on: - db db: image: mysql:5.7 ports: - 13306:3306 volumes: - ./local/mysql/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: password container_name: mysqldb phpmyadmin: image: phpmyadmin/phpmyadmin:latest ports: - 8888:80 depends_on: - db これらのイメージ&コンテナを作成しておき、 phpにCLIで入って、 composer install をやっておきます。 IntelliJの設定 Dockerの設定 File -> Settings にてSettingsダイアログを出し、 Build, Execution, Deployment -> Dockerを選択します。 ひとつDockerのサービスを作成しておけばOKです。 PHPの設定 Languages & Frameworks -> PHP を選択し、CLI Interpreter の「...」ボタンを押下 CLI Interpreters から設定を作成し、「From Docker, Vagrant, VM, WSL, Remote...」を選択 Docker Composeを選択し、実行サービス(今回の例だとphp)を選択します。 最初の設定のは不要な場合は削除しちゃいます。 PHPUnitの設定 Languages & Frameworks -> PHP -> Test Frameworks を選択し、CLI Interpreter に、上記で作成したインタプリタを選択します。 テストの設定 最後に、 実行の設定を行います。 Run / Debug Configurationsから、PHPUnitのを作成 あとはいつも通りの感じでテストを起動すると、IntelliJ は自動的にDocker上の実行環境を使ってテストを行い、MySQLにも接続するテストが実行できます。 まとめ いい時代になりましたねぇ。Docker便利。 そのうちGoやJavaやFlutterとかも同様のやり方でできないか調べたい
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[CentOS] Webサイト公開までのメモ

CentOS(7), Nginx, Docker, SSL ファイアウォールの設定 webサーバーの運用で必要になるport 80を解放する必要がある。 ファイアウォールの設定を変更。 $ firewall-cmd --zone=public --add-service=http --permanent 再起動 $ firewall-cmd --reload Nginxのインストール $ sudo yum install nginx Nginxの設定 server_nameとrootを任意のものに変更する /etc/nginx/nginx.conf # example ... server { server_name raihara3.fun; root /var/www/html; ... } 変更を加えたらnginx -t でsyntaxのチェック。 Nginxの起動 起動 systemctl start nginx 再起動 systemctl restart nginx 停止 systemctl stop nginx トラブルシューティング 以下のエラーが出た時、エラーログを確認してみる。(/var/log/nginx/error.log) $ systemctl restart nginx Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details. [emerg] 8090#0: bind() to 0.0.0.0:80 failed (98: Address already in use)と出力されていた場合はsudo fuser -k 80/tcpをしてから再度試す。 fuserコマンドが使えない場合はインストール(yum install psmisc) Githubからpullする keyを発行し、公開鍵をgithubに設定してからpullする。 $ ssh-keygen Nodeのインストール ndenvのインストール $ git clone https://github.com/riywo/ndenv ~/.ndenv pathを通す $ echo 'export PATH="$HOME/.ndenv/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(ndenv init -)"' >> ~/.bash_profile ndenv install ~が使えるプラグインを入れる $ git clone https://github.com/riywo/node-build.git $(ndenv root)/plugins/node-build 任意のバージョンのnodeをインストール $ ndenv install 15.4.0 $ ndenv local 15.4.0 Dockerのインストール $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo $ sudo yum makecache fast 最新バージョンをインストール $ sudo yum install docker-ce 起動 $ systemctl start docker docker-composeのインストール $ sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose $ docker-compose --version Docker build ログインする # docker hub $ docker login # or ghcr $ docker login ghcr.io ユーザー名とパスワードの入力を求められる。 この時のpassは${CR_PAT}を入力する。 ログインしていないと以下のようなエラーがでる。 Sending build context to Docker daemon 668.9MB Step 1/18 : FROM ghcr.io/raihara3/... Head https://ghcr.io/v2/raihara3/...: unauthorized ビルド。 $ docker build -t IMAGE_NAME . docker-compose up $ docker-compose up SSL証明書の発行 Let’s Encryptを利用。 手順は公式から https://letsencrypt.org/ja/getting-started/ 発行したら、nginxの場合nginx.confに変更が加わっているので再起動 $ systemctl restart nginx 更にファイアウォールの設定を変更し、ポート443を解放して再起動する。 $ firewall-cmd --zone=public --add-service=https --permanent $ firewall-cmd --reload
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laradock+Docker+MySQL+Herokuでサイトを公開してみた。

記事を書くに至るまで 独学でProgate、ドットインストールなどを駆使してプログラミングを勉強している現大学生です。挫折をしながらLaradockで作ったサイトをHerokuで公開できたのでその方法を書き残しておきます。 まず、 どのように公開に至ったかというと、 自分のサイトを作りたい!→管理画面があるようなサイトを作りたい!→PHPでできるらしい!データベースはMySQLで!→laravelというフレームワークがあるらしい!→laradockというdockerとlaravelが合体したものがあるらしい! また、 自分のサイトを作りたい!→サーバーレスというのがあるらしい!→HerokuというPaaSがあるらしい! よってLaradock+Docker+MySQL+Herokuという環境に至りました。 より良い環境もあるかとは思いますが、ひとまず公開できたのでこのやり方を自分で見返すためにも紹介していきたいと思います。 はじめに 必要なもの(主はmacで開発しています) * docker-composeのインストール * docker環境(runnning状態であること) * Herokuのアカウント(無料ですが、クレジットカードの登録をしないとできないこともあるので登録が必要) これがあればとりあえずいけると思います。 まず デスクトップとかどこでもいいので、作成物をまとめるフォルダを作成して、そこにlaradockをダウンロードします。 $ mkdir MyLaradock $ cd MyLaradock $ git init $ git submodule add https://github.com/Laradock/laradock.git git submoduleとは何か?一旦無視で大丈夫です!このまま行きましょう。 説明しておくと、laradockは言うなれば、サイトの地盤作成キットのようなものです。なんでも入ってます。ですので開発するときは必要なものだけを起動させる必要があります。(という解釈で合ってますよね?) laradock内に移動してあげて、laradockの設定をしていきます。はじめにおおもとの設定ファイル.envを作る必要があります。laradock内にはenv-exampleというのがあらかじめあるのでそれを.envにしてあげるといいですね。 $ cd laradock $ cp env-example .env そしたら.envファイルの設定を少しいじります。つまりlaradockの設定をしていきます。 APP_CODE_PATH_HOST=../の部分を変えましょう。 これはwebアプリのソースファイル(laravelの中身)をどこにするかですが、わかりやすいように名前をつけておいた方がいいので、値を../srcなどに変更します。他にも変えておいた方がいい部分があるのでそれらもまとめて変更していきましょう。 .env APP_CODE_PATH_HOST=../ APP_CODE_PATH_HOST=../src //変更! COMPOSE_PROJECT_NAME=laradock COMPOSE_PROJECT_NAME=laradock-test //プロジェクト毎に新しいlaradock環境を作りたい場合変更しておく DATA_PATH_HOST=~/.laradock/data DATA_PATH_HOST=.laradock/data //データの保存先をlaradock毎に分離したい場合変更しておく これで/MyLaradock/srcの中にアプリのファイルが入る!とlaradockが認識してくれました。 それでは早速、/MyLaradock/srcの中にlaravelを入れていきましょう。ここからdockerと一緒に動かしていくことになります。 ここで立ち上げるのはworkspaceという、のちにlaravelを入れるためのコンテナ、そしてwebサーバーも必要ですのでnginxというwebサーバーも立ち上げます。 /MyLaradock/laradock $ docker-compose up -d workspace nginx docker-compose upというコマンドは、イメージを作成して、さらにコンテナを作成・起動するコマンドだと思っていただければOKです!docker-compose psとコマンドを打って、コンテナが稼働状態(Stateの部分がUpに)なっていれば大丈夫です。次に進みましょう! Laravelをworkspaceにダウンロード workspaceの中に入ってそこにlaravelをダウンロードしていきます。 /MyLaradock/laradock docker-compose exec workspace bash //workspaceの中に入ります //↓ここからworkspace内のコマンド↓ # composer create-project laravel/laravel . --prefer-dist //laravelをダウンロード # exit //コンテナから出る これで/MyLaradock/srcにlaravelのファイルがたくさん入ったかと思います。 しっかり入っているかページを確認してみましょう。 Macであればhttp://localhostにアクセスしてみて、laravelの画面になっていれば上手くいっています。ナイス!! データベースの設定をしていく 今回はMySQLを使っていきたいと思います。ちなみにHerokuでは無料で使用できるデータベースの容量に制限が設定されているのですが、容量的には圧倒的にPostgreSQLがいいです。今回は個人的にMySQLしか予習していなかったのでMySQLで構築していきます。 まず、/MyLaradock/laradock/.envのMYSQL_VERSIONの欄を5.7にします。設定しないと最新バージョンになるのですが、とある設定を追加でしないとエラーが出てしまうので、特に理由がなければ5.7にしましょう。 /MyLaradock/laradock/.env ### MYSQL ################################################# //変更後 MYSQL_VERSION=5.7 //ここを5.7にしました MYSQL_DATABASE=default MYSQL_USER=default .envファイルはlaradockのものとlaravelのものと複数あるので間違わないように注意しましょう。 バージョンを変更したらコンテナを起動させます。 /MyLaradock/laradock $ docker-compose up -d mysql 念の為またdocker-compose psでコンテナの稼働状態を確認しましょう。データベースのコンテナが稼働していたらOKです! laravelのデータベースの設定もしましょう。laravel内の.envを編集します。 /MyLaradock/src/.env DB_CONNECTION=mysql DB_HOST=mysql //mysqlに変更しました DB_PORT=3306 DB_DATABASE=default //laradock/.envのMYSQL_DATABASEと同じ値にする DB_USERNAME=default //laradock/.envのMYSQL_USERと同じ値にする DB_PASSWORD=secret //laradock/.envのMYSQL_PASSWORDと同じ値にする ここまで来たら設定はOKです!これからはlaravelをいじってサイトを作っていきますが、ここは自分の好きなようにサイトを作ってください。ここではサイト作成に必要な設定だけ紹介して、laravel自体のコマンドなどは省略させていただきます。 Laravel内の細かな設定 laravelをいじって、herokuで公開する上で色々とつまづいたところがあったのでここではその細かな設定をしていきます。 Target class [〇〇〇Controller] does not exist対策 RouteServiceProvider.php protected $namespace = 'App\Http\Controllers'; //追加 public function boot() { このようにすることでクラスがないと言われなくなります。 laravelをいじる上での一つの大きなエラーを起こす要因としてuse宣言や名前空間がうまくできていないということがあります。もしエラーが起きた場合は、その使っているクラスがきちんとuse宣言されているかなど確認すると良いかと思われます。 マイグレーション時のエラー対策 herokuの無料プランでは、通常の文字数だと規定のデータ量を超えてしまい、マイグレーション時にエラーが出てしまいます。そのために文字数を制限する必要があります。 AppServiceProvider.php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; //追加* class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { Schema::defaultStringLength(191); //追加* } HTTPに接続になってしまうことへの対策 このままデプロイしてサイトを作るとhttpになります(鍵マークがついていない状態)。herokuは安全なのでhttpであっても問題ないらしいのですが、できれば鍵マークついていた方が気持ち的にいいと思うので、一部変更してhttps接続になるようにします。 app/Http/MiddleWare/TrustProxies.php class TrustProxies extends Middleware { /** * The trusted proxies for this application. * * @var array|string|null */ protected $proxies = '*'; //これに変更する Herokuにデプロイする いよいよHerokuを使ってサイトを公開していきます! herokuにログインしてアプリを作成していきます。 場所は/MyLaradock上でターミナルを使ってログイン、アプリ作成して、アプリをリモートリポジトリとして登録していきます。また、herokuでサイトを公開するにはProcfileというものが必要なのでそれも作成します。 $ heroku login ログインしたら,,, $ heroku create [アプリ名(好きな名前をつけてください] --buildpack heroku/php $ git remote add heroku https://git.heroku.com/[アプリケーション名].git $ cd MyLaradock/src $ echo web: vendor/bin/heroku-php-apache2 public/ > Procfile ログインしてレポジトリを登録し、Procfileというものをsrcディレクトリ内に作成しました。 場所は再び/MyLaradockに戻しておいてください。 続いてherokuとデータベースの紐付けをしていきます。 herokuでデータベースを使うにはアドオンという機能を使ってデータベースを追加し、紐付け作業をします。MySqlを使うにはcleardbというアドオンを使います! $ heroku addons:add cleardb ここから紐付けして、このherokuアプリのデータベースはこれですよ、と教えてあげます。 どうやるかというと、cleardbにはCLEARDB_DATABASE_URLという値があります。この値とherokuのconfigを紐付けるといった感じですね。やっていきましょう。 $ heroku config | grep CLEARDB_DATABASE_URL CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true ///このurlを参考にして、それぞれの値を地道にheroku:configに入れていきます。/// $ heroku config:set DB_CONNECTION=mysql $ heroku config:set DB_DATABASE=[データベース名] $ heroku config:set DB_HOST=[ホスト名] $ heroku config:set DB_USERNAME=[ユーザー名] $ heroku config:set DB_PASSWORD=[パスワード] HerokuアプリにAPP_KEYを追加 herokuアプリに環境変数としてAPP_KEYを設定してあげる必要があります。 やっていきましょう。 $ cd MyLaradock/laradock $ docker-compose exec workspace php artisan --no-ansi key:generate --show base64:xxxxx /// この[base64:xxxxxxx]をheroku:configに設定します cd .. ///MyLaradockに移動 $ heroku config:set APP_KEY=base64:xxxxx $ heroku config ///これを実行してきちんと設定されているか確認しましょう。 最後! gitにpushしていきます! $ cd MyLaradock $ git add . $ git commit -m 'create laradock app' $ git subtree push --prefix src/ heroku master ///上だけだとデータベースの設定は反映されないので 'php artisan migrate'で設定を反映させて終わりです! $ heroku run "php artisan migrate" これでできるはずです ターミナルで heroku openを実行してきちんとサイトが表示されるか確認してみてください! 以上で終わりたいと思います。ここまで読んでくれてありがとうございます。 間違った認識をしている部分もあるかと思います!笑 指摘や上手くいかないときはコメントしていただけると幸いです!もっと理解を深めたいので(^^) ありがとうございました! どんどんlaravel勉強していくぞー! とても参考にしたサイトはこちら
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

04/17(土)用 Windows10にDockerでRails6+MySQLの環境構築

環境構築の手順書です。 山岡楓が制作しています。 Railsのデフォルトホーム画面を表示させるところまでです。 環境 Windows10 Ruby2.7.1 Rails6.0.3.1 MySQL8.0 1.Docker for Windowsをインストール https://hub.docker.com/editions/community/docker-ce-desktop-windows/ 上記リンクにアクセスしてインストールする。 インストールが出来たら一度再起動して、Dockerを起動させてください。 2.必要ファイルの作成 どこまでもいいので任意の場所にディレクトリを作成する。デスクトップとか。 ここではRails_appというディレクトリを作成します。(名前はなんでもいい) で、VScodeでフォルダを開いてください。 (エディターはなんでもいいですが、VScodeがいいと思います。) インストールがまだの場合は以下リンクからインストール https://azure.microsoft.com/ja-jp/products/visual-studio-code/ Dockerfileの作成 VScodeでディレクトリを開けたらディレクトリ内にDockerfileを作成し、 以下のように記述します。 FROM ruby:2.7 RUN apt-get update -qq && apt-get install -y nodejs yarnpkg RUN ln -s /usr/bin/yarnpkg /usr/bin/yarn RUN mkdir /app WORKDIR /app COPY Gemfile /app/Gemfile COPY Gemfile.lock /app/Gemfile.lock RUN bundle install COPY . /app # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process. CMD ["rails", "server", "-b", "0.0.0.0"] Gemfileの作成 次に同じ階層にGemfileを作成し、以下のように記述します。 source 'https://rubygems.org' gem 'rails', '~>6' もう一つGemfile.lockというファイルを作成します。 中身は空でOKです。 entrypoint.shの作成 次にDockerfileの中でENTRYPOINTとして定義しているentrypoint.shの作成をします。 entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /app/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@" docker-compose.ymlの作成 最後にdocker-compose.ymlというファイルを同階層に作成し、以下を記述してください。 docker-compose.yml version: '3' services: db: image: mysql:8.0 volumes: - ./tmp/db:/var/lib/mysql environment: - MYSQL_ALLOW_EMPTY_PASSWORD=1 web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/app ports: - "3000:3000" depends_on: - db MYSQL_ALLOW_EMPTY_PASSWORDを設定することでpasswordが空でもrootで接続できるようにしておきます。 3.Rails new / docker-compose buildを行う VScodeのターミナルを開き、作成したディレクトリの階層にいる事を確認したら、 以下を実行してください。 $ docker-compose run web bundle exec rails new . --force --database=mysql --forceは既存のファイルを上書き、--databaseでMySQLを指定しています。 実行完了したらビルドを行います。 $ docker-compose build 4、DBのホスト名の変更 / docker-compose upを行う 現状だとデータベースへの接続が出来ないので、 最初に作成したディレクトリ内に出来たconfig/database.ymlのhostの値をdbという値に置き換えてください。 ※全部コピペはしないでください。 database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: host: db development: <<: *default database: app_development test: <<: *default database: app_test ここのdbがコンテナ名になります。 これが出来たら再度docker-compose buildを行ってからdocker-compose upを行います。 この状態でlocalhost:3000に接続するとおそらくエラーが出ます。 Webコンテナがmysql8.0のcaching_sha2_password認証方式に対応していない為です。 次の手順で認証方式をmysql_native_passwordに変更します。 5.MySQLの認証方式の変更 まずDBコンテナに入ります。 (VScodeでdocker-compose upを行っていると思うので、powershellを使って該当のディレクトリを開いてください。) そこでbashを起動します。 docker-compose exec db bash その後、mysqlコマンドで接続します。 mysql -u root 場所がmysql>になっている事を確認したら、 下記のクエリを実行してみてください。 mysql> select User,Host,plugin from mysql.user; すると以下のようなユーザ一覧と認証方式が出てきます。 +------------------+-----------+-----------------------+ | User | Host | plugin | +------------------+-----------+-----------------------+ | root | % | caching_sha2_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | +------------------+-----------+-----------------------+ 5 rows in set (0.00 sec) 上記で出てきたrootのpluginにあるcaching_sha2_passwordをmysql_native_passwordに変更します。 今回対象のroot@%のユーザ設定をALTER USERを使って変更します。 下記のクエリを実行してください。 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY ''; 実行出来たら改めてselect User,Host,plugin from mysql.user;を実行すると、 +------------------+-----------+-----------------------+ | User | Host | plugin | +------------------+-----------+-----------------------+ | root | % | mysql_native_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | +------------------+-----------+-----------------------+ 5 rows in set (0.00 sec) 上記のような表示に変わっていると思います。 その後exitを2回実行して、元いた階層に戻ります。 で、階層が作成したディレクトリなのを確認出来たら以下を実行します。 $ docker-compose exec web bundle exec rails db:prepare 6.Railsのホーム画面にアクセス DBを作成し、localhost:3000すると、Railsのホーム画面にアクセスできるようになります。 環境構築は以上です。 お疲れ様でした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】エラー対処法:Error: Missing binding /usr/src/app/node_modules/node-sass/

Dockerでイメージをbuild後にコンテナを起動した時に、sass-loaderを現在のOS環境にバインドできないとのエラーが発生した。 エラー内容 bootstrap.js:4427 Uncaught Error: Module build failed (from ./node_modules/sass-loader/dist/cjs.js): Error: Missing binding /usr/src/app/node_modules/node-sass/vendor/linux_musl-x64-83/binding.node Node Sass could not find a binding for your current environment: Linux/musl 64-bit with Node.js 14.x Found bindings for the following environments: - OS X 64-bit with Node.js 12.x This usually happens because your environment has changed since running npm install. Run npm rebuild node-sass to download the binding for your current environment. Dockerの中で使っているのでlinux用のsass-loaderをインストールしなければいけないが、OS-X用のsass-loaderしかない状況。 以下対応をしたがエラーは直らず ・npm installはnpm rebuild node-sassを実行済み。 ・.dockerignoreにnode_modules/*を記載済み。 ・volumeでapp/node_modulesをコンテナ内のボリュームのみ割り当て、ホスト側とは同期しない。 発生原因 本来、コンテナの中でbootstrap関連のパッケージをインストールしなければいけないところ、ローカルで実施したためOS X用のsass-loaderしかインストールされなかった。 対処法 コンテナに入ってbootstrap関連のパッケージをインストールする。 #コンテナ名を確認 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88e9777dd7de ruby2.7.2 "bin/rails s -p 3000…" 4 minutes ago Up 4 minutes 0.0.0.0:3001->3000/tcp rails-app #コンテナに入る(laravelの場合はbash) $ docker exec -it rails-app sh /app # #コンテナの中でbootstrap関連パッケージをインストール /app # yarn add jquery bootstrap popper.js コンテナを再起動したところエラーが直った。 Dockerfileでyarnをインストールしているのでyarnを使用したが、npmのときはyarnをnpmに変更する。 まとめ docker上のプロジェクトでnpmのパッケージをインストールする場合はコンテナの中に入ってインストールする。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Amazon EC2 (Arm版)でdocker-composeを動作検証

はじめに 従来のMacよりも、圧倒的にコスパが高いとされているM1 Macが市場に出回り、ARMアーキテクチャを採用したCPUの導入事例も増えてきました。 私もこの流れに乗って、Amazon EC2(Arm版)でdocker-composeが正常に動作するのか検証しました。 今回の記事では、検証したことを記録していきます。 M1 Macでは、x86_64アーキテクチャ用のコンテナも動作しているので、個人的はEC2(Arm版)でも動いてくれることに少し期待しています。 共有事項 この記事から得られること Arm版CPUにdocker-composeコマンドを入れて、Armアーキテクチャ用のコンテナをビルド、実行することができる。 Amazon EC2(Arm版)でIntel用のコンテナの検証結果、過程が分かる。 事前に分かっていること x86_64環境でDockerfileをビルドしたコンテナをECRにpushしておき、M1 Macでコンテナをpullして使うことが出来る 今回動かしたいIntel用のコンテナがt3a.mediumインスタンス(Intel版)で動いている やりたいこと x86アーキテクチャのコンテナをAWS Graviton環境のt4g.mediumインスタンス(Arm版)で動かす 検証結果できなかったとしても、その過程を整理する 結論 Pythonのpackage manager pipを介する必要があるが、docker-composeはインストールできる x86_64アーキテクチャ用のコンテナはEC2のArmインスタンスでビルド、実行はできない。(2021年4月時点) 記録 docker-composeコマンドをインストール curlコマンドを使って、ソースファイルをビルドして、docker-composeコマンドをインストールしてみます。 x86_64環境の場合 $ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 633 100 633 0 0 18085 0 --:--:-- --:--:-- --:--:-- 18085 100 11.6M 100 11.6M 0 0 39.9M 0 --:--:-- --:--:-- --:--:-- 58.8M $ sudo chmod +x /usr/local/bin/docker-compose $ docker-compose --version docker-compose version 1.27.4, build 12345678 aarch64環境の場合 $ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 9 100 9 0 0 37 0 --:--:-- --:--:-- --:--:-- 37 $ sudo chmod +x /usr/local/bin/docker-compose $ docker-compose --version /usr/local/bin/docker-compose: line 1: Not: command not found curlコマンドを使って、ソースファイルをビルドして、docker-composeコマンドをインストールするプロセスだと、下記のようなエラーが出てしまいます。 原因は、アーキテクチャが違うため扱っているバイナリも異なっています。 $ docker-compose --version /usr/local/bin/docker-compose: line 1: Not: command not found Arm版のEC2インスタンスにdocker-composeコマンドを入れる解決策は下記です。(Raspberry Piも同様にdocker-composeコマンドを入れることができます。) $ uname -s -m Linux aarch64 $ cat /etc/system-release Amazon Linux release 2 (Karoo) $ sudo yum install -y python37 python3-devel.$(uname -m) libpython3.7-dev libffi-devel openssl-devel $ sudo yum groupinstall -y "Development Tools" # need gcc and friends $ sudo python3 -m pip install -U pip # make sure pip is up2date $ python3 -m pip install docker-compose $ docker-compose --version docker-compose version 1.27.4, build unknown Pythonのpackage manager pipを使って、手動でdocker-composeがインストールすることが出来ました。 docker-composeコマンドがインストール出来たところで、x86_64アーキテクチャのコンテナが動作するのか検証してみましょう! 結果 x86_64アーキテクチャのコンテナは、純粋なaarch64のLinux環境では、動作しませんでした。 (マルチアーキテクチャのコンテナは、aarch64にも対応していることもあり、動作しました。) さいごに 今後は、Dockerコンテナなどで、複数のCPUアーキテクチャを考慮する場面が出てくると思うので、その知見を貯めていきたいと考えています。 最後まで読んでいただきまして、ありがとうございます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails, Docker, AWS, CircleCIでポートフォリオを作成したので、振り返ってみる。

はじめに コロナウイルスの影響で色々あり、大学卒業後1年間ほどのブランクを使ってポートフォリオを作成しました。 作ったもの 「ベルリンなう」 ベルリンにまつわることを共有するサービスです。 ソースコード https://github.com/kazumawada/myapp サイトURL https://berlin-now.net/ 学習期間 8ケ月 最初の4ヶ月(Railsチュートリアル) Railsチュートリアルを3~4周ほどしました。慣れてきたら開発環境をCloud9から、Dockerに変えました。 「ユーザー登録ってこう機能しているんだ。」 「入力した情報はDBに格納されるのか。」 など、普段使っているサービスの仕組みを少しずつ理解していく過程が楽しかったです。 最後の4ヶ月 (ポートフォリオ作成) Railsアプリケーション作成+Dockerで環境構築 ↓ AWS(EC2) ↓ Docker(デプロイ用に、PumaとNginxを追加した) ↓ CiecleCI(自動デプロイ) ↓ AWSでドメイン取得&https化(Route53, ACM, ALB) ↓ 現在(2021年4月~) 毎日少しずつ改良中 ポートフォリオ作成を振り返る Rails 楽しかったです。自分が実装したことがブラウザに表示された時の快感のために毎日コードを書いていました。実装するものが、自分の中で必要なものであればあるほど、危機感によって勝手に集中してくれました。プログラミングは、一つの機能を作るのに何通りの方法もあるので、挫折しないために自分の理解できるやり方で書いていました。Qiita, dev.to, YouTube, Railsチュートリアル, stackoverflow, ブログ記事などを活用しました。 AWS, Docker 疑問に思ったことをググりながら学習しました。例えば、Nginxって?→そもそもWebサーバーって?→そもそもWebアプリケーションってどうなってるの?→紙に図を書いてイメージして全体像を掴む。→Nginxって?という感じで、AWSに関してもこのような感じで学習していきました。わからないところは仮説を立てて一つ一つ試していきました。 CircleCI 公式を読む→チュートリアルをやってみる→一旦書いてfailしてみる。→色んな人のymlファイルをgithubで検索して見てみる。のような感じで学習していました。AWSの時もそうでしたが、SSH周りが苦戦しました。落ち着いて図を書いてイメージしたら、理解できました。 学んだこと エラーが起こった時はコンピュータのせいではなく、自分の理解不足のせいなので、冷静にならないと何も進まない。 睡眠と運動が超大事。これらを怠った次の日は、、、 感想 作りたいものが形になっていく過程がが楽しくて、ここまで続けることができました。何日も詰まった経験を何度もしましたが、辞めないで良かったと今になって思います。 これからも毎日コードを書いていきます。就職活動頑張ります。 Wantedly→https://www.wantedly.com/users/133496921
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel カラム追加時にでたエラーNot null violation: 7 ERROR:

やりたいこと "posts"テーブルに"part"というカラムを追加する。 使用環境 OS docker DB:postgres:12 デプロイ先:Heroku つまづいたところ php artisan migrateコマンド実行でエラー $ docker-compose exec app sh //dockerコンテナに入るコマンド /app# php artisan migrate SQLSTATE[23502]: Not null violation: 7 ERROR: column "part" contains null values (SQL: alter table "posts" add column "part" varchar(255) not null) エラーをよむ:新しく追加したカラム "part"はnull値を含んでいる。 (SQL: alter table "posts" add column "part" varchar(255) not null) テーブルは追加カラム(varchar(255)=string)をnot nullで追加した /app # php artisan migrate:status +------+------------------------------------------------+-------+ | Ran? | Migration | Batch | +------+------------------------------------------------+-------+ | Yes | 2014_10_12_000000_create_users_table | 1 | | Yes | 2014_10_12_100000_create_password_resets_table | 1 | | Yes | 2019_08_19_000000_create_failed_jobs_table | 1 | | Yes | 2021_04_02_083813_create_posts_table | 1 | | No | 2021_04_10_202701_add_user_id_to_posts_table | | +------+------------------------------------------------+-------+ migration状況確認。 Noになっています。 解決方法 app # php artisan migrate:refresh すべてのマイグレーションをロールバックしmigrateを実行。 反映されました!! Docker Docker開発環境でpsqlにアクセスの仕方が分からなかったので;; 本番環境(Heroku)で確認 $ heroku pg:psql :DATABASE=> \d posts Table "public.posts" Column | Type | Collation | Nullable | Default ------------+--------------------------------+-----------+----------+----------------------------------- id | bigint | | not null | nextval('posts_id_seq'::regclass) title | character varying(255) | | not null | created_at | timestamp(0) without time zone | | | updated_at | timestamp(0) without time zone | | | user_id | integer | | | part | character varying(255) | | not null | Nullable欄にnot nullと表記されている。 migrationファイルにnullable();と指定しない場合は、勝手にnot null制約をつけてくれる模様。 因みに... $ heroku run php artisan migrate:fresh Dropped all tables successfully. Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table //省略 とmigrate:refreshではなく、freshで全てのテーブルを削除しmigrateを実行でも大丈夫だった。 違いはdownの処理を行ってからmigrationするか、テーブルを全削除してから1からmigrationするか、らしいがここの使い分けは今はピンときていない。 参考URL マイグレーション生成:LaravelドキュメントURL
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel カラム追加 migrationが反映されない

やりたいこと "posts"テーブルに"part"というカラムを追加する。 使用環境 OS docker DB:postgres:12 デプロイ先:Heroku つまづいたところ php artisan migrateコマンド実行でエラー $ docker-compose exec app sh //dockerコンテナに入るコマンド /app# php artisan migrate SQLSTATE[23502]: Not null violation: 7 ERROR: column "part" contains null values (SQL: alter table "posts" add column "part" varchar(255) not null) エラーをよむ:新しく追加したカラム "part"はnull値を含んでいる。 (SQL: alter table "posts" add column "part" varchar(255) not null) テーブルは追加カラム(varchar(255)=string)をnot nullで追加した /app # php artisan migrate:status +------+------------------------------------------------+-------+ | Ran? | Migration | Batch | +------+------------------------------------------------+-------+ | Yes | 2014_10_12_000000_create_users_table | 1 | | Yes | 2014_10_12_100000_create_password_resets_table | 1 | | Yes | 2019_08_19_000000_create_failed_jobs_table | 1 | | Yes | 2021_04_02_083813_create_posts_table | 1 | | No | 2021_04_10_202701_add_user_id_to_posts_table | | +------+------------------------------------------------+-------+ migration状況確認。 Noになっています。 解決方法 app # php artisan migrate:refresh すべてのマイグレーションをロールバックしmigrateを実行。 反映されました!! Docker Docker開発環境でpsqlにアクセスの仕方が分からなかったので;; 本番環境(Heroku)で確認 $ heroku pg:psql :DATABASE=> \d posts Table "public.posts" Column | Type | Collation | Nullable | Default ------------+--------------------------------+-----------+----------+----------------------------------- id | bigint | | not null | nextval('posts_id_seq'::regclass) title | character varying(255) | | not null | created_at | timestamp(0) without time zone | | | updated_at | timestamp(0) without time zone | | | user_id | integer | | | part | character varying(255) | | not null | Nullable欄にnot nullと表記されている。 migrationファイルにnullable();と指定しない場合は、勝手にnot null制約をつけてくれる模様。 因みに... $ heroku run php artisan migrate:fresh Dropped all tables successfully. Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table //省略 とmigrate:refreshではなく、freshで全てのテーブルを削除しmigrateを実行でも大丈夫だった。 違いはdownの処理を行ってからmigrationするか、テーブルを全削除してから1からmigrationするか、らしいがここの使い分けは今はピンときていない。 参考URL マイグレーション生成:LaravelドキュメントURL
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む