カニゲーム攻略日記ブログ

beatmaniaIIDXやハースストーンなどのゲーム攻略日記。主にまったり勢。2016年にIIDX皆伝になった

Docker超入門講座をやったメモ(4,5,6,7)

参考サイト: https://www.youtube.com/watch?v=lZD1MIHwMBY

Docker公式チュートリアルより分かりやすい

目次

4 Dockerを使ってみよう

docker run hello-world

このコマンドは、hello-world という名前のDockerイメージを実行し、その出力を表示しています。出力には、Dockerのインストールが正しく機能していることを示すメッセージが含まれています。

具体的には、以下の手順が実行されました。

  1. DockerクライアントがDockerデーモンに接続しました。
  2. Dockerデーモンは、Docker Hubから "hello-world" イメージをプル(ダウンロード)しました。
  3. Dockerデーモンは、そのイメージから新しいコンテナを作成し、現在表示されている出力を生成する実行可能ファイルを実行しました。
  4. Dockerデーモンはその出力をDockerクライアントにストリーミングし、クライアントはそれを端末に送信しました。

windows10のubuntuからVSCodeを開きたい

Windows 10 で WSL (Windows Subsystem for Linux) を使用している場合、以下の手順で Ubuntu から Visual Studio Code を開くことができます。

  1. まず、Windows 10 上で Visual Studio Code をインストールしてください。インストールがまだの場合は、以下のリンクからダウンロードしてインストールしてください: https://code.visualstudio.com/

  2. Visual Studio Code拡張機能「Remote - WSL」をインストールします。拡張機能タブ(左サイドバーの四角形のアイコン)を開き、「Remote - WSL」を検索し、インストールしてください。

  3. WSL の Ubuntu ターミナルを開きます。

  4. Ubuntu ターミナルで、作業しているディレクトリに移動し、以下のコマンドを実行してください:

code .

これにより、現在のディレクトリで Visual Studio Code が開きます。Visual Studio Code は自動的に WSL モードになり、Ubuntu 環境内でコードを編集できるようになります。

code . でエラーになる

以下で解決

WSL2 で使用している DNS サーバーを確認してください。/etc/resolv.conf ファイルを開き、次のようになっていることを確認します。

nameserver 8.8.8.8
nameserver 8.8.4.4

5 アプリを作成・実行しよう

rubyサンプルの説明

require 'webrick'

server = WEBrick::HTTPServer.new(
    DocumentRoot: './',
    BindAddres: '0.0.0.0',
    Port: 8000
)

server.mount_proc('/') do |req, res|
    res.body = 'hello'
end

server.start

このRubyコードは、WEBrickというRubyの組み込みHTTPサーバーを使って、簡単なWebサーバーを起動する例です。

  1. require 'webrick': WEBrickというRubyの組み込みHTTPサーバーライブラリを読み込んでいます。

  2. サーバーの設定を行っています。

    • DocumentRoot: './': サーバーのルートディレクトリを現在のディレクトリに設定しています。
    • BindAddress: '0.0.0.0': サーバーが接続を受け付けるIPアドレスを設定しています。0.0.0.0はすべてのIPアドレスでの接続を許可します。
    • Port: 8000: サーバーがリッスンするポート番号を設定しています。この場合、8000番ポートでリッスンします。
  3. server.mount_proc('/') do |req, res|: サーバーのルートパス('/')にアクセスしたときの処理を定義しています。reqはリクエストオブジェクトで、resはレスポンスオブジェクトです。

  4. res.body = 'hello': レスポンスのボディに"hello"という文字列を設定しています。

  5. server.start: WEBrickサーバーを起動します。これにより、サーバーがリクエストを受け付ける準備が整います。

このコードを実行すると、ポート8000でHTTPサーバーが起動し、ルートパス('/')にアクセスすると"hello"という文字列が表示される簡単なWebサーバーが動作します。

Dockerfileサンプルの説明

FROM ruby:2.7

RUN mkdir /var/www
COPY main.rb /var/www

