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

docker-compose 基本的なコマンド

はじめに

docker-composeの基本的なコマンドについてまとめたので忘備録

docker-compose version 1.27.4, build 40524192

コマンド一覧

イメージの一覧を表示

$ docker-compose images

コンテナの一覧を表示

$ docker-compose ps

イメージの作成(ビルド)

$ docker-compose build

Dockerイメージからコンテナを作る 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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【コピペ】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.xPHP(PHP-FPM) 7.4.x
  • MySQL 5.7.xMySQL 8.x
  • Composer 最新版Composer 2.x
  • Laravel 5.6Laravel 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は除外
.env

docker-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 -d

Nginxの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.conf

docker-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/composer

latestにしてたから最新版が入ってると思いきや、何故か 1.x だったので 2.x で固定。

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

XDebugのバージョン固定

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.8

Laravelの準備

[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/
スクリーンショット 2021-01-21 23.02.41.png

コンテナ削除

[Mac]$ docker-compose down --rmi all --volumes

※参考
https://qiita.com/suin/items/19d65e191b96a0079417

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の初期化を行う

bash
git init

.gitignore

  • Gitの管理下に置きたくないファイルやディレクトリを管理するためのファイル
.gitigrore
/.env

.env

  • 環境変数を管理するために使われるファイル
.env
# commons
WORKDIR=app
CONTAINER_PORT=3000
RAILS_PORT=3000
APACHE_PORT=8080

# db
# POSTGRES_PASSWORD=password

docker-compose.yml

まずプロジェクトフォルダを作成し、そこにrailisフォルダ、apacheフォルダとdockercompose.ymlファイルを作成する。

docker-compose.yml
version: '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: true

CORSの設定

  • CORSとは、異なるオリジン感の通信を許可する仕組み

    1. Gemのインストール
      1. railsディレクトリのGemfileを開く
      2. 26行目付近のgem 'rack-cors'のコメントを外す
      3. Dockerイメージを再ビルド
    2. 設定ファイルの編集

      1. api/config/initializers直下にあるcors.rbが設定ファイル
      2. 下記のように編集

        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
        end
        

Dockerfile

railsイメージはDockerfileから作成するためDockerfileとentrypoint.shをrailsフォルダの下に作成する。

現在のフォルダ構成
myapp/
    |--docker-compose.yml
        |--apache/
    |--rails/
      |--Dockerfile
      |--entrypoint.sh

Dockerfile
FROM 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.lock

Gemfile
source '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をオプションとして付けている。

bash
docker-compose run rails rails new . --api --force --skip-bundle

docker-compose runは引数で指定したサービスについて、イメージの構築から、コンテナの作成・起動までを行ってくれるコマンドで、それプラスサービス名の後にコマンドを打つとコンテナ内で実行してくれる。
ここではサービスにDockerfileで指定したrails:を指定しており、プラスアルファのコマンドとしてrails new .を行っている。

--forceは既存のGemfileを上書きするためのオプションである。
後で、イメージを構築する際にbundle installは行われるので、ここでは--skip-bundleとしている。

イメージの構築

bash
docker-compose build

このとき、Dockerfileよりrailsのイメージが作成される。

コンテナの作成・起動

bash
docker-compose up

httpdのイメージはこのときに、Docker Hubからローカルに持ってきている。

localhost:8080でapache/htmlにアクセスできる。localhost:3000でrailsサーバにアクセスできる。

補足

docker-compose buildbundle 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ファイルを作成する - 独学プログラマ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/0e65849b91a329529675

Dockerを導入する

やっと本題ですが、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 dev

RUNには大体lsなどlinuxの標準的なコマンドが利用できる。aptやyumなどもイメージに依っては利用できるが、パッケージ管理システムが持つパッケージリストは最初の時点では空なためupdateをした後にainstallなどを実行すると良い。RUNコマンドは連続して複数書けるが、その分容量が大きくなる(DockerはRUN毎にコンテナの環境を区切っているらしい)ので、&&を使いコマンドを出来る限り連結させる。他のオプションはこちらを参照
https://docs.docker.jp/engine/reference/builder.html

docker-compose.ymlについて

docker-composeというものもある。こちらはdocker-compose.ymlを利用してコンテナのセットを生成できる。複数コンテナをまとめて設定できる。Dockerを利用する場合は大体これを利用する。実行方法はdocker-compose.ymlファイルを作り、ターミナルやPowerShellでそのファイルが存在している場所にcdし、以下のコマンドを実行。

docker-compose up

docker-compose.ymlファイルは以下のような感じで書きます。

docker-compose.yml
version: "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.yml
volumes:
     - ./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とかもそのうち触ってみたいですね...その際はまた記事書きます

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VSCode と Docker で LaTeX 執筆環境の構築

モチベーション

昔に比べればましになったものの、やっぱり LaTeX の環境構築は時間がかかる
→ Docker で構築すれば解決するのでは

TL;DR

  • とりあえず環境構築したい人向け
  • Docker イメージを作成 & DockerHub に公開 → 別記事
  • VSCode + 拡張機能で LaTeX 執筆環境を構築

必要なもの

  • Git + Github アカウント
  • Docker (Desktop)
  • VSCode

インストール

Docker Desktop はインストール後、起動させる必要あり

作業フォルダの作成

特にこだわりがなければ このテンプレート を使用(既にフォルダがある場合

緑の Use this template ボタンを押す

自分の Github アカウントにフォーク

無事作成できたらローカルにクローンしてくる

(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 が表示される
ビルドボタンのひとつ右のボタンがプレビューボタンなので押してプレビュータブを開く
スクリーンショット 2021-01-21 16.28.30.png

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"

既にある作業フォルダでビルドしたい

  1. インストールを済ませる
  2. .vscode/settings.json ファイルを作成
  3. 中身を以下のようにする
{
  "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"
}

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerのMySQLコンテナに外部からアクセスしたい

docker ps
docker exec -it 7c10 /bin/bash

root@7c10ef625739:/#

な表示になるので、

mysql -u root -p

でログインする

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

インストールが正常にできました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC-CUBE4 環境構築(ローカル編)

:zipper_mouth: まえおき

  • 公式リポジトリの中にある docker-compose.yml は、初回起動時に Dockerfile をビルドしてコンテナイメージを作る。そのため、composer.json に EC-CUBEプラグインが入っている場合、Dockerfile 内に記述されている composer install で止まる(と思われる)。したがって、公式の docker-compose.yml は使わずに環境を構築する方法を考える。
  • 個人的には、PhpStorm の静的解析は動いて欲しいのです。なので vendor ディレクトリの中も見えていた方がいいので、本手順で構築を行いました。
  • 以前に投稿した記事 EC-CUBE4 初回デプロイ が1年以上経ち、忘れている部分もあるので、まとめ直しました。

:point_right_tone1: 前提

  • 動作確認した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
                  ∟ app

:raised_hands_tone1: Docker を使用して新しく開発環境を構築する手順

最新のソースコードを 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 .env

Dockerの起動

cd your_workspace/your_project/docker
docker-compose up -d

PHPライブラリのインストール

docker-compose exec --user apache web composer install --no-scripts --no-autoloader
docker-compose exec --user apache web composer dumpautoload

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

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:load

EC-CUBE 4.0 開発者向けドキュメントサイト > インストール方法 > Windows 環境を使用する場合

キャッシュの生成

docker-compose exec --user apache web ./bin/console cache:warmup

:point_up_tone2: キャッシュクリアをする場合

docker-compose exec --user apache web ./bin/console cache:clear --no-warmup

アクセス確認

http://localhost を開いてデフォルトのショップが表示されればOKです。
:no_entry_sign: URLは、利用した docker イメージに依存します。

:raised_hands_tone1: Docker を使用して他のマシンに開発環境を構築する手順(EC-CUBEプラグイン無し)

手順 「新しく開発環境を構築する手順 」 で使用したソースコードを用意する

環境変数ファイルのコピーと変更

cd your_workspace/your_project/app
cp -ap .env.dist .env
vi .env

Dockerの起動

cd your_workspace/your_project/docker
docker-compose up -d

PHPライブラリのインストール

docker-compose exec --user apache web composer install --no-scripts --no-autoloader
docker-compose exec --user apache web composer dumpautoload

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

キャッシュの生成

docker-compose exec --user apache web ./bin/console cache:warmup

:point_up_tone2: キャッシュクリアをする場合

docker-compose exec --user apache web ./bin/console cache:clear --no-warmup

アクセス確認

http://localhost を開いてデフォルトのショップが表示されればOKです。

:no_entry_sign: URLは、利用した docker イメージに依存します。

:raised_hands_tone1: Docker を使用して他のマシンに開発環境を構築する手順(EC-CUBEプラグイン有り)

手順 「新しく開発環境を構築する手順 」 で使用したソースコードを用意する

環境変数ファイルのコピーと変更

cd your_workspace/your_project/app
cp -ap .env.dist .env
vi .env

Dockerの起動

cd your_workspace/your_project/docker
docker-compose up -d

PHPライブラリのインストール

EC-CUBEプラグインをインストール済みの場合は、EC-CUBEプラグインの情報が composer.jsoncomposer.lock に記載されています。売上集計プラグインは、ec-cube/SalesReport4 です。
このままでは、 composer install ができません… :sob:

回避するには、利用しているEC-CUBEバージョンのオリジナルの composer.jsoncomposer.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

:point_up_tone2: キャッシュクリアをする場合

docker-compose exec --user apache web ./bin/console cache:clear --no-warmup

アクセス確認

http://localhost を開いてデフォルトのショップが表示されればOKです。

:no_entry_sign: URLは、利用した docker イメージに依存します。

参考リンク

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.yml
version: "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学ぶのは良いことですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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出力が出るが、利用可能状態ではある。

確認

  • 以下の画面のコマンドのように利用可能か確認。

image

image

image

image

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerを用いてRuby on Railsの環境構築をする方法( Docker初学者向け )

Dockerを初めて勉強するとき、多くの方が「参考書」や「入門Dockerなどのサイト」で基礎的なところから学習すると思います。
しかし、Dockerとは何なのか、何のイメージも沸いていない状態で、様々な単語を羅列されても、さっぱりわからないという方も多いと思います。( 少なくとも私はそうでした。)
なので極論、基礎すっ飛ばしてまず実際にDockerで仮想環境を構築しながら学んでいこうという話です。
そして何となくでいいのでイメージを掴んでから、基礎を学べば良いと思います。
Dockerを初めて学習する方の中で、Ruby on Railsで開発したアプリケーションをポートフォリオとしている方も多いのではないでしょうか。
なので今回は、Dockerを用いてRuby on Railsの環境構築をする方法 をご紹介いたします。

ですが、超基本的なことだけ先に説明させてください。
( とにかく早く環境構築した人は 前提 まで飛んでください )

Dockerとは

1_y6CvfE6WUgoIdT8Mp0Ev_g.png
Dockerは 仮想環境を構築するためのツール です。

- Dockerエンジンとは -

Dockerエンジンとは Dockerイメージの作成 や コンテナの起動 などを行う、いわばDockerの要です。

- コンテナとは -

コンテナとはDockerエンジン上で構築される仮想環境そのものです。
コンテナは、CentOSUbuntsなどの OS、NginxMySQLなどの ミドルウェア、RailsWordPressなどアプリケーションまで、様々な環境を構築することができます。

- Dockerイメージとは -

Dockerイメージは、コンテナを作成するための レシピ のようなものです。
CentOS、MySQL、Ruby などなど、他にも数えきれないほどのDockerイメージがあります。

- Dockerfileとは -

Dockerfileは、オリジナルのDockerイメージを作成するための設計書のようなものです。
既存のDockerイメージをベースに、パッケージをインストールしたり、ファイルを書き換えたりした、新しいイメージを作成することができます。

- Docker composeとは -

docker-compose-button.jpg
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

Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 5.2.4', '>= 5.2.4.2'

③で作成するDockerfilebundle installする項目があるのですが、そのときにこのGemfileを使います。

② Gemfile.lock

Gemfile.lock

Gemfile.lockの中身は空でOKです。
Gemfile.lockGemfileとセットで必要なので、用意します。

③ Dockerfile

Dockerfile
FROM 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.yml
version: '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の中でコンテナを定義します。
今回はMySQLRailsをコンテナ化するので、名前をわかりやすくdbwebとします。
実際に作成されるコンテナ名は「アプリケーション名 + サービス名 + 連番」myapp_db_1myapp_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 newGemfileが更新されたので、bundle installするため、docker-compose buildを実行します。
先ほどのdocker-compose runで作成されたイメージはrails newされる前のGemfilebundle installしたイメージなので、更新されたGemfilebundle 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.ymlMYSQL_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:create

localhost:3000にアクセス

localhost:3000にアクセスし、以下のページが表示されれば DockerによるRailsの環境構築 は完了です。
スクリーンショット 2021-01-20 19.39.11.png

環境構築後の開発の仕方

これまで通り、ファイルの編集などは基本ローカル環境で行います
しかしrails grails 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 ボリュームの名前

まとめ

最初の内は理解できないことも多いと思います。
ひとつずつ着実に理解していくのではなく、全体的に漠然と理解していくと良いと思います。

この記事を読んでわからないことがあれば、コメントしていただければお答えいたします !

最後まで読んでいただきありがとうございました。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む