注意点Rails参考Dockerfileentrypoint.shGemfiledocker-compose.ymldatabase.ymlNginxconfig/puma.rbdocker-compose.yml注意点Elasticsearch+Kibana参考docker-compose.ymlFluentd参考fluentd/Dockerfilefluentd/fluent.confdocker-compose.ymlKibanaでNginxのログファイルを見る最終的なdocker-compose.ymlおわりにはじめにDockerはコンテナ仮想化技術のデファクトスタンダードとなっている。そんなDockerをやるやる詐欺を繰り返し未だ初歩的な知識も欠如している筆者が、夏休みの宿題も兼ねてDockerを使えるようになろうというのが目的。タイトルがやたら盛りだくさんだが、同じくやるやる詐欺を繰り返していた者達なので個々の詳しいことはこれから学ぶ予定。Dockerを用いて環境を構築することが今回のゴール。Docker?Dockerを勉強とすると言っても何から始めればいいのか?筆者も苦労したが基本的な概念とイメージを掴むにはKatacodaというeラーニングサイトで学ぶのが良いと感じた。KatacodaではWebブラウザ上でDockerを直接操作しながら学習することができる。実際にコマンドを叩いてどういう出力がでて、結果どうなるのかという流れを短時間で準備なく試せるのは非常に快適。基本的にはKatadcodaのDockerをコースを受講していればよいが、すでに非推奨となったlinkオプションを用いたコースなどもそのまま存在するので公式ドキュメント等で情報を補足しながら利用するのが良い。ドキュメント日本語化プロジェクトが存在しており日本語で読むことができるので英語が辛くても安心。概念を掴んだ上でここを理解しておけば大きな誤解なく進められるんじゃないか?と思ったのが下記の項目イメージとコンテナの違いを理解することこれがはっきりしていないと後に出てくるDockerfileとdocker-compose.ymlを用いる際わけがわからなくなってしまった。イメージに対しての操作なのか、コンテナに対しての操作なのかを常に意識すれば理解しやすくなった。Dockerはプロセスをフォアグラウンドで動作させないとコンテナが停止してしまう。off"がついているけどそういう理由Nginx以外でも同様の対策が必要。Volumeについて大まかに理解をしておくことが大事。Volumeを使う必要があることがわかる。基本的には理解しやすいbindを用いればあまり悩まずに済みそうという感想。頻繁に更新するファイルなどはbindが良さそうだけどそれ以外はvolumeを用いたほうが良さそう(要出典)なので使うとよいけど、無名のvolumeを作成しないようにすると良い。docker-composeに頼る。Volumeなどもいい感じにしてくれるので概念さえつかめたらあとはdocker-composeでやったほうが圧倒的に楽だった。DockerHubに書いてあるOSのディストリビューションを理解しておく。Linux」alpineと書いてあったらOSはこれ。知らなかったので何者だ?と初見で思った。これがわかったのでだいたい大丈夫なんじゃない?と一安心してる感じ。これから構築の話を書いていくけど基本的な思想としてはなるべく自分でDockerfileは書きたくなくてDockerHubのOfficialイメージを使っていい感じに構築したいという感じ。構築したいものdocker-composeを用いてRailsアプリケーションがMySQLに接続しつつ、Nginxをリバースプロキシとして利用する。アプリケーションサーバはpuma。NginxのログファイルをFluentdでElasticsearchに送りKibanaで見ることができるもの。1.6.3ディストリビューションは選択肢があればDebianを選んでる。わからない事が起きたときコンテナに入って調べるときAlpineだときつかったので。bash上記でnameのコンテナにbashで入れるから困ったらこれしてる。MySQL基本的にはDockerHubに記載されているdocker-composeを利用するが2箇所変更した。db-data:変更点rootのパスワード開発用ということもありrootのパスワードはなしにしたかったためMYSQL_ALLOW_EMPTY_PASSWORDを設定している。Variablesの説明はDockerHubにあるので用途に応じて設定してほしい。ポートフォワーディング加えてホストからアクセスするためにports設定を足した。ホストにMySQLは起動していないので3306同士。ホストにMySQLが起動している場合はホスト側のポートを変えれば両立可能(例:6666:3306)データボリュームトップレベルにdb-dataという名前付きのボリュームを定義している。オプションが色々設定可能だが、オプションなしだとボリュームが存在しない場合docker-composeが名前付きのボリュームを作成してくれる。これでMySQLのデータの永続化を実現している。注意点https://qiita.com/Lio/items/3127685e26081993b51eportsの設定をしているのでホストの3306ポートからアクセスしようとlocalhostでアクセスしようとするとホストで起動してるMySQLと接続しようとしてつながらない罠。hオプションの値を127.0.0.1にすると接続できる。MySQL8でデフォルトの認証形式になったcaching_sha2_passworddocker-compose.ymlのcommandを見てもらえばわかるが、起動オプションにdefault-authentication-plugin=mysql_native_passwordが指定されている。これはMySQL8からデフォルトの認証プラグインが変わったためcaching_sha2_passwordにクライアントが対応していないとエラーになるため。caching_sha2_passwordに対応していく必要はあるが、今回の趣旨ではないので従来のmysql_native_passwordにしておいた。betaを導入する記事を参考させてもらった。Rails6になり必要になったものなどをインストールする必要があったためDockerfileでイメージをビルドすることに。Qiita手順に則りDockerfile,entrypoint.sh,Gemfile,Gemfile.lockを作成。Gemfile.lockは空ファイルで良い。"0.0.0.0"]Node.jsとyarnはDockerfile内コメントにあるURLから最新版ぽいバージョンを選択している。"$@"https://docs.docker.com/compose/rails/そのままの為引用。pidファイルが残っていて起動できないケースを防ぐ為。