CMD ["ruby", "/var/www/main.rb"]
  1. FROM ruby:2.7: Ruby 2.7がインストールされたイメージをベースとして使用しています。
  2. RUN mkdir /var/www: /var/wwwディレクトリを作成しています。これはアプリケーションのファイルを格納するディレクトリとして使われます。
  3. COPY main.rb /var/www: ホストマシン上のmain.rbファイルを、コンテナ内の/var/wwwディレクトリにコピーしています。これにより、コンテナ内でアプリケーションのコードが利用できるようになります。
  4. CMD ["ruby", "/var/www/main.rb"]: コンテナが起動する際に実行されるデフォルトのコマンドを指定しています。この場合、コンテナ起動時にruby /var/www/main.rbが実行されることになります。

CMDだけでは、コンテナ内にアプリケーションのコードが存在しないため、実行できません。RUNCOPYは、必要なディレクトリを作成し、アプリケーションのコードをコンテナにコピーするために使用されています。これにより、CMDで指定されたコマンドが正しく実行される環境が整います。

dockerイメージビルド

docker image build -t sample/webrick:latest .

docker image build -t sample/webrick:latest . は、Dockerfileを使用してDockerイメージをビルドするコマンドです。以下は、各パーツの説明です。

  1. docker image build: Dockerイメージのビルドを開始するコマンドです。Dockerfile内の命令に従って、新しいイメージが作成されます。

  2. -t sample/webrick:latest: イメージにタグを付けるオプションです。タグは、イメージのバージョンや役割を識別するために使用されます。この場合、イメージ名は「sample/webrick」で、タグは「latest」となります。

  3. .: Dockerfileが存在するディレクトリを指定します。この場合、現在のディレクトリ(.)が使用されます。Dockerは、このディレクトリ内のDockerfileを読み込み、イメージのビルドに使用します。

コマンドを実行すると、DockerはDockerfileの命令に従ってイメージをビルドし、ビルドが完了すると、指定された名前とタグでローカルのDockerイメージリポジトリに保存されます。このイメージは、docker runコマンドでコンテナを作成・実行する際に使用できます。

dockerコンテナ作成実行

docker container run -p 8000:8000 --name webrick sample/webrick:latest

Dockerイメージから新しいコンテナを作成し、実行するコマンドです。以下は、各パーツの説明です。

  1. docker container run: Dockerイメージから新しいコンテナを作成し、実行するコマンドです。

  2. -p 8000:8000: ホストマシンとコンテナ間でポートのマッピングを行うオプションです。この場合、ホストマシンのポート8000がコンテナ内のポート8000にマッピングされます。これにより、ホストマシンからコンテナ内のサービスにアクセスできるようになります。

  3. --name webrick: コンテナに名前を付けるオプションです。この場合、作成されるコンテナの名前は「webrick」になります。コンテナ名を指定することで、後でコンテナを操作する際に便利になります。

  4. sample/webrick:latest: 実行するDockerイメージを指定します。この場合、「sample/webrick:latest」という名前のイメージが使用されます。このイメージは、先程のdocker image build -t sample/webrick:latest .コマンドでビルドされたものです。

コマンドを実行すると、指定されたイメージから新しいコンテナが作成され、実行されます。また、ホストマシンのポート8000とコンテナ内のポート8000がマッピングされるため、ホストマシンからコンテナ内のサービスにアクセスできるようになります。

http://localhost:8000/にアクセス

helloを表示
やったぜ

コンテナの停止と削除

docker container stop webrick

docker container rm webrick

その他コマンド

docker container logs webrick

docker container logs webrick コマンドは、Docker コンテナのログを表示するために使用されます。この場合、webrick という名前のコンテナのログを表示することを指示しています。

コマンドを実行すると、webrick コンテナで実行されているプロセスの標準出力と標準エラー出力が表示されます。これにより、コンテナ内のアプリケーションが生成するメッセージやエラーを確認できます。これは、デバッグトラブルシューティングに役立ちます。

例えば、先程の sample/webrick:latest イメージから作成された webrick コンテナを実行した場合、コンテナ内で実行されている WEBrick サーバーが生成するログが表示されることが期待されます。これには、HTTP リクエストの情報やエラーメッセージが含まれることがあります。

