- 投稿日:2021-01-21T23:58:46+09:00
docker-compose 基本的なコマンド
はじめに
docker-composeの基本的なコマンドについてまとめたので忘備録
docker-compose version 1.27.4, build 40524192
コマンド一覧
イメージの一覧を表示
$ docker-compose imagesコンテナの一覧を表示
$ docker-compose psイメージの作成(ビルド)
$ docker-compose buildDockerイメージからコンテナを作る Dockerfileを編集した後とかにやる
コンテナを作成し、起動
$ docker-compose up -d
up
でコンテナを構築し、起動する
-d
はコンテナをデダッチデタッチドモード(バックグラウンド)で立ち上げるコンテナを削除
$ docker-compose down $ docker-compose down --rmi all #イメージも全て削除 $ docker-compose down --volumes #ボリュームも消除コンテナの停止
$ docker-compose stopコンテナの起動
$ docker-compose startコンテナの再起動
docker-compose restartログの確認
$ docker-compose logs $ docker-compose logs -ft #ログをリアルタイムで見るコンテナ内でコマンドを実行(コンテナが起動してる)
$ docker-compose exec {サービス名} {コマンド}例えば
$ docker-compose exec web rails c $ docker-compose exec web rails db:migrate $ docker-compose exec web /bin/bashこの場合
web
がサービス名rails c
などがコマンドコンテナ内でコマンドを実行(コンテナが起動してない)
$ docker-compose run {サービス名} {コマンド}例えば
$ docker-compose run --rm rails rails new . --force --database=postgresql --skip-bundle --skip-test --api新しくRailsの環境を作る時などによく使う
最後に
まだまだ勉強中なので間違いなどありましたらご指摘いただけると幸いですm(__)m
- 投稿日:2021-01-21T23:51:34+09:00
【コピペ】Docker ComposeでLaravel開発環境を構築その肆
前回、Laravelを別リポジトリ管理にして、かなりスッキリした。
【コピペ】Docker ComposeでLaravel開発環境を構築その参でも、ふと思った、、、Laravelのプロジェクト名を変えたいな。。。
今は、Nginxのconfにベタ書きなので、.envから設定したいなーって事で、やってみた。
ついでに、色々バージョン上げよう!マシンスペック
- Mac mini 2018
- macOS Catalina(10.15.x)
- Intel Core-i7 3.2GHz 6コア
- メモリ 32GB
- SSD 512GB
Docker環境
- Nginx 最新版
PHP(PHP-FPM) 7.1.x→ PHP(PHP-FPM) 7.4.xMySQL 5.7.x→ MySQL 8.xComposer 最新版→ Composer 2.xLaravel 5.6→ Laravel 8.xやること
- Docker Composeで環境変数を使う
- 色々バージョンアップする
補足
各環境を行ったり来たりするので、下記のように記載します。
[Mac]$ MacのターミナルでMac内の作業 [PHP]$ MacのターミナルからPHPコンテナに接続して作業.envファイルを作成する
環境ごとに.env作成したいので、.env.exampleを作成する。
中身は下記。# APP名 APP_NAME=laravel # XDebugポート XDEBUG_PORT=9000 # DB DATABASE_NAME=hoge DATABASE_USER=fuga DATABASE_PASSWORD=docker#DOCKER1234 DATABASE_ROOT_PASSWORD=docker#DOCKER1234.gitignoreの編集
https://github.com/bobtabo/docker2/blob/master/.gitignore
- .envは除外
.envdocker-compose.ymlを編集
https://github.com/bobtabo/docker2/blob/master/docker-compose.yml
version: '3' volumes: phpsocket: services: nginx: 〜 略 〜 volumes: - ./src:/home/docker - phpsocket:/var/run depends_on: - php php: 〜 略 〜 - '9000:9000' volumes: - ./src:/home/docker - phpsocket:/var/run 〜 略 〜 db: image: mysql:5.7 〜 略 〜 MYSQL_DATABASE: hoge MYSQL_USER: fuga MYSQL_PASSWORD: docker#DOCKER1234 MYSQL_ROOT_PASSWORD: docker#DOCKER1234 〜 略 〜環境ファイルを各コンテナで参照したいので、下記に変更。
version: '3.8' volumes: phpsocket: services: nginx: 〜 略 〜 volumes: - ./nginx/templates:/etc/nginx/templates - ./src/${APP_NAME}:/var/www/html - ./src:/home/docker - phpsocket:/var/run depends_on: - php environment: - APP_NAME=${APP_NAME} php: 〜 略 〜 - '${XDEBUG_PORT}:9000' volumes: - ./src/${APP_NAME}:/var/www/html - ./src:/home/docker - phpsocket:/var/run 〜 略 〜 db: image: mysql:8 〜 略 〜 MYSQL_DATABASE: ${DATABASE_NAME} MYSQL_USER: ${DATABASE_USER} MYSQL_PASSWORD: ${DATABASE_PASSWORD} MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD} 〜 略 〜ドキュメントルートは後述(Nginxのconf編集)の理由から /var/www/html に変更。
Laravel5.6→8.xに入れ替える際、/var/www/html を削除できなかった(いつか調べる)ので、/home/dockerにもマウント。
/home/docker/${APP_NAME}を削除して新たにプロジェクト作成しても、/var/www/html に即反映しなかったので、その際は下記で復活する。[Mac]$ docker-compose down [Mac]$ docker-compose up -dNginxのconf編集
https://github.com/bobtabo/docker2/blob/master/nginx/conf.d/default.conf
・・・ server_name laravel.local; ・・・ location / { root /home/docker/laravel/public; ・・・ } ・・・ location ~ \.php$ { root /home/docker/laravel/public; ・・・ }上記に環境変数を埋め込むように修正。
・・・ server_name ${APP_NAME}.local; ・・・ location / { root /home/docker/${APP_NAME}/public; ・・・ } ・・・ location ~ \.php$ { root /home/docker/${APP_NAME}/public; ・・・ }ただ、ドキュメントルートの環境変数埋め込みが、どうやってもエラーになって無理だったので、ドキュメントルートを固定。
結局こうなりました。・・・ server_name ${APP_NAME}.local; ・・・ location / { root /var/www/html/public; ・・・ } ・・・ location ~ \.php$ { root /var/www/html/public; ・・・ }後述(default.confの置換)でファイル名を、conf.d/default.conf → templates/default.conf.templateにリネーム。
default.confの置換
https://github.com/bobtabo/docker2/blob/master/nginx/Dockerfile
# 設定の置換 COPY conf.d/default.conf /etc/nginx/conf.d/default.confdocker-compose.ymlのvolumesで解決する。
services: nginx: 〜 略 〜 volumes: - ./nginx/templates:/etc/nginx/templatesなので、Dockerfile内でのCOPYは不要になった
Composer2.xをインストールする修正
https://github.com/bobtabo/docker2/blob/master/php/Dockerfile
COPY --from=composer:latest /usr/bin/composer /usr/bin/composerlatestにしてたから最新版が入ってると思いきや、何故か 1.x だったので 2.x で固定。
COPY --from=composer:2 /usr/bin/composer /usr/bin/composerXDebugのバージョン固定
https://github.com/bobtabo/docker2/blob/master/php/Dockerfile
RUN pecl install xdebugこのままだと、Xdebug 3.xがインストールされる。
Xdebug 2.x と Xdebug 3.x は、設定ファイルの記述が異なり、今までの設定だと動かない。(ハマった)
Xdebug 2.xに固定。(3.xの設定は、また今度)RUN pecl install xdebug-2.9.8Laravelの準備
[Mac]$ docker-compose exec --user 1000 php bash [PHP]$ rm -fdR laravel [PHP]$ composer create-project --prefer-dist laravel/laravel laravel "8.*" [PHP]$ cd laravel [PHP]$ composer require --dev barryvdh/laravel-ide-helper [PHP]$ composer require --dev squizlabs/php_codesniffer [PHP]$ mkdir bin [PHP]$ vi bin/clear-laravel.sh --- #!/bin/bash php artisan view:clear php artisan cache:clear php artisan config:clear php artisan route:clear php artisan clear-compiled php artisan config:cache composer dump-autoload php artisan ide-helper:generate php artisan ide-helper:models -N php artisan ide-helper:meta find . -name '._.DS_Store' -type f -ls -delete --- :wq [PHP]$ vi .env.example --- :%s/DB_HOST=127.0.0.1/DB_HOST=mysql/g :%s/DB_DATABASE=homestead/DB_DATABASE=hoge/g :%s/DB_USERNAME=homestead/DB_USERNAME=fuga/g :%s/DB_PASSWORD=secret/DB_PASSWORD=docker#DOCKER1234/g --- :wq完成!!
https://github.com/bobtabo/docker3※参考
https://qiita.com/shin-go/items/6cb4824944ddffb6e6a7使い方
[Mac]$ cd <任意のディレクトリ> [Mac]$ git clone https://github.com/bobtabo/docker3.git docker [Mac]$ cd docker [Mac]$ cp -p .env.example .env [Mac]$ docker-compose up -d ・・・ Creating mysql ... done Creating php ... done Creating nginx ... done [Mac]$ docker-compose exec --user 1000 php bash [PHP]$ pwd /home/docker [PHP]$ cd laravel [PHP]$ composer install [PHP]$ chmod -R 777 storage [PHP]$ chmod -R 777 bootstrap/cache [PHP]$ cp -p .env.example .env [PHP]$ php artisan key:generate [PHP]$ chmod 755 bin/clear-laravel.sh [PHP]$ bin/clear-laravel.sh [PHP]$ php artisan migrate:refresh --seed動作確認(Macのhosts編集)
[Mac]$ sudo vi /private/etc/hosts ★下記を点線内を追記 --- 127.0.0.1 laravel.local --- :wqブラウザで動作確認
http://laravel.local/
コンテナ削除
[Mac]$ docker-compose down --rmi all --volumes
- 投稿日:2021-01-21T22:03:39+09:00
Docker ComposeでApache+Rails環境を構築
最終的なフォルダ構成
最終的なフォルダ構成myapp/ |--docker-compose.yml |--apache/ |--html/ |--rails/ |--app/ |--bin/ |--config/ |--db/ |--lib/ |--log/ |--public/ |--storage/ |--test/ |--tmp/ |--vendor/ |--config.ru |--Dockerfile |--entrypoint.sh |--Gemfile |--Gemfile.lock |--Rakefile |--README.md |--.env |--.gitignore |--.git.git
Gitの初期化を行う
bashgit init.gitignore
- Gitの管理下に置きたくないファイルやディレクトリを管理するためのファイル
.gitigrore/.env.env
- 環境変数を管理するために使われるファイル
.env# commons WORKDIR=app CONTAINER_PORT=3000 RAILS_PORT=3000 APACHE_PORT=8080 # db # POSTGRES_PASSWORD=passworddocker-compose.yml
まずプロジェクトフォルダを作成し、そこにrailisフォルダ、apacheフォルダとdockercompose.ymlファイルを作成する。
docker-compose.ymlversion: '3.8' services: apache: image: httpd:alpine container_name: apache volumes: - ./apache/html:/usr/local/apache2/htdocs # httpdイメージでは80番ポートを公開している ports: - "$APACHE_PORT:80" depends_on: - rails # railイメージを構築、railsコンテナを構築、起動 rails: # railsフォルダの中にあるDockerfileをビルド build: context: ./rails # Dockerイメージをビルドする際にDockerfileに渡す値を指定 args: WORKDIR: $WORKDIR container_name: rails environment: # rack-corsで使用する ACCESS_CONTROL_ALLOW_ORIGIN: "localhost:$APACHE_PORT" # サーバの起動フラッグを削除(起動されていると勘違いしてしまわないように) # ポートを$CONTAINER_PORTとしてサーバ起動(Dockerfile内でも起動しているが) command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p $CONTAINER_PORT -b '0.0.0.0'" # コンテナ中のappフォルダをローカルのappフォルダに結びつける(コンテナを起動する際にホストマシン上のデータがコンテナにマウントされる) volumes: - ./rails:/$WORKDIR # コンテナのポートとホストのポートを対応付ける ports: - "$RAILS_PORT:$CONTAINER_PORT" # attachに必要,ターミナルの入出力がコンテナのbashとつながる?,attachしないとブラウザは一生読み込み中に stdin_open: true # これがないとattachしてもすぐ切れてしまう? tty: trueCORSの設定
CORSとは、異なるオリジン感の通信を許可する仕組み
- Gemのインストール
- railsディレクトリのGemfileを開く
- 26行目付近の
gem 'rack-cors'
のコメントを外す- Dockerイメージを再ビルド
設定ファイルの編集
- api/config/initializers直下にあるcors.rbが設定ファイル
下記のように編集
cors.rb# Be sure to restart your server when you modify this file. # Avoid CORS issues when API is called from the frontend app. # Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests. # Read more: https://github.com/cyu/rack-cors Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do # docker-compose.ymlで指定した値かその値がNullの場合は、空文字を入れる(エラーにならないように) origins ENV["ACCESS_CONTROL_ALLOW_ORIGIN"] || "" # 許可したいリソースファイル resource '*', headers: :any, # getのみ許可 methods: [:get] end endDockerfile
railsイメージはDockerfileから作成するためDockerfileとentrypoint.shをrailsフォルダの下に作成する。
現在のフォルダ構成myapp/ |--docker-compose.yml |--apache/ |--rails/ |--Dockerfile |--entrypoint.shDockerfileFROM ruby:2.7.2 RUN apt update -qq && \ apt install -y build-essential \ libpq-dev # Dockerfile内で使用する変数名を指定 ARG WORKDIR ENV APP_ROOT /$WORKDIR RUN mkdir $APP_ROOT WORKDIR $APP_ROOT # このファイル(Dockerfile)と同じ階層にあるGemfile等をコンテナにコピー COPY ./Gemfile $APP_ROOT/Gemfile COPY ./Gemfile.lock $APP_ROOT/Gemfile.lock # コンテナのGemfileを参考にGemをインストール RUN bundle install # このファイルが含まれているディレクトリをコンテナのルートディレクトリにコピー COPY . $APP_ROOT COPY ./entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] CMD ["rails", "server", "-b", "0.0.0.0"]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 "$@"GemfileとGemfile.lock
現在のフォルダ構成myapp/ |--docker-compose.yml |--apache/ |--rails/ |--Dockerfile |--entrypoint.sh |--Gemfile |--Gemfile.lockGemfilesource 'https://rubygems.org' gem 'rails', '6.0.0'GemfileはRubyのライブラリをまとめたもので、Dockerfile内の
bundle install
ではこのファイルを元にgemたちをインストールしている。
Gemfile.lockはGemfileをもとに実際にインストールされたgemの一覧とバージョンが記載されたファイルで、ここでは空のファイルを作成しておく。イメージの構築、コンテナの作成・起動
ここまででとりあえず必要なファイルが揃ったので、イメージの構築等を行っていく。
rails new —api
rails new
はrailsアプリケーションの雛形を作成してくれるコマンドで、railsサーバを立ち上げるのに必要なgem等を作成してくれる。今回railsはAPIサーバとして用いるためAPIモードでアプリを作成するように--api
をオプションとして付けている。bashdocker-compose run rails rails new . --api --force --skip-bundle
docker-compose run
は引数で指定したサービスについて、イメージの構築から、コンテナの作成・起動までを行ってくれるコマンドで、それプラスサービス名の後にコマンドを打つとコンテナ内で実行してくれる。
ここではサービスにDockerfileで指定したrails:を指定しており、プラスアルファのコマンドとしてrails new .
を行っている。
--force
は既存のGemfileを上書きするためのオプションである。
後で、イメージを構築する際にbundle install
は行われるので、ここでは--skip-bundle
としている。イメージの構築
bashdocker-compose buildこのとき、Dockerfileよりrailsのイメージが作成される。
コンテナの作成・起動
bashdocker-compose uphttpdのイメージはこのときに、Docker Hubからローカルに持ってきている。
localhost:8080で
apache/html
にアクセスできる。localhost:3000でrailsサーバにアクセスできる。補足
docker-compose build
でbundle install
は行われるが、volumeとは紐付かないらしく、コンテナを起動する際にエラーが出る恐れがある。そのときは、volumeと紐づけられるrun
コマンドを実行する。$ docker-compose run rails bundle installまたは、
rails new
で--skip-bundle
を付けなければ問題ない。Docker Compose + Railsでイメージ内でbundle installしているはずなのにgemが無いとエラーがでる。 - Qiita
参考
DockerインストールからRails + Docker + MySQLで環境構築までの手順
【Mac編】DockerでRuby on Railsの開発環境を作ってみよう
Docker ComposeでNode.jsの環境構築 - Qiita
Rails6・Nuxt.js・PostgreSQLを動かすdocker-compose.ymlファイルを作成する - 独学プログラマ
- 投稿日:2021-01-21T18:17:24+09:00
Dockerを使ってみよう!
この記事はリンク情報システムの「2021新春アドベントカレンダー TechConnect」のリレー記事です。
engineer.hanzomon のグループメンバによってリレーされます。
(リンク情報システムのFacebookはこちらから)2021新春アドベントカレンダー Tech Connect インデックスはこちら
21日の記事を担当しますshigeta(hs-lis)です。よろしくお願い致します。
はじめに
ちょっと前にDockerについて勉強したので、
色々学んだ知識や知見をまとめていこうと思います。
以下技術者向けに、Dockerとは何か、Dockerの使い方についてざっくり書いていきます。Dockerとは何ぞ?
Dockerとは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである( Wikipediaから引用 )
これだけだと、よく分からない。
そもそも、コンテナ仮想化って何でしょう?
そこで、まずコンテナについて説明していきます。コンテナとは?
コンテナは端的に言えば、仮想環境の一種です。
以下のような特徴があります。
- 特定のアプリケーションを内包する
- 実行環境だけを物理環境(ホストマシン)から独立させる
- コンテナ同士などで連携ができる機能を持つ
すなわち、必要なライブラリ・ソフトウェアだけを持ち、必要な機能(仮想ネットワーク)を持つ仮想的な実行環境、ということです。言い換えれば、ある特定のアプリを実行するためだけの箱庭・箱的なものと言えるかもしれません。
仮想マシンとの違いは?
仮想環境といえば、他にはVMWareなどの仮想マシンなどがありますが、
コンテナはそれとはシステム的な部分で違います。違う部分は以下の2つ。
- 仮想ハードウェアを持たない
- ゲストOSを持たない
例えば、複数のアプリケーションを一つのOS上でそれぞれ独立して動かす、となった時、仮想マシンで構成すると、そのアプリケーションの数だけ仮想ハードウェアとゲストOSが必要になります。
仮想メモリがどうとか仮想CPUがどうとか、ゲストOSはwindowsだとかubuntuだとか...それぞれ適切に設定して、ホストマシンのメモリや演算力を割り振る必要性があります。
しかし、どれも同じ構成でも良ければそこは共通でもいいはずです。実際それぞれを連携させるのであれば同じOSにするのが運用・開発もやりやすい。共通にした方が複数のゲストOSや仮想ハードウェアに費やしているメモリや演算力も使わなくて済みます。複数の仮想OSの起動時間を待つ必要もありません。
コンテナ仮想化はそれらをコンテナエンジンに置き換えることで問題をクリアしています。
その他詳細は下記URLの記事を読んでみてください。
図も交えながらの詳しくわかり易い説明になっています。
https://thinkit.co.jp/article/17301加えてこちらも
https://qiita.com/ko_koyama_m/items/0e65849b91a329529675Dockerを導入する
やっと本題ですが、Dockerを導入していきます。以下のURLより使うOSにあったDockerをダウンロード・インストールしてください。
https://www.docker.com/products/docker-desktopインストールが終わり、Dockerが起動したら”docker is running”という通知が出るはずです。その次にターミナル・PowerShell(以下ターミナルで統一)で以下のコマンドを打ちます。
docker --version docker-compose --versionそれぞれバージョンが出ることを確認してください。
出ない場合はターミナルを再起動して、もう一度トライしてください。※なお、Windows版はWSL2の導入が推奨されますので下記の手順を元にインストールしてください。他のプラットフォームはDockerをインストールするだけで大丈夫です。
1. PCの仮想マシンプラットフォームの有効化
Windowsの設定>アプリ>関連設定の「プログラムと機能」
「プログラムと機能」
画面左の「Windowsの機能の有効化または無効化」
「仮想マシン プラットフォーム」をOnにして、OKクリック2. WSL2のインストール/アップデート
①PowerShellを管理者権限で起動
ウィンドウズメニュー(田)を右クリック
「Windows PowerShell(管理者)」
を選択して起動①以下をPowerShellで実行
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart③WSL2 Linuxカーネルの更新
以下から「x64 マシン用の最新の WSL2 Linux カーネル更新プログラム パッケージをダウンロードしてください。」のリンク先をクリック。
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
「wsl_update_x64.msi」のダウンロードが終わったら実行。④Ubuntuのインストール
McrosoftStoreからUbuntu 18.04LTSをインストールする3. Docker Desktopのインストール
①以下からダウンロード
https://hub.docker.com/editions/community/docker-ce-desktop-windows
「Get Docker Desktop for Windows (stable)」をクリックしてダウンロード後、実行。コンテナを使ってみよう
ターミナルを起動してください。
まず、コンテナの元になるdockerイメージをダウンロードします。
以下のコマンドを実行します。docker pull nginx:latest次にコンテナを作成して起動します。
docker run -d -p 8080:80 nginx:latest無事作成されればハッシュ値が表示されます。
作成されたらブラウザでURLに"localhost:8080"と打ってください。Nginxの標準ページが表示されれば成功です!
ちなみにコンテナを止めるたり起動するときはdocker start [表示されたハッシュ値の前から四桁くらい] docker stop [表示されたハッシュ値の前から四桁くらい]
のコマンドで出来ます。
オプションについて、
-pはコンテナ内のポートとホストのポートをつなげてくれるコマンドです。
-p 8080:80と書けばホストの8080番とコンテナ内の80番をつなげてくれます。
nginxの標準ポートはhttpの80番になっているため、8080番に接続するとコンテナ内で動くnginxにアクセスできる訳です。
その他にも色々オプションがありますので、こちらを確認してみて下さい。
https://docs.docker.jp/engine/reference/commandline/run.htmlなお、dockerイメージファイルは、mysqlとかnodeとかWEBやDBなどのシステムに関して様々な種類のものが存在します。存在するdockerイメージは以下のURLで検索出来ます。
https://hub.docker.com/search?q=node&type=image
色々検索してみるのもいいかもしれないですね。また、上記ではコマンドを使いましたが、最初に導入したDockerDestopはGUIがあるので、そちらでコンテナ作成や起動などの管理・操作をした方がやりやすいかもしれません。
Dockerfileについて
以下のコマンドで上記で紹介したrunなどで使える独自のdockerイメージを作成出来ます。
docker build [Dockerfileがあるフォルダ]
Dockerfileは以下のような感じで書く
Dockerfile# 使うdockerイメージ FROM node:12.19.0-stretch-slim # 作業フォルダ(コンテナ内) WORKDIR /src # 実行するコマンド RUN npm install && npm run devRUNには大体lsなどlinuxの標準的なコマンドが利用できる。aptやyumなどもイメージに依っては利用できるが、パッケージ管理システムが持つパッケージリストは最初の時点では空なためupdateをした後にainstallなどを実行すると良い。RUNコマンドは連続して複数書けるが、その分容量が大きくなる(DockerはRUN毎にコンテナの環境を区切っているらしい)ので、&&を使いコマンドを出来る限り連結させる。他のオプションはこちらを参照
https://docs.docker.jp/engine/reference/builder.htmldocker-compose.ymlについて
docker-composeというものもある。こちらはdocker-compose.ymlを利用してコンテナのセットを生成できる。複数コンテナをまとめて設定できる。Dockerを利用する場合は大体これを利用する。実行方法はdocker-compose.ymlファイルを作り、ターミナルやPowerShellでそのファイルが存在している場所にcdし、以下のコマンドを実行。
docker-compose updocker-compose.ymlファイルは以下のような感じで書きます。
docker-compose.ymlversion: "3" # Composeファイルの書式のバージョン services: # 以下それぞれのコンテナ・サービスの内容 nginx: # サービス名 image: nginx:latest #使用するコンテナのイメージ名(≒docker pull) volumes: # 共有フォルダ(ホストのフォルダ:コンテナ内のフォルダ) - ./src/web/dist/:/usr/share/nginx/html ports: # ポートフォワード(ホストのポート:コンテナ内のポート) - "80:80" nuxt: build: ./ #指定パス内のDockerfileをcompose up時に実行する volumes: - ./src/web/:/src ports: - "3000:3000" command: "npm run dev" # 起動時に実行するコマンド記述されている内容それぞれについて補足します。
services以下は実際に起動するコンテナ内容の記述。
上記ではnuxtとnginxの2つのコンテナが存在します。
(サービス名前は任意のアルファベットなら問題ない)
分かりにくいとは思いますが、サービス名=コンテナ名ではないです。
コンテナ名は別にあって、
指定していなければサービス名を含んだコンテナ名が自動で生成されます。・サービス名以下の内容について
最初にbuildかimageのどちらかが選択できます。
imageは指定した名前のdockerイメージをweb上から引っ張って来てコンテナを生成します。buildはDockerfileという設定ファイルを元にdockerイメージを作って、それを元にコンテナを生成します。
volumesはホスト側(実行しているOS側)のフォルダやファイルをコンテナ内のフォルダやファイルにリンクさせることが出来ます。
例えば、docker-compose.ymlvolumes: - ./src/nginx/nginx.conf:/etc/nginx/nginx.confこう書くと左の指定パス内にあるnginxの設定ファイルとコンテナ内のnginxの設定ファイルがリアルタイムで同期します。コンテナ内は独立しているのでリアルタイムでの編集が難しくなっていますが、簡単にホスト内で編集操作をしながらコンテナを動かすことが可能です。
portsは外部にコンテナ内のポートを公開します。exposeというものもありますが、こちらはホスト内限定でポートを公開します。例えば、上記の場合ホスト側でlocalhost:80でアクセスするとnginxが表示されます。
その他にも様々なオプションがあります。
下記ドキュメントを見ながら試行錯誤してみてください。
https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa
https://docs.docker.com/compose/最後に
date volumeを使ってnodejsやrubyなどのモジュールファイルを分けるだとか、ネットワークのルーティングの仕方、コンテナの連携の仕方など色々書きたかったんですが、執筆時間が長くなったので今回はナシにしました。
色々端折りましたがDockerについて、少しでもこの記事で理解できた!となったところがあれば幸いです。PS.Kurbernetesとかもそのうち触ってみたいですね...その際はまた記事書きます
- 投稿日:2021-01-21T16:49:28+09:00
VSCode と Docker で LaTeX 執筆環境の構築
モチベーション
昔に比べればましになったものの、やっぱり LaTeX の環境構築は時間がかかる
→ Docker で構築すれば解決するのではTL;DR
- とりあえず環境構築したい人向け
Docker イメージを作成 & DockerHub に公開→ 別記事- VSCode + 拡張機能で LaTeX 執筆環境を構築
必要なもの
- Git + Github アカウント
- Docker (Desktop)
- VSCode
インストール
- VSCode: https://code.visualstudio.com/
- Docker (Desktop): https://www.docker.com/get-started
- Git: https://git-scm.com/
Docker Desktop はインストール後、起動させる必要あり
作業フォルダの作成
特にこだわりがなければ このテンプレート を使用(既にフォルダがある場合)
(Mac向け) フォルダ共有の設定
作業フォルダの作成
で作ったフォルダを Docker で共有するための設定が必要Docker Desktop の設定を開いて、
Resources -> FILE SHARING
からフォルダを追加する
追加したらApply & Restart
で設定を適用させるDocker サービスの起動
Windows や Mac だとバックグランドで Docker のサービスを起動させておく必要がある。
基本は Docker Desktop を起動させておけばOK
- Win → スタートメニューから
Docker Desktop
を起動- Mac → Launchpad から
Docker Desktop
を起動執筆!
VS Code を起動させ
⌘ + O
を押して作業フォルダを開く
tex
フォルダ内のsample.tex
を選択する右上の
▷
でビルドを開始。左下に進捗が表示される。
(最初はコンテナを pull してくるので時間がかかる)無事ビルドできたら左側のツリーに
sample.pdf
が表示される
ビルドボタンのひとつ右のボタンがプレビューボタンなので押してプレビュータブを開く
Tips: プレビュータブで
⌘
キーを押しながらクリックすると、tex ファイルの該当箇所がハイライトされるカスタマイズ
作業フォルダの
.vscode/setting.json
を開くと、ビルド時の引数など編集できるビルド設定
以下の引数を https://texwiki.texjp.org/?Latexmk を参考に変更
{ "name": "latexmk", "command": "latexmk", "args": ["-gg", "-pdfdvi", "%DOC%"] }Docker コンテナの変更
以下の項目を変更
デフォルトのコンテナ → https://hub.docker.com/r/nshun/latex"latex-workshop.docker.image.latex": "nshun/latex"自動ビルドの設定
以下の項目を変更
onSave
にすると、ファイルを保存するたびにビルドされる"latex-workshop.latex.autoBuild.run": "never"既にある作業フォルダでビルドしたい
- インストールを済ませる
.vscode/settings.json
ファイルを作成- 中身を以下のようにする
{ "latex-workshop.latex.tools": [ { "name": "latexmk", "command": "latexmk", "args": ["-gg", "-pdfdvi", "%DOC%"] } ], "latex-workshop.chktex.enabled": false, "latex-workshop.docker.enabled": true, "latex-workshop.docker.image.latex": "nshun/latex", "latex-workshop.latex.autoBuild.run": "never", "latex-workshop.latex.outDir": ".", "latex-workshop.synctex.afterBuild.enabled": true, "latex-workshop.view.pdf.viewer": "tab" }
- 投稿日:2021-01-21T16:30:46+09:00
DockerのMySQLコンテナに外部からアクセスしたい
docker ps
docker exec -it 7c10 /bin/bashroot@7c10ef625739:/#
な表示になるので、
mysql -u root -p
でログインする
- 投稿日:2021-01-21T12:01:50+09:00
bundle install エラー
実行環境:
Winodows 10 Pro (64bit)
Vagrant 2.2.14
Ubuntu 16.04.6 LTS
Docker 18.09.7
ruby:ruby 2.7.2p137
Docker のコンテ内でRubyのsinatraライブラリをインストールするために
bundle install を実行したところ、以下のエラーが発生しました。
````Fetching source index from https://rubygems.rog/ Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.rog/ Retrying fetcher due to error (3/4): Bundler::HTTPError Could not fetch specs from https://rubygems.rog/ Retrying fetcher due to error (4/4): Bundler::HTTPError Could not fetch specs from https://rubygems.rog/ Could not fetch specs from https://rubygems.rog/以下のコマンドを実行したら解決したという情報を入手
````gem update --system再度インストールを実行。変化がありません。
wget https://api.rubygems.org/specs.4.8.gz を実行してダウンロードできるか試しましたが、これは成功しました。
ドメインの IP アドレスを調べました。
````root@dfed40fdb477:/var/www# host api.rubygems.org api.rubygems.org is an alias for rubygems.org. rubygems.org has address 151.101.2.132 rubygems.org has address 151.101.130.132 rubygems.org has address 151.101.194.132 rubygems.org has address 151.101.66.132 rubygems.org has IPv6 address 2a04:4e42::644 rubygems.org has IPv6 address 2a04:4e42:200::644 rubygems.org has IPv6 address 2a04:4e42:600::644 rubygems.org has IPv6 address 2a04:4e42:400::644 rubygems.org mail is handled by 10 mxb.mailgun.org. rubygems.org mail is handled by 10 mxa.mailgun.org.hostファイルに記述しました。
151.101.2.132 api.rubygems.org 151.101.130.132 api.rubygems.org 151.101.194.132 api.rubygems.org 151.101.66.132 api.rubygems.org 2a04:4e42::644 api.rubygems.org 2a04:4e42:200::644 api.rubygems.org 2a04:4e42:600::644 api.rubygems.org 2a04:4e42:400::644 api.rubygems.orgインストールが正常にできました。
- 投稿日:2021-01-21T10:43:18+09:00
EC-CUBE4 環境構築(ローカル編)
まえおき
- 公式リポジトリの中にある
docker-compose.yml
は、初回起動時にDockerfile
をビルドしてコンテナイメージを作る。そのため、composer.json
に EC-CUBEプラグインが入っている場合、Dockerfile
内に記述されているcomposer install
で止まる(と思われる)。したがって、公式のdocker-compose.yml
は使わずに環境を構築する方法を考える。- 個人的には、PhpStorm の静的解析は動いて欲しいのです。なので
vendor
ディレクトリの中も見えていた方がいいので、本手順で構築を行いました。- 以前に投稿した記事 EC-CUBE4 初回デプロイ が1年以上経ち、忘れている部分もあるので、まとめ直しました。
前提
- 動作確認したEC-CUBEのバージョンは
4.0.5
です。- 作業を進めるにあたり適当な
docker-compose.yml
を用意する。今回は以下のようなサンプルを想定する。version: '3' services: web: image: xxxx container_name: container-web working_dir: /var/www/vhosts/your_project/app volumes: - ../app:/var/www/vhosts/your_project:delegated - /var/www/vhosts/your_project/app/codeception - /var/www/vhosts/your_project/app/dockerbuild - /var/www/vhosts/your_project/app/gulp - /var/www/vhosts/your_project/app/node_modules - /var/www/vhosts/your_project/app/var/cache - /var/www/vhosts/your_project/app/var/log - /var/www/vhosts/your_project/app/var/sessions - /var/www/vhosts/your_project/app/zap ports: - '80:80'
- プロジェクトのディレクトリ構成は以下の通りです
your_workspace − your_project − docker/docker-compose.yml ∟ appDocker を使用して新しく開発環境を構築する手順
最新のソースコードを GitHub から取得する
cd your_workspace/your_project/app git clone -b 4.0 --depth 1 https://github.com/EC-CUBE/ec-cube.git .不要なファイルを削除する
rm -rf .git環境変数ファイルのコピーと変更
cp -ap .env.dist .env vi .envDockerの起動
cd your_workspace/your_project/docker docker-compose up -dPHPライブラリのインストール
docker-compose exec --user apache web composer install --no-scripts --no-autoloader docker-compose exec --user apache web composer dumpautoloadEC-CUBEのセットアップ
# キャッシュやログ出力に使われるディレクトリのパーミッションと所有者を変更 docker-compose exec web chown -R apache:apache ./var docker-compose exec web chmod -R 777 ./var # EC-CUBEの初期化 docker-compose exec --user apache web ./bin/console eccube:install※
eccube:install
について、内部的には以下と同等(らしい)。# (optional) データベース削除 # bin/console doctrine:database:drop --force # データベース作成 # bin/console doctrine:database:create # (optional) スキーマ削除 # bin/console doctrine:schema:drop --force # スキーマ生成 # bin/console doctrine:schema:create # 初期データ生成 # bin/console eccube:fixtures:loadEC-CUBE 4.0 開発者向けドキュメントサイト > インストール方法 > Windows 環境を使用する場合
キャッシュの生成
docker-compose exec --user apache web ./bin/console cache:warmupキャッシュクリアをする場合
docker-compose exec --user apache web ./bin/console cache:clear --no-warmupアクセス確認
http://localhost
を開いてデフォルトのショップが表示されればOKです。
URLは、利用した docker イメージに依存します。Docker を使用して他のマシンに開発環境を構築する手順(EC-CUBEプラグイン無し)
手順 「新しく開発環境を構築する手順 」 で使用したソースコードを用意する
環境変数ファイルのコピーと変更
cd your_workspace/your_project/app cp -ap .env.dist .env vi .envDockerの起動
cd your_workspace/your_project/docker docker-compose up -dPHPライブラリのインストール
docker-compose exec --user apache web composer install --no-scripts --no-autoloader docker-compose exec --user apache web composer dumpautoloadEC-CUBEのセットアップ
# キャッシュやログ出力に使われるディレクトリのパーミッションと所有者を変更 docker-compose exec web chown -R apache:apache ./var docker-compose exec web chmod -R 777 ./var # EC-CUBEの初期化 docker-compose exec --user apache web ./bin/console eccube:installキャッシュの生成
docker-compose exec --user apache web ./bin/console cache:warmupキャッシュクリアをする場合
docker-compose exec --user apache web ./bin/console cache:clear --no-warmupアクセス確認
http://localhost
を開いてデフォルトのショップが表示されればOKです。URLは、利用した docker イメージに依存します。
Docker を使用して他のマシンに開発環境を構築する手順(EC-CUBEプラグイン有り)
手順 「新しく開発環境を構築する手順 」 で使用したソースコードを用意する
環境変数ファイルのコピーと変更
cd your_workspace/your_project/app cp -ap .env.dist .env vi .envDockerの起動
cd your_workspace/your_project/docker docker-compose up -dPHPライブラリのインストール
EC-CUBEプラグインをインストール済みの場合は、EC-CUBEプラグインの情報が
composer.json
やcomposer.lock
に記載されています。売上集計プラグインは、ec-cube/SalesReport4
です。
このままでは、composer install
ができません…回避するには、利用しているEC-CUBEバージョンのオリジナルの
composer.json
とcomposer.lock
を用意してコマンドを実行します。docker-compose exec --user apache -e COMPOSER=composer_4.0.5.json web composer install --no-scripts --no-autoloader docker-compose exec --user apache web composer dumpautoload※ 環境変数
COMPOSER
を利用して、JSONファイル指定でコマンドを実行します。
上記の場合、ロックファイルのファイル名はcomposer_4.0.5.lock
です。EC-CUBEのセットアップ
# キャッシュやログ出力に使われるディレクトリのパーミッションと所有者を変更 docker-compose exec web chown -R apache:apache ./var docker-compose exec web chmod -R 777 ./var # EC-CUBEの初期化 docker-compose exec --user apache web ./bin/console eccube:install認証キーを設定
私の場合、案件毎に認証キーを揃えている(開発環境・ステージング環境・本番環境は同一)ので、はじめにインストールした環境で取得した認証キーをここで設定します。
update dtb_base_info set authentication_key='your_authentication_key';EC-CUBEプラグインのインストール
docker-compose exec --user apache web ./bin/console eccube:composer:install
./bin/console eccube:composer:require-already-installed
という別のコマンドもあります。
require
となっているので、composer.lock
とは違うバージョンが入る可能性がありますのでここでは使いませんでした。
eccube:composer:install
は、dtb_plugin
テーブルを参照しておらず、eccube:composer:require-already-installed
は、dtb_plugin
テーブルを参照している
という違いもあるようです。※
app/Customize/Entity
に定義した、エンティティ拡張トレイトが 一時フォルダに生成されます。EC-CUBEプラグインの有効化
docker-compose exec --user apache web ./bin/console eccube:plugin:enable --code=SalesReport4※ 他にもインストール済みのプラグインがある場合は、
SalesReport4
の部分を変えて実行します。
※app/Customize/Entity
に定義した、エンティティ拡張トレイトがapp/proxy/entity
に生成されます。キャッシュの生成
docker-compose exec --user apache web ./bin/console cache:warmupキャッシュクリアをする場合
docker-compose exec --user apache web ./bin/console cache:clear --no-warmupアクセス確認
http://localhost
を開いてデフォルトのショップが表示されればOKです。URLは、利用した docker イメージに依存します。
参考リンク
- 投稿日:2021-01-21T08:37:55+09:00
Dockerをざっくり学ぶ
はじめに
独学でRailsを勉強してた頃にDockerを知ったけど、別に環境既にPCに構築したし、何が良いのかよくわからん。使い方もよくわからん状態だったのですが、入社してから使う必要になって下記のUdemyの動画で勉強したので、そのアウトプットをしたいと思います。
ゼロからはじめる Dockerによるアプリケーション実行環境構築
ざっくりDockerとは何か、使い方を説明したいと思います。ざっくりと。
Dockerのメリット
そもそもここが分からないと学ぶ意味がないですね。
環境構築が簡単
Railsの環境構築やった方ならわかると思いますが、homebrew(Macの場合)で色々入れたり、なんかRubyのバージョンを選んだり色々しましたよね。
あとで説明しますが、Dockerを使っていれば
docker-compose up
というコマンドだけで全て終わります。一瞬です。(Dockerをインストールする必要はありますが。)PostgreSQL使ってみたいよっていう場合もローカルにPostgreSQL入れて、バージョン決めて、path通してetc...などやるの面倒ですよね。
docker-compose up
で終わりです。Railsに限らず色々なライブラリやフレームワークで、こんな感じで環境構築できます。
個人的にはこれが最大のメリットです。無駄なソフトをインストールせずにすむ
何かお試しでやろうと思ったら色々なソフトをインストールする必要があって、PCのストレージを使ってしまいますよね。さらに複数バージョン(Ruby 2.6, 2.7とか)を入れる場合にはさらにストレージを使います。
しかも何を入れたか忘れてしまった場合にはもうそれは一生消されず、ただPCの容量を食うだけのものになっちゃいます。
でもDockerを使っていれば使った環境は使い捨てにできるのでPCの容量を無駄に使うことはありません。(Docker自体はインストールする必要あるのでその分の容量は必要ですが)
環境を共有できる
ローカルで環境構築した場合Windows OSやMac OS上に色々構築していく訳ですが、本番デプロイする場合、本番環境を構築する仮想マシンがLinuxだと、そもそものOSの違いによってローカルで動いていたものが動かなくなることがあります。
また、同じRailsアプリを作るメンバーが違うOSやバージョンを使ってると人によっては動いたり動かなくなってしまうことがあります。
Dockerを使うことで同じ環境を使いまわせるので、ローカルで動いていれば本番でも動きますし、他の人とも同じ環境を簡単に共有することができます。(正確に言うと全く同じ環境という訳ではないですが、ここではとりあえず同じ環境ということにしておきます)
イメージとコンテナの違い
動画を見る前に初めてDockerを勉強した時にここで結構つまづいてたんですが、簡単に言うとイメージはテンプレートで、コンテナは実際の実行環境です。
例えば、Excelで履歴書を書くとして、ネット上にあるExcelで作られたテンプレートをダウンロードするとします。このテンプレートがイメージです。
誰かがExcelを使って作ったテンプレートですね。そして、そのテンプレートをダウンロードしてローカルで色々な情報を記入していきます。このローカルにダウンロードして、色々いじってるそのファイルがコンテナです。
コンテナをいくらいじってもイメージは変わりませんよね。何故ならネット上にあるテンプレートなので、ローカルでいくらいじってもローカルのファイルが変わるだけです。もちろんテンプレート自体(イメージ)を作ってネット上にアップロードすることもできます。
Dockerfileとdocker-composeの違い
Dockerfileはテンプレートを作る定義書です。
ネット上にある履歴書のテンプレートをダウンロードしたものの、ちょっと自分用にカスタマイズしたい時もありますよね。1枚しか書かないなら別にどんどん勝手に書き足していけばいいんですが、履歴書を複数枚書かなければいけないから自分用のテンプレートを作ってから、それを複製して別の履歴書を書きますよね。
このおれおれテンプレートを作るのがDockerfileです。
参考にDockerのドキュメントから拝借して少し修正したDockerfileのサンプルが下記のコードです。
#rubyのv2.5のイメージを使う FROM ruby:2.5 #ruby:2.5には入っていないライブラリを追加する RUN apt-get update -qq && apt-get install -y nodejs postgresql-client # myappというディレクトリの作成 RUN mkdir /myapp # myappというディレクトリに移動(cd myapp) WORKDIR /myapp # ローカルのGemfileをmyappにコピー COPY Gemfile /myapp/Gemfile # ローカルのGemfile.lockをmyappにコピー COPY Gemfile.lock /myapp/Gemfile.lock # gemのインストール RUN bundle install # ローカルファイルをmyappにコピー COPY . /myapp # その他処理を続けて書いていく。元々のイメージはrubyのversion2.5という環境でしかなかったのですが、色々つけ足すことでRailsの環境が作れます。
一方docker-composeはコンテナを作るときに使われます。
イメージ(テンプレート)からコンテナ(実行環境)を作るのに下記コマンドを使用します。
docker run [Image名]
さらに色々オプションをつけると以下のようなコマンドになります。(コマンドはDockerのドキュメントから拝借)
docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash
これを毎回入力するのは面倒なので、docker-composeを使います。
このオプションをdocker-compose.ymlに書いておくと、docker-compose up
だけでそのオプションを反映したコンテナを作成してくれます。さらにdocker-composeでは、複数のコンテナを同時に立てることができます。
docker runだと一つずつしかコンテナ立てることができないですが、docker-composeに書いておけば幾つでもコンテナを同時に立てることができます。また、コンテナ同士を勝手に接続してくれます。
例えばrailsのコンテナとpostgreSQLのコンテナを接続しておかないとrailsのコンテナがpostgreSQLのコンテナを認識できずいつまでたっても接続できません。
またまたdockerのドキュメントからサンプルのdocker-compose.ymlを拝借します。
docker-compose.ymlversion: "3.9" #使用するdocker-composeのバージョン services: #アプリの構成要素を定義、つまりコンテナ db: #サービス名(ログとかに出てくる名前) image: postgres #使用するイメージ(タグも付けられるpostgres:latestとか) volumes: #データを永続化するためのローカルの保存場所の指定(これを指定しないとコンテナ消すとデータも消える) - ./tmp/db:/var/lib/postgresql/data environment: #環境変数 POSTGRES_PASSWORD: password web: build: . #自分で定義したDockerfileを使用する場合にそのDockerfileの保存場所を指定 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サービスが起動してからこのサービスを起動するようにする。 - dbこのdocker-composeではネットワークの設定を書いていませんが、勝手に
ディレクトリ名_default
というネットワークを構築して各サービスを繋げてくれます。このおかげでdbサービスからwebサービスにデータを送ったりすることができるようになるわけです。
こんな感じでdocker-compose使うと簡単に複数コンテナ立てれるんだなぁくらいの理解で大丈夫かと思います。
まとめ
最初にRailsだけ勉強するみたいな状況だとそもそもの有用性とかあまりないんですが、他の言語だったりライブラリを使うとなった時にさっと環境構築できるので早めに覚えておいて損はないかなぁと思います。
あと、Dockerfile自体が環境構築の定義書みたいになってるので、本番環境をDocker使わないで構築するとしてもDockerfile通りに構築していけば基本的に本番環境できるので、本番環境の作り方を学ぶ意味でもDocker学ぶのは良いことですね。
- 投稿日:2021-01-21T06:23:32+09:00
[Docker]Alpineでの容量可視化ツール「duf」の導入
はじめに
- システム内での容量確認のため、dfやduコマンドを利用する事は多い。
- そこでdufという容量可視化ツールをmacで利用していた。
- 便利であったため、同様にDocker内のalpineへも展開する必要が発生。
- 今回は、Docker内のAlpineLinuxへのdufの導入を記録する。
環境
- alpine:edge
手順
必要ファイルの取得
- 以下のコマンドで、任意の場所に必要なバイナリを取得する。
- apkのパッケージとして用意されていないため。
wget
コマンドがなければ、curl
コマンドで代替。# 取得場所の作成・移動 mkdir ~/work cd ~/work # バイナリの取得 wget https://github.com/muesli/duf/releases/download/v0.5.0/duf_0.5.0_linux_amd64.apk
- ※
wget: bad address 'github.com'
のようなエラーが出た場合のみ、/etc/resolve.conf
を以下のようにを変更/etc/resolve.conf# This file is included on the metadata iso nameserver 8.8.8.8 # 変更導入
- 以下のコマンドで、バイナリから
duf
を取得。# dufの取得 apk add --allow-untrusted duf_0.5.0_linux_amd64.apk
- ※error出力が出るが、利用可能状態ではある。
確認
- 以下の画面のコマンドのように利用可能か確認。
- ※以下、各便利オプションの例。詳細はこちらを参考
参考
- 投稿日:2021-01-21T02:51:53+09:00
Dockerを用いてRuby on Railsの環境構築をする方法( Docker初学者向け )
Dockerを初めて勉強するとき、多くの方が「参考書」や「入門Dockerなどのサイト」で基礎的なところから学習すると思います。
しかし、Dockerとは何なのか、何のイメージも沸いていない状態で、様々な単語を羅列されても、さっぱりわからないという方も多いと思います。( 少なくとも私はそうでした。)
なので極論、基礎すっ飛ばしてまず実際にDockerで仮想環境を構築しながら学んでいこうという話です。
そして何となくでいいのでイメージを掴んでから、基礎を学べば良いと思います。
Dockerを初めて学習する方の中で、Ruby on Railsで開発したアプリケーションをポートフォリオとしている方も多いのではないでしょうか。
なので今回は、Dockerを用いてRuby on Railsの環境構築をする方法 をご紹介いたします。ですが、超基本的なことだけ先に説明させてください。
( とにかく早く環境構築した人は 前提 まで飛んでください )Dockerとは
- Dockerエンジンとは -
Dockerエンジンとは Dockerイメージの作成 や コンテナの起動 などを行う、いわばDockerの要です。
- コンテナとは -
コンテナとはDockerエンジン上で構築される仮想環境そのものです。
コンテナは、CentOS
やUbunts
などの OS、Nginx
やMySQL
などの ミドルウェア、Rails
やWordPress
などアプリケーションまで、様々な環境を構築することができます。- Dockerイメージとは -
Dockerイメージは、コンテナを作成するための レシピ のようなものです。
CentOS、MySQL、Ruby などなど、他にも数えきれないほどのDockerイメージがあります。- Dockerfileとは -
Dockerfileは、オリジナルのDockerイメージを作成するための設計書のようなものです。
既存のDockerイメージをベースに、パッケージをインストールしたり、ファイルを書き換えたりした、新しいイメージを作成することができます。- Docker composeとは -
Docker compose とは、複数のコンテナの構築、実行する手順を自動化するツールです。
その手順などを記したファイルがdocker-compose.yml
で、これのおかげで少ないコマンドの実行で複数のコンテナを起動することができます。環境
- MacOS
- Docker 20.10.2
- docker-compose 1.27.4
- Ruby 2.5.7
- Rails 5.2.4
- MySQL 5.7
前提
Docker
およびDocker compose
のインストールを済ませてください- これ以降の説明の
myapp
の部分はご自身のアプリケーション名に変えてください- とにかく早く環境構築したい方は、説明を飛ばし、コピペして コマンドを実行してください。
アプリケーションの作業ディレクトリを作成
mkdir
で作業ディレクトリを作成します。$ mkdir myapp必要なファイルを用意
ファイル構成は以下のようになります。
myapp |-- Dockerfile |-- docker-compose.yml |-- Gemfile |-- Gemfile.lockそれでは、先ほど作成したディレクトリの中に以下の各ファイルを作成していきます。
① Gemfile
Gemfilesource 'https://rubygems.org' gem 'rails', '~> 5.2.4', '>= 5.2.4.2'③で作成する
Dockerfile
でbundle install
する項目があるのですが、そのときにこのGemfile
を使います。② Gemfile.lock
Gemfile.lock
Gemfile.lock
の中身は空でOKです。
Gemfile.lock
はGemfile
とセットで必要なので、用意します。③ Dockerfile
DockerfileFROM ruby:2.5.7 # ベースにするイメージを指定 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs default-mysql-client vim # RailsのインストールやMySQLへの接続に必要なパッケージをインストール RUN mkdir /myapp # コンテナ内にmyappディレクトリを作成 WORKDIR /myapp # 作成したmyappディレクトリを作業用ディレクトリとして設定 COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock # ローカルの Gemfile と Gemfile.lock をコンテナ内のmyapp配下にコピー RUN bundle install # コンテナ内にコピーした Gemfile の bundle install COPY . /myapp # ローカルのmyapp配下のファイルをコンテナ内のmyapp配下にコピー
Dockerfile
は自分オリジナルの イメージ を作成するための設計書のようなものです。
今回はruby:2.5.7
という元々誰かが作ったイメージをベースに、Railsのインストールに必要なパッケージをインストールしたり、myapp
をコピーしたり、bundle install
したりと、様々なもの加えているというわけです。④ docker-compose.yml
docker-compose.ymlversion: '3' # docker-composeの書式のバージョンを指定します。(原則、最新を指定する) services: db: image: mysql:5.7 environment: MYSQL_USER: root MYSQL_ROOT_PASSWORD: pass ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql 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 volumes: mysql_data:
docker-compose.yml
は複数のコンテナを定義し、実行するためのファイルです。
ファイルに書かれている単語をひとつずつ解説してきます。services:
services
の中でコンテナを定義します。
今回はMySQL
とRails
をコンテナ化するので、名前をわかりやすくdb
、web
とします。
実際に作成されるコンテナ名は「アプリケーション名 + サービス名 + 連番」でmyapp_db_1
、myapp_web_1
となります。image:
利用するイメージを指定し、コンテナを構築します。
enviroment:
MySQLに関する環境変数を設定します。(今回はパスワードのみ)
パスワードはご自身で決めて構いません。ports:
ポート番号に関するを設定します。
MySQL は3306
、 Rails は3000
というポート番号がデフォルト値として設定されています。
Railsに関してはおなじみのlocalhost:3000
の 3000 ですね。
Dockerを使わず、ローカルで環境構築した場合は直接このlocalhost:3000
にアクセスすれば良かったわけですが、Dockerを使った場合、コンテナに外部からアクセスすることができないので、ちょっとした工夫が必要です。
そこで登場するのがこのports:
です。
ports:
は- ローカル側のポート番号 : コンテナ側のポート番号
で表します。
今回、ports: - 3000:3000
としていますが、説明をわかりやすくするため、仮にもしports: - 9000:3000
に設定するとします。
これはコンテナ側の3000ポート
に9000ポート
でのアクセスを許可するという意味になります。
つまりこの場合、localhost:9000
でアクセス可能になるということになります。volumes:
ボリュームに関する設定をします。
ボリューム
とはコンテナにおいて生成されるデータを永続的に保存するためのものです。
MySQLを例にとると、MySQLをコンテナ化し、そこに テーブル や カラム などのデータを保存したとします。
しかし、そのMySQLのコンテナを削除してしまうと、保存してあったテーブル、カラムなどのデータも一緒に削除されてしまいます。
それはまずいので、データだけローカルにも保存しておく、この仕組みをボリューム
といいます。
このボリュームを利用すると、仮にコンテナを削除したとしても、新しくコンテナを立ち上げたときに、そのデータを再利用することができます。ボリュームを保存する方法は大きく分けて2つあります。
1つ目は、保存したいディレクトリをマウントする方法、2つ目は、名前付きボリュームを利用する方法 です。今回
MySQL
は2つ目の名前付きボリュームを利用する方法
を使います。この方法は、ローカルに名前付きのボリュームを作成し、そこにコンテナ側の指定したディレクトリを保存するというものです。
名前付きボリュームの場合、volumes:
は- ボリューム名 : コンテナ側の保存させたいディレクトリ
で表します。
今回、ボリューム名
をmysql_data
とし、コンテナ側の保存させたいディレクトリ
は MySQLのデータ保存場所である/var/lib/mysql
を指定します。
結果、volumes: - mysql_data:/var/lib/mysql
という書き方になります。
そして、version: や services: と同じ段落(トップレベル)の、一番下に書いているvolumes:
にボリューム名を記載し、名前付きボリュームであることを明示します。次に
Rails
は、1つ目の保存したいディレクトリをマウントする方法
を使います。
この方法は、「ローカル側の指定したディレクトリ」と「コンテナ側の指定したディレクトリ」を同期させて、両者を常に同じ状態に保つというものです。
マウントする場合、volumes:
は- ローカル側の同期させたいディレクトリ : コンテナ側の同期させたいディレクトリ
で表します。
今回、volumes: - .:/myapp/
としています。
つまり、.
( docker-compose.ymlのあるディレクトリ、つまりローカル側のmyapp配下
) と/myapp/
( コンテナ側のmyapp配下
) を同期するということです。
これにより、コンテナ起動後、ローカルのmyapp配下のファイルなどを編集すると、コンテナ側にも編集が反映されます。build:
Dockerfileのあるディレクトリをして指定します。( docker-compose.ymlから見て同じディレクトリにDockerfileが存在するので
.
)
ここのステップで ③で説明したDockerfile
を利用しオリジナルのイメージを作成し、コンテナを構築します。command:
コンテナ起動時の実行されるコマンドを設定します。
今回設定するコマンドは、bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
です。
bash -c ""
は コンテナの中に入り""
内のコマンドを実行するという命令です。
rm -f tmp/pids/server.pid
で rails server が起動していた場合、停止します。( 何らかの原因でrails server がすでに起動していた場合、新しいrails serverが起動できないため。)
bundle exec rails s -p 3000 -b '0.0.0.0'
で rails server を起動します。
&&
は複数のコマンドを実行するときに用います。depends_on:
コンテナの作成順序の設定です。
depends_on: - db
は、MySQLのコンテナ
が起動してからRailsのコンテナ
を起動するという意味です。rails new を実行
$ docker-compose run web rails new . --force --database=mysql --skip-bundleアプリケーションの作業ディレクリに移動し、
docker-compose run
コマンドでrails new
を実行します。
--force
: 同じファイルがある場合、上書きする
--database=mysql
: データベースにMySQLを指定する
--skip-bundle
: bundle install をスキップする。( bundle installはあとで行います。)このコマンドを実行すると、
Dockerfile
を元に、イメージとコンテナを作成し、そのコンテナの中でrails new
を実行します。
よって、ローカルにも見慣れたファイルが作成されたと思います。docker-compose build を実行
$ docker-compose build
rails new
でGemfile
が更新されたので、bundle install
するため、docker-compose build
を実行します。
先ほどのdocker-compose run
で作成されたイメージはrails new
される前のGemfile
をbundle install
したイメージなので、更新されたGemfile
をbundle install
したイメージを再度作成する必要があります。database.yml を編集
/config/database.yml# MySQL. Versions 5.1.10 and up are supported. # # Install the MySQL driver # gem install mysql2 # # Ensure the MySQL gem is defined in your Gemfile # gem 'mysql2' # # And be sure to use new-style password hashing: # https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html # default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root # 以下2行を編集 password: pass host: db development: <<: *default database: myapp_development # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: myapp_test # As with config/secrets.yml, you never want to store sensitive information, # like your database password, in your source code. If your source code is # ever seen by anyone, they now have access to your database. # # Instead, provide the password as a unix environment variable when you boot # the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database # for a full rundown on how to provide these environment variables in a # production deployment. # # On Heroku and other platform providers, you may have a full connection URL # available as an environment variable. For example: # # DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase" # # You can use this database configuration with: # # production: # url: <%= ENV['DATABASE_URL'] %> # production: <<: *default database: myapp_production username: myapp password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
password:
とhost:
を編集します。
password:
にはdocker-compose.yml
のMYSQL_ROOT_PASSWORD:
に書いたパスワードを記載します。
host:
にはdocker-compose.yml
で命名したMySQLのコンテナ名db
を記載します。docker-compose up -d でコンテナを起動
$ docker-compose up -dこのコマンドでコンテナを起動します。
-d
をつけることでバックグラウンドで起動します。これでコンテナが起動できました。
以下のコマンドでちゃんと起動しているか確認しましょう。$ docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------------- myapp_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp myapp_web_1 bash -c rm -f tmp/pids/ser ... Up 0.0.0.0:3000->3000/tcpこのように、それぞれのコンテナが
UP
になっていれば起動成功です。データベースを作成
以下のコマンドでデータベースを作成します。
$ docker-compose exec web rails db:createlocalhost:3000にアクセス
localhost:3000
にアクセスし、以下のページが表示されれば DockerによるRailsの環境構築 は完了です。
環境構築後の開発の仕方
これまで通り、ファイルの編集などは基本ローカル環境で行います。
しかしrails g
やrails db:migrate
などの railsコマンド はコンテナ内で実行します。
なので、コンテナに入る必要があります。
以下のコマンドでRailsのコンテナに入ります。$ docker-compose exec web bashするとプロンプト( ターミナルの左側の部分 )が以下のように変わると思います。( @の後ろはコンテナのID )
root@97b8e3430f3f:/myapp#これでコンテナの中に入れました。ここで railsコマンド を実行してください。
これまでのローカル環境での開発で、ターミナルで実行していたコマンドは全てこのコンテナ内で行います。( gitコマンドはローカル環境で行います )コンテナを抜けるには、以下のコマンドを実行してください。( もしくは
control + d
)$ exit- ログの表示 -
これまでは
rails s
でサーバーを起動し、ログが表示されていたと思います。
コンテナ内において、ログを表示させる方法は以下の通りです。コンテナ内に入り、以下のコマンドを実行します。
$ tail -f log/development.logこれでログが表示されます。
ターミナルでタブを3つ開き、「ローカルの操作をするタブ」、「コンテナ内でrailsコマンドなどを実行するタブ」、「ログを表示するタブ」に分けると効率的な開発ができるかもしれません。
- デバッグに関して -
開発中にエラーが発生し、controllerを編集し、デバッグしたとします。
この場合、一度サーバーを再起動させると思います。Dockerの場合、Railsのコンテナ( myapp_web_1 )ごと以下のコマンドで再起動します。
$ docker-compose restart webしかし、デバッグするたびにいちいちコンテナを再起動するのは非効率です。
なので、サーバー起動中もコードの更新をチェックしてくれるように設定します。
config/environments/development.rb
の一番下に記載されている以下をconfig.file_watcher = ActiveSupport::EventedFileUpdateChecker次のように変更します。
config.file_watcher = ActiveSupport::FileUpdateCheckerこれで再起動を行わずにデバッグが可能になります。
その他の基本的なDockerのコマンド
・ コンテナの停止、削除
$ docker-compose down・ コンテナの停止、削除および紐づいている名前付きボリュームの削除
$ docker-compose down -v※ 永続化しているデータが消えるの要注意 !
・ docker-composeのログを出力
$ docker-compose logsコンテナがうまく起動しなかったときなどにログを見ると、原因がわかったりします。
・ イメージの一覧
$ docker images・ イメージの削除
$ docker rmi イメージID・ 名前付きボリュームの一覧
$ docker volume ls・ 名前付きボリュームの削除
$ docker volume rm ボリュームの名前まとめ
最初の内は理解できないことも多いと思います。
ひとつずつ着実に理解していくのではなく、全体的に漠然と理解していくと良いと思います。この記事を読んでわからないことがあれば、コメントしていただければお答えいたします !
最後まで読んでいただきありがとうございました。
参考