docker container exec webrick ruby -v

docker container exec webrick ruby -v コマンドは、実行中の Docker コンテナ(この場合は webrick という名前のコンテナ)内で ruby -v コマンドを実行することを指示しています。

docker container exec コマンドは、実行中のコンテナ内で任意のコマンドを実行するために使用されます。このコマンドは、コンテナ内の環境を調べたり、デバッグトラブルシューティングを行ったりする際に役立ちます。

ruby -v コマンドは、インストールされている Ruby のバージョンを表示します。このコマンドを docker container exec と組み合わせることで、webrick コンテナ内で使用されている Ruby のバージョンを確認することができます。これは、アプリケーションが正しい Ruby のバージョンで実行されているかどうかを確認するために役立ちます。

docker system prune -a

docker system prune -a コマンドは、Docker システム内の未使用のリソースを削除するために使用されます。これには以下のものが含まれます。

  • 未使用のイメージ(-a フラグを使用しない場合は、ダングリングイメージのみ)
  • 未使用のコンテナ
  • 未使用のネットワーク
  • 未使用のボリューム(デフォルトでは削除されませんが、--volumes フラグを追加すると削除されます)

-a フラグは、すべての未使用のイメージを削除することを意味します。これには、現在使用されていないものの、将来使用される可能性のあるイメージも含まれます。このフラグを使用することで、システム上のディスクスペースを節約できますが、次回コンテナを実行する際に再度イメージをダウンロードする必要があります。

このコマンドを実行する前に、重要なデータがコンテナやボリュームに保存されていないことを確認してください。未使用のリソースが削除されると、それらのデータも失われます。

6 Dockerfileを作ろう

Gemfileサンプルの説明

このコードは、Ruby言語で書かれたGemfileです。Gemfileは、Rubyプロジェクトの依存関係(使用するgemライブラリ)を定義するために使われます。このGemfileでは、以下の内容が記述されています。

  1. # frozen_string_literal: true は、文字列リテラルが変更不可能(frozen)であることを示します。これにより、パフォーマンスが向上する場合があります。

  2. source "https://rubygems.org" は、gemのソースとしてRubyGems.orgを指定しています。これは、gemを検索・インストールする際のデフォルトの場所です。

  3. git_source(:github) は、カスタムのgit_sourceを定義しています。この設定により、GitHubリポジトリから直接gemをインストールすることができます。repo_nameという引数を使用して、対象となるGitHubリポジトリを指定します。

  4. gem "sinatra" は、このプロジェクトがsinatraというgemに依存していることを示しています。Sinatraは、Rubyで軽量なWebアプリケーションを作成するためのDSLドメイン固有言語)を提供するフレームワークです。この行があることで、bundle installコマンドを実行すると、Sinatra gemがプロジェクトにインストールされます。

Dockerfileサンプルの説明

このDockerfileは、Dockerイメージを構築するための設定ファイルです。各行の説明は以下の通りです。

  1. FROM ruby:2.7: このイメージは、Ruby 2.7をベースとしています。Ruby 2.7の公式Dockerイメージを使用して、新しいDockerイメージのベースレイヤを作成します。
  2. WORKDIR /var/www: コンテナ内での作業ディレクトリを/var/wwwに設定します。これ以降の命令は、このディレクトリを基準として実行されます。
  3. COPY ./src /var/www/: ビルドコンテキスト(Dockerfileがあるディレクトリ)内のsrcフォルダを、コンテナ内の/var/www/にコピーします。これにより、アプリケーションのソースコードがコンテナに含まれるようになります。
  4. CMD ["/bin/bash"]: コンテナが実行される際にデフォルトで実行されるコマンドを指定します。この例では、/bin/bashが実行されるため、コンテナ起動時にBashシェルが開きます。

このDockerfileを使用してイメージをビルドし、そのイメージからコンテナを作成することで、Ruby 2.7がインストールされ、アプリケーションのソースコード/var/wwwディレクトリに配置された環境で作業を行うことができます。

dockerイメージビルド

docker image build -t sample/sinatra:latest . コマンドは、現在のディレクトリ(.)にある Dockerfile を使用して、sample/sinatra:latest という名前で Docker イメージをビルドします。

このコマンドを実行すると、Dockerfile に記述された手順に従ってイメージが作成されます。イメージが正常にビルドされると、sample/sinatra:latest という名前でローカルの Docker イメージリストに追加されます。

このコマンドを実行する前に、Dockerfile が正しく記述されていることを確認してください。また、Docker が正常にインストールされ、実行されていることを確認してください。

dockerコンテナ作成実行

docker container run -it -p 4567:4567 --name sinatra -v ${PWD}/src:/var/www sample/sinatra

このコマンドは、Dockerでsinatraという名前のコンテナを実行し、ローカルのポート4567をコンテナ内のポート4567にマッピングします。また、カレントディレクトリ内のsrcフォルダを、コンテナ内の/var/wwwフォルダにマウントしています。

以下は、コマンドの各部分の説明です:

  • docker container run: Dockerコンテナを実行するためのコマンドです。
  • -it: コンテナを対話的モード(インタラクティブモード)で実行し、ターミナルをアタッチします。これにより、コンテナ内のプロセスと対話することができます。
  • -p 4567:4567: ローカルマシンのポート4567を、コンテナ内のポート4567にマッピングします。これにより、ローカルマシン上でアクセス可能なURLから、コンテナ内のサービスにアクセスできます。
  • --name sinatra: このコンテナにsinatraという名前を付けます。名前を付けることで、後でこのコンテナを簡単に参照できます。
  • -v ${PWD}/src:/var/www: カレントディレクトリ内のsrcフォルダを、コンテナ内の/var/wwwフォルダにマウントします。これにより、コンテナ内とローカルマシン上のフォルダの内容が同期されます。ファイルが更新されると、コンテナ内でもすぐに反映されます。
  • sample/sinatra: 実行するDockerイメージの名前です。これは、事前にdocker image buildコマンドでビルドされたイメージです。

このコマンドを実行すると、sample/sinatraイメージを使用して新しいコンテナが起動され、対話的モードで実行されます。そして、ローカルマシンのポート4567を使用して、コンテナ内のサービスにアクセスできます。

Bundler

利点

  1. プロジェクトごとに独立したgem環境が持てる。
  2. インストールされたgemを簡単に他の開発者や環境と共有できる。

コマンド説明

bundle config --local set path 'vendor/bundle' は、Bundler の設定をローカル(プロジェクト固有)に変更し、依存関係(gem)をインストールするディレクトリを vendor/bundle に指定するコマンドです。

Bundler は、Ruby の依存関係管理ツールで、プロジェクトに必要な gem(Ruby のライブラリやツール)を管理し、インストールすることができます。通常、gem はシステムのグローバルな場所にインストールされますが、このコマンドを使用することで、プロジェクト固有のディレクトリに gem をインストールすることができます。

このコマンドを実行すると、現在のプロジェクトディレクトリに .bundle というディレクトリが作成され、その中に設定ファイルが生成されます。この設定ファイルには、ローカルの設定が記録されており、以降の bundle install コマンドは、この設定を使用して gem を vendor/bundle にインストールします。

お試しrubyサンプルの説明

このコードは、RubyのWebアプリケーションフレームワークSinatraを使用して、簡単なWebサーバーを実装しています。

  1. require 'sinatra': Sinatraライブラリを読み込んでいます。
  2. configure do ブロック: アプリケーションの設定を行います。
    • set :bind, '0.0.0.0': SinatraアプリケーションがリッスンするIPアドレスを0.0.0.0(すべてのネットワークインターフェイス)に設定しています。これにより、外部からのアクセスが可能になります。
  3. get '/' do ブロック: HTTP GETリクエストがルート("/")に来たときの処理を定義しています。
    • 'Hello world~': 文字列 'Hello world~' を返して、ブラウザに表示します。

このコードを実行すると、Webサーバーが起動し、ポート4567でリッスンします。ブラウザでサーバーのIPアドレスとポートにアクセスすると、'Hello world~' と表示されます。

rubyサンプル実行

bundle exec ruby app.rb

Bundlerを使ってRubyアプリケーションを実行する方法です。

  1. bundle exec: Bundlerを使って、アプリケーションで使用されるgemパッケージの正しいバージョンを読み込んで実行します。これにより、アプリケーションが依存しているgemパッケージのバージョンが衝突しないようにします。

  2. ruby app.rb: app.rb という名前のRubyファイルを実行します。このファイルは、通常、SinatraなどのWebフレームワークを使用したWebアプリケーションのエントリーポイント(メインファイル)です。

このコマンドを実行することで、app.rbファイル内のアプリケーションが起動し、依存しているgemパッケージのバージョンが正しく管理されます。

http://localhost:4567/にアクセス

Hello world~ が表示される
やったぜ

Dockerfileに上記を反映

RUN bundle config --local set path 'vendor/bundle'
RUN bundle install

CMD ["bundle", "exec", "ruby", "app.rb"]

以下はRUNの省略形

RUN bundle config --local set path 'vendor/bundle' \
    && bundle install

なぜDokcerfileでCMD ["bundle", "exec", "ruby", "app.rb"]

DockerfileのCMD命令では、コマンドとその引数を配列形式で指定することが推奨されています。この方法は、"exec form"と呼ばれています。

CMD ["bundle", "exec", "ruby", "app.rb"] のように書く理由は以下の通りです。

  1. シェルを介さずに直接実行: 配列形式(exec form)で指定されたコマンドは、シェルを介さずに直接実行されます。これにより、シェルの挙動に依存しないようになり、セキュリティ上のリスクが低減されます。

  2. 引数の扱いが明確: コマンドと引数が個別の要素として配列内に記述されているため、空白文字や特殊文字が含まれる引数を正しく扱うことができます。

  3. 可読性と保守性の向上: コマンドと引数が明確に分かれているため、Dockerfileの可読性と保守性が向上します。

したがって、CMD命令を使用する際は、コマンドと引数を配列形式で指定することがベストプラクティスとされています。

Dockerfileを変更したが、COMMANDが "/bin/bash"のままです。なぜ?

ビルド忘れてた
ビルドし直したらいけた

http://localhost:4567/にアクセス

Hello world~ が表示される
やったぜ

7 Docker Compose でRailsを構築

Docker関連のファイルを用意

Dockerfileサンプルの説明

このDockerfileは、以下の手順でDockerイメージを構築しています。

  1. FROM ruby:2.7: この行は、ベースイメージとしてRuby 2.7を使用することを指定しています。Dockerは、指定されたベースイメージを元に新しいイメージを構築します。

  2. RUNコマンドで、複数の操作を実行しています:

    • Yarnパッケージリポジトリの公開鍵をインポートしています。
    • YarnパッケージリポジトリをシステムのAPTリポジトリに追加しています。
    • パッケージリストを更新しています。
    • 必要なパッケージ (Node.jsとYarn) をインストールしています。
  3. WORKDIR /app: 作業ディレクトリを /app に設定します。これにより、このディレクトリが以降のコマンドの実行場所となります。

  4. COPY ./src /app: ホストマシン上の ./src ディレクトリの内容を、Dockerイメージ内の /app ディレクトリにコピーします。

  5. RUNコマンドで、2つの操作を実行しています:

    • bundle config --local set path 'vendor/bundle' を実行し、bundleのインストール先を vendor/bundle に設定します。これにより、依存関係がプロジェクト内の指定されたディレクトリにインストールされます。
    • bundle install を実行し、Gemfileに記載された依存関係をインストールします。

このDockerfileは、Ruby 2.7をベースにしたイメージを作成し、Node.jsとYarnをインストールし、アプリケーションのソースコードと依存関係をイメージ内にコピーしています。これにより、アプリケーションを実行するために必要なすべてのコンポーネントがDockerイメージに含まれることになります。

Gemfileサンプルの説明

このコードは、Rubyの依存関係管理ツールであるBundler用のGemfileの一部です。Gemfileは、プロジェクトで使用するRubyのgem(ライブラリやツール)とそのバージョンを指定するために使用されます。このコードで指定されている内容は以下の通りです。

  1. source 'https://rubygems.org': この行は、gemの取得元として https://rubygems.org を指定しています。RubyGems.orgは、Rubyコミュニティのためのパッケージ管理サービスで、gemをホストし、公開しています。

  2. gem 'rails', '~> 6.1.0': この行は、プロジェクトがRails gemを依存関係として使用することを指定しています。また、~> 6.1.0は、Rails gemのバージョンを指定しています。この指定により、Railsのバージョン6.1.x(6.1.0以上、6.2.0未満)がインストールされることになります。~>演算子は、「最後の指定されたバージョン番号を上げることができるが、それ以前の番号は固定」という意味です。

このGemfileは、Ruby on Railsフレームワークのバージョン6.1.xをプロジェクトに追加するための設定を行っています。

docker-compose.ymlサンプルの説明

このコードは、Docker Composeの設定ファイル(docker-compose.yml)で、2つのサービス(dbweb)を定義しています。Docker Composeは、複数のコンテナを一度に管理・実行するためのツールです。

  1. version: '3': この行は、使用するDocker Composeファイルのバージョンを指定しています。バージョン3は現在の主要バージョンです。

  2. services:: この行から、2つのサービス(dbweb)を定義しています。

    • db:: このサービスは、MySQLデータベースを実行するコンテナを定義しています。

      • image: mysql:8.0: MySQL 8.0のイメージを使用します。
      • command: --default-authentication-plugin=mysql_native_password: MySQLの認証プラグインmysql_native_passwordに設定します。
      • volumes:: ホストの./src/db/mysql_dataディレクトリをコンテナの/var/lib/mysqlディレクトリにマウントします。これにより、データが永続化されます。
      • environment:: 環境変数を設定します。ここでは、MySQLのルートパスワードをpasswordに設定しています。
    • web:: このサービスは、Railsアプリケーションを実行するコンテナを定義しています。

      • build: .: 現在のディレクトリにあるDockerfileを使用して、イメージをビルドします。
      • command: bundle exec rails s -p 3000 -b '0.0.0.0': Railsサーバをポート3000で実行し、すべてのIPアドレスからの接続を許可します。
      • volumes:: ホストの./srcディレクトリをコンテナの/appディレクトリにマウントします。これにより、コードの変更がすぐに反映されます。
      • ports:: ホストのポート3000をコンテナのポート3000にマップします。これにより、ホストからアプリケーションにアクセスできます。
      • depends_on:: このサービスがdbサービスに依存していることを示します。これにより、dbサービスが先に起動されます。

このdocker-compose.ymlファイルは、MySQLデータベースとRailsアプリケーションを実行する2つのコンテナを一度に管理・実行するための設定を行っています。

ymlの名前の由来は?

YMLファイルは、YAMLファイルの略称です。YAMLは、"YAML Ain't Markup Language"(以前は "Yet Another Markup Language")の略で、これは再帰的な頭字語です。YAMLは、データ構造や設定ファイルなどに使用される人間に読みやすいデータシリアライゼーション言語です。その名前は、YAMLマークアップ言語ではなく、データ表現言語であることを強調しています。YAMLの名前の一部である "Ain't" は、否定の意味を持ちます。

初期設定

docker-composeからrailsを作成

docker-compose run web rails new . --force --database=mysql

このコマンドは、Docker Composeを使用して、新しいRailsアプリケーションを作成します。詳細については以下の通りです。

  1. docker-compose run: Docker Composeを使用して、指定されたサービスのコンテナを実行します。ここでは、webサービスが指定されています。
  2. web: Docker Composeファイルで定義されたwebサービスを実行します。通常、Railsアプリケーションのコードをホストするサービスです。
  3. rails new . --force --database=mysql: webサービスのコンテナ内で実行されるコマンドです。これは、現在のディレクトリ(.)で新しいRailsアプリケーションを作成し、MySQLをデータベースとして使用するように設定します。既存のファイルがある場合は--forceオプションによって上書きされます。

このコマンドを実行すると、webサービスのコンテナ内で新しいRailsアプリケーションが作成され、その設定がMySQLデータベースを使用するようになります。このコマンドは、Railsアプリケーションの初期設定を行うために一度だけ実行する必要があります。

error failed to solve: error from sender: open xx/rails_docker/src/db/mysql_data/#innodb_redo: permission denied

これで解決
.dockerignoreファイルを作成し、次の内容を追加してください。

src/db/mysql_data

このエラーは、Dockerがビルドコンテキスト内の一部のファイルにアクセスできないことを示しています。ファイルが存在するが、Dockerデーモンに対して適切な権限が設定されていないため、ビルドが失敗しています。

この場合、src/db/mysql_dataディレクトリが問題を引き起こしているようです。これはおそらく、DockerコンテナでMySQLデータが保存されているディレクトリであり、ホストマシンにマウントされているため、アクセス権限の問題が発生していると考えられます。

これにより、src/db/mysql_dataディレクトリはビルドコンテキストに含まれなくなり、権限の問題が解決されるはずです。その後、再度ビルドを試みてください。

Gemfileが更新されたのでビルドし直す

docker-compose build

データベースの設定

./src/config/database.yml

  password: password
  host: db
docker-compose run web rails db:create

docker-compose run web rails db:create コマンドは、Docker Composeを使用してRailsアプリケーションのデータベースを作成するためのコマンドです。ここで、webはDocker Composeファイル内のRailsアプリケーションを表すサービス名です。

このコマンドを実行すると、Docker Composeは以下の手順を実行します。

  1. docker-compose.ymlファイル内で定義されたwebサービスのコンテナを起動します。このコンテナは、Railsアプリケーションの実行環境を含んでいます。
  2. 指定されたコマンド rails db:create を実行します。これにより、config/database.ymlファイルに記述された設定に基づいて、データベースが作成されます。

データベース作成が正常に完了すると、新しく作成されたデータベースが利用可能になります。Railsアプリケーションは、データベースとのやりとりを行うために、このデータベースを使用します。

起動

docker-compose up

docker-compose up コマンドは、Docker Compose を使ってマルチコンテナアプリケーションを起動および実行します。このコマンドは、以下の手順を実行します。

  1. 現在のディレクトリ内の docker-compose.yml ファイルを読み込みます。このファイルには、アプリケーションで使用するサービス(コンテナ)、ネットワーク、およびボリュームの構成が記述されています。

  2. 記述されたサービス(コンテナ)のイメージがローカルにない場合、リモートレジストリ(通常は Docker Hub)からイメージをダウンロード(プル)します。

  3. サービス間の依存関係に従って、サービス(コンテナ)を順番に起動します。また、指定されたポートやボリューム設定を適用します。

  4. コンテナが正常に起動すると、docker-compose.yml ファイルで定義されたコマンドが実行され、アプリケーションが起動します。

docker-compose up コマンドは、アプリケーションのすべてのサービス(コンテナ)を一度に起動・実行できるため、複数のコンテナが連携して動作するアプリケーションの開発やテストに役立ちます。また、-d オプションを追加することで、コンテナをバックグラウンドで実行することもできます(例:docker-compose up -d)。

http://localhost:3000/にアクセス

Yay! You’re on Rails!

その他操作

停止

docker-compose down

docker-compose down は、Docker Compose を使用して実行しているコンテナ、ネットワーク、ボリューム、およびイメージを停止および削除するコマンドです。これは、コンテナと関連するリソースをクリーンアップするために使用されます。

このコマンドは、以下の動作を行います:

  1. 実行中のコンテナを停止します。
  2. コンテナ、ネットワーク、およびボリュームを削除します。

追加のオプションを使用することで、イメージも削除できます:

  • --rmi all: すべてのイメージを削除します。
  • --rmi local: Compose ファイルで定義されているイメージのみを削除します。

docker-compose down コマンドを実行すると、関連するリソースが削除されるため、データが失われる可能性があります。そのため、実行する前に、重要なデータが適切にバックアップされていることを確認してください。

ログ

docker-compose logs

コンテナにbashで入る

docker-compose exec web /bin/bash