20190830のdockerに関する記事は12件です。

最近Docker Toolboxでホストディレクトリがマウントできない問題について

Docker Toolbox

MacやLinux環境で開発できれば良いのですが、職場の都合等でWindowsでDockerを使うこともあると思います。その選択肢としてDocker Toolboxがあるのですが、これはVirtualBoxのLinuxを使って起動するため色々と面倒なことがあります。

ホストディレクトリがマウントできない問題

dockerコンテナの中にホストディレクトリをマウントする際には以下のコマンドを実行します。
docker run -v [ホストの絶対パス]:[コンテナ内の絶対パス] [イメージ名] [コマンド]

しかし、Docker Toolboxの場合は最新のverである19.03.1をダウンロードし、DockerQuickstartTerminalで起動して上のコマンドを実行してもマウントできないという問題が発生しています。

解決策

以下の手順で行います。
・すでにインストールしている場合はDockerとVirtualBoxを削除する。.dockerディレクトリと.Virtualboxディレクトリが残っている場合はこれらも削除
・v18.09.3のDockerToolboxをインストール
*このとき以下のsetupでは一番下にチェックを入れないようにしてください。チェックを入れるべきという記事を見かけましたが、自分の環境(Windows10 home)では上手くいきませんでした。
dockertoolbox.png
・DockerQuickstartTerminalではなく、コマンドプロンプトから以下のコマンドを実行。
docker-machine create --driver "virtualbox" --virtualbox-boot2docker-url https://github.com/boot2docker/boot2docker/releases/download/v18.09.8/boot2docker.iso default
QuickstartTerminalを使うと、最新verのboot2dockerがダウンロードされて上手くいかないので、コマンドプロンプトから実行してください。

これの手順でインストールすると、docker run -vでホストディレクトリがマウントできるようになります。最新のverではなく18.09.3を使うのがポイントです。参考になれば幸いです。

参考文献

https://github.com/docker/toolbox/issues/844

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

digdag の docker.run_options を少しだけ試した

digdag の docker.run_options

digdagのバージョン 0.9.37 から docker に関する オプションが使えるようになったようです。

リリースノート : https://docs.digdag.io/releases/release-0.9.37.html?highlight=run_options

該当PR : https://github.com/treasure-data/digdag/pull/1025

PR の方から引用すると、以下のように設定できるみたいです。

_export:
  docker:
    image: ruby:2.5.1
    build:
      - apt install vim
    docker: /usr/local/bin/nvidia-docker
    run_options: ["-v", "/tmp:/tmp"]
    build_options: ["--pull"]

ここの run_options: ["-v", "/tmp:/tmp"] ですが、 run_options: ["-v /tmp:/tmp"] みたいにできないものか と思って試したら

docker: Error response from daemon: create  /: " /" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.

ってエラーが出るので出来なかったよ って話です (build_options でも同様ですね.)

digdag の DEBUGログを見てみる

digdag run -l debug で デバッグログを出力することができます。

  • run_options: ["-v", "/tmp:/tmp"] のときに実行されるコマンド
2019-08-30 19:19:07 +0900 [DEBUG] (0017@[0:default]+sample_wf+sample_docker_run_options) io.digdag.standards.command.DockerCommandExecutor: Running in docker: docker run -v /tmp:/tmp -i --rm -v ..略
  • run_options: ["-v /tmp:/tmp"] のときに実行されるコマンド
2019-08-30 19:20:22 +0900 [DEBUG] (0017@[0:default]+sample_wf+sample_docker_run_options) io.digdag.standards.command.DockerCommandExecutor: Running in docker: docker run -v /tmp:/tmp -i --rm -v ..略

DEBUGログに表示される dockerコマンドは全く一緒で、 どちらもコマンド的には問題なさそう。

コマンドだけをコピって ローカルのターミナルで実行すると実行できます。

上記の docker: Error response from daemon みたいなエラーは出ません。

ではなぜ出来ないか

run_optionsこの部分command と宣言された ImmutableListaddAll されています。

この変数 command は最終的に ProcessBuilder docker = new ProcessBuilder(command.build()); として ProcessBuilder に渡されます。

ProcessBuilder はプロセスの実行前にコマンドを一つにつなげる訳でもなく、command.toArray(new String[command.size()]); とするので、run_options: ["-v /tmp:/tmp"] と定義してしまうと、それが一つのコマンドとして入力されてしまうんですねぇ..?

つまり、イメージ的には

  • run_options: ["-v", "/tmp:/tmp"] のときに実行されるコマンド
"docker" "run" "-v" "/tmp:/tmp" "nannka-image:0.1"
  • run_options: ["-v /tmp:/tmp"] のときに実行されるコマンド
"docker" "run" "-v /tmp:/tmp" "nannka-image:0.1"

※ 上記を実行すると docker: Error response from daemon が発生します.

まとめ

DEBUG ログでは、

logger.debug("Running in docker: {} {}", command.build().stream().collect(Collectors.joining(" ")), imageName);

とされてたので、run_options: ["-v /tmp:/tmp"] でも問題ないように見えたんですが、実際には ProcessBuilder による実行なので、問題あるんだよって話でした。

「そらそうよ。だから配列なんやで。」 って感じですかね。

何か間違っている点等がありましたら、ご指摘いただけると幸いです。

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

digdag の docker.run_options 少しだけ試した

digdag の docker.run_options

digdagのバージョン 0.9.37 から docker に関する オプションが使えるようになったようです。

リリースノート : https://docs.digdag.io/releases/release-0.9.37.html?highlight=run_options

該当PR : https://github.com/treasure-data/digdag/pull/1025

PR の方から引用すると、以下のように設定できるみたいです。

_export:
  docker:
    image: ruby:2.5.1
    build:
      - apt install vim
    docker: /usr/local/bin/nvidia-docker
    run_options: ["-v", "/tmp:/tmp"]
    build_options: ["--pull"]

ここの run_options: ["-v", "/tmp:/tmp"] ですが、 run_options: ["-v /tmp:/tmp"] みたいにできないものか と思って試したら

docker: Error response from daemon: create  /: " /" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.

ってエラーが出るので出来なかったよ って話 (build_options でも同様ですね.)

digdag の DEBUGログを見てみる

digdag run -l debug で デバッグログを出力することができます。

  • run_options: ["-v", "/tmp:/tmp"] のときに実行されるコマンド
2019-08-30 19:19:07 +0900 [DEBUG] (0017@[0:default]+sample_wf+sample_docker_run_options) io.digdag.standards.command.DockerCommandExecutor: Running in docker: docker run -v /tmp:/tmp -i --rm -v ..略
  • run_options: ["-v /tmp:/tmp"] のときに実行されるコマンド
2019-08-30 19:20:22 +0900 [DEBUG] (0017@[0:default]+sample_wf+sample_docker_run_options) io.digdag.standards.command.DockerCommandExecutor: Running in docker: docker run -v /tmp:/tmp -i --rm -v ..略

DEBUGログに表示される dockerコマンドは全く一緒で、 どちらもコマンド的には問題なさそう。

コマンドだけをコピって ローカルのターミナルで実行すると実行できます。

上記の docker: Error response from daemon みたいなエラーは出ません。

ではなぜ出来ないか

run_optionsこの部分command と宣言された ImmutableListaddAll されています。

この変数 command は最終的に ProcessBuilder docker = new ProcessBuilder(command.build()); として ProcessBuilder に渡されます。

ProcessBuilder はプロセスの実行前にコマンドを一つにつなげる訳でもなく、command.toArray(new String[command.size()]); とするので、run_options: ["-v /tmp:/tmp"] と定義してしまうと、それが一つのコマンドとして入力されてしまうんですねぇ..?

つまり、イメージ的には

  • run_options: ["-v", "/tmp:/tmp"] のときに実行されるコマンド
"docker" "run" "-v" "/tmp:/tmp" "nannka-image:0.1"
  • run_options: ["-v /tmp:/tmp"] のときに実行されるコマンド
"docker" "run" "-v /tmp:/tmp" "nannka-image:0.1"

※ 上記を実行すると docker: Error response from daemon が発生します.

まとめ

DEBUG ログでは、

logger.debug("Running in docker: {} {}", command.build().stream().collect(Collectors.joining(" ")), imageName);

とされてたので、run_options: ["-v /tmp:/tmp"] でも問題ないように見えたんですが、実際には ProcessBuilder による実行なので、問題あるんだよって話でした。

「そらそうよ。だから配列なんやで。」 って感じですかね。

何か間違っている点等がありましたら、ご指摘いただけると幸いです。

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

Laravel開発環境構築

はじめに

前回記事で、Laravel開発環境を仮想環境(VirtualBox)上に作成することはできた。
今回は仮想環境上で動作するDockerコンテナでLaravelのビルドインWebサーバーを実行します。ホストOS、ゲストOS、Dockerコンテナ間のディレクトリマッピングを整備することで、ホストOS上で変更したソースの内容をリアルタイムでDockerコンテナへ反映させ、動作を確認できるような開発環境を整備します。

目的

docker-compose.yml および Dockerfile の記述方や配置方法などを学ぶことを目的としています。

最終目標は、Vagrantfileやdocker-compose.yml、Dockerfile、各種設定ファイルを配布することで、誰でも同じ開発環境を構築できることです。
実際の開発環境整備を考える場合、DBやWebサーバーもコンテナ化してLaravelコンテナと連携させる必要がありますが、今回は割愛します。

システム構成

system.png
※相変わらず配色センスのかけらも無いですね。。。

ディレクトリ構成

directory.png

Vagrant、VirtualBoxのインストール

作業を始める前に

こちらの記事を元に、phpのインストールをして、カスタマイズしたphp.iniと、/var/www/blogディレクトリ(配下の全てのファイルを含む)を取り出しておいてください。
Dockerfileを使ってカスタマイズしたDockerイメージを作成する際に必要になります。

取り出すファイル、ディレクトリ

  • php.ini
  • blogディレクトリ(/var/log/blog)

仮想環境(BargeLinux)の作成

コマンドプロンプトを起動し、d:ドライブ直下にlara_projectフォルダを作成し、そこへ移動します。

> d:
> mkdir lara_project
> cd lara_project

今回のDockerホストOSはDocker向けの軽量OS、BargeLinuxを使用します。
BargeLinuxのイメージをダウンロードします。

> vagrant box add ailispaw/barge

BargeLinux起動用のVagrantfileの雛形を作成します。

> vagrant init ailispaw/barge

作成したVagrantfileの雛形をカスタマイズします。
D:\lara_project フォルダに Vagrantfileファイルが出来ているので、テキストエディタで開いて、以下の編集を行います。

Vagrantfile
# コメントアウト解除
- 31| # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
+ 31| config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
# ディレクトリマウント設定を追記
+ 47|   config.vm.synced_folder "source", "/vagrant/source"
+ 48|   config.vm.synced_folder "env", "/vagrant/env"
+ 49|   config.vm.synced_folder "log", "/vagrant/log"

31行目の編集は、後ほどDockerコンテナ上で起動されたLaravelのビルドインWebサーバーへ接続する為に必要になります。

マウントするディレクトリを作成します。

> mkdir env, log, env/app

ここで作成した env/app ディレクトリに、作業を始める前にで取り出した php.ini を配置します。
また、作業を始める前にで取り出したblogフォルダをリネームして、D://lara_project/sourceフォルダとして配置してください。

仮想環境を起動します。

> vagrant up

カレントフォルダのvagrantfileを参照して、そこに記載してある仮想環境を構築、起動します。

仮想環境(BargeLinux)が起動しているので、仮想環境にSSHで接続しましょう。

> vagrant ssh

ゲストOS(BargeLinux)の設定

Docker 最新化

既定のDockerバージョンは 1.10.xとかなので、Dockerを更新します。
開発環境なので、比較的最近のバージョンである 18.06.3 に更新します。

$ sudo /etc/init.d/docker restart v18.06.3-ce
$ docker --version
Docker version 18.06.3-ce, build d7080c1

Docker Compose のインストール

Docker Composeを利用すると、複数のDockerコンテナの管理が楽にできます。
今回は前述の通り、DBやWebはインストールしませんが、環境構築の自動化を目的に導入します。

こういうツールをオーケストレーションツールと言いますが、今はKubernetesが主流なのかな。。。ただ、今回はDocker Composeを使います。

Docker Compose をダウンロードします。

$ wget -L --no-verbose https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m`

uname -sはカーネル名が返ってきます。今回で言えば「Linux」です。
uname -mはマシンタイプが返ってきます。今回で言えば「x86_64」です。

ダウンロードしたファイルに実行権限を付与します。

$ chmod +x docker-compose-`uname -s`-`uname -m`

/opt/bin配下に移動し、コマンドにします。
※通常は /usr/local/bin 配下なのですが、BargeLinuxに左記ディレクトリは存在していない為、Dockerコマンドと同じ、パスの通った /opt/bin に配置します。

$ sudo mv docker-compose-`uname -s`-`uname -m` /opt/bin/docker-compose

念のため、安易にユーザーに実行させないように、所有者をrootに変更します。

$ sudo chown root:root /opt/bin/docker-compose

docker-compose.yml の作成

Docker Compose の設定ファイル、docker-compose.yml を新規作成します。

$ touch /vagrant/env/docker-compose.yml

作成したdocker-compose.ymlを編集していきます。
詳細はこちらの記事を参照してください。

$ vi /vagrant/env/docker-compose.yml
docker-compose.yml
version: '3.5'  // docker-compose.yml の記述フォーマットバージョンです

services:

  app: // このレベルがコンテナだと思ってください。名前は何でもOKです。
    container_name: laravel     // コンテナ名
    build: ./docker-practice    // このコンテナイメージを作成するDockerfileの配置ディレクトリ
    image: laravel_custom       // このコンテナイメージの名前です
    ports:                      // ポートマッピングです。
      - 80:8000
    volumes:                    // ディレクトリのマッピングです。
      - /vagrant/source:/var/www/lara_project  // Laravel本体
      - /vagrant/log:/var/log/lara_project     // ログ

Dockerfileの作成

Dockerのコンテナイメージは、公開されているイメージをそのまま使うだけではなく、アプリケーションや各種設定などのカスタマイズを行ったイメージを作成することが出来ます。
その際Dockerfileに、ベースとなるイメージ、追加するアプリケーションのインストール手順や、各種設定ファイルのコピー手順などを記載し、docker buildコマンドでこのDockerfileを呼び出すことで、カスタマイズしたDockerイメージを作成できます。

Docker-Composeでも、build句にDockerfileの配置ディレクトリを指定することでカスタムイメージをビルドすることが出来ます。

$ touch /vagrant/env/app/Dockerfile
$ vi /vagrant/env/app/Dockerfile
Dockerfile
// ベースイメージはCentOSです。
FROM centos:latest

// ここからPHPのインストールを行います。まずは、EPELリポジトリの追加を行います。
RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

// Remiリポジトリを追加します。PHP 7.x系はこのリポジトリからインストールします。
RUN yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm

// yum-config-managerを利用する為、yum-utilsをインストールします。
RUN yum -y install yum-utils

// Remiリポジトリを有効化します。
RUN yum-config-manager --enable remi-php72

// PHPと、関連ライブラリをインストールします。
RUN yum -y install php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-zip php-unzip

// 予め用意したphp.iniを/etc/php.iniに上書きします。
// Dockerfile内でテキスト編集などはできないので、設定ファイルは予め用意し、上書きします。
COPY php.ini /etc/php.ini

// PHPのライブラリ管理ツール composer のインストーラーをダウンロードし、インストールします。
RUN curl -sS https://getcomposer.org/installer | php

// composer の実行ファイル composer.phar を パスの通ったディレクトリ /usr/local/bin に配置し、composer にリネームします。
RUN mv composer.phar /usr/local/bin/composer

// Laravelのインストーラーをcomposerで取得します。
RUN composer global require "laravel/installer"

// カレントディレクトリを /var/www/ へ移動します。
WORKDIR /var/www

// /var/www 配下にlara_projectの名前で新規Laravelプロジェクトを作成します。
RUN composer create-project --prefer-dist laravel/laravel lara_project "5.6.*"

// プロジェクトディレクトリに移動します。
WORKDIR /var/www/lara_project

// CMD句で、デーモンを起動します。ここでは、PHPのビルドインWebサーバーを起動しています。

// 8000番ポートで待ち受け、ルートディレクトリをpublicとしています。
CMD ["php", "-S", "0.0.0.0:8000", "-t", "public"]

※RUN句で、sudo で実行していませんが、Dockerコンテナ内は基本rootで実行される為、sudo の必要はありません。

Dockerイメージのビルド

CentOSのDockerイメージをベースに、PHPおよびcomposerのインストールを行ったDockerイメージを docker-compose buildコマンドで作成します。

$ sudo docker-compose -f /vagrant/env/docker-compose.yml build

新しいイメージ laravel_custom が出来ているか確認しましょう。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
laravel_custom      latest              6146ebf2ca14        39 seconds ago      795MB
centos              latest              67fa590cfc1c        9 days ago          202MB

では、Docker Composeから新しいイメージでコンテナを起動しましょう。

$ sudo docker-compose -f /vagrant/env/docker-compose.yml up -d

コンテナが起動しているか確認します。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
5c08e5c3fa7c        laravel_custom      "php -S 0.0.0.0:8000…"   5 seconds ago       Up 3 seconds        0.0.0.0:80->8000/tcp   laravel

ホスト側からコンテナで起動しているビルドインWebサーバ(http://localhost:8080)へアクセスしてみましょう。
以下が表示されればOKです。
laravel_success_2.png

ホストOS側でソースコードを変更

では、ホストOS側でソースコードを修正し、反映されるか確認します。
D:\lara_project\source\resources\views\welcome.blade.php をエディタで開き、以下のように変更します。

welcome.blade.php
- 82|                    Laravel
+ 82|                    Laravel_Custom

ブラウザでF5を押して、再読み込みしてください。
laravel_success_3.png

これでホストOS上で VS Codeなどでソース編集して、即時修正確認が行えます。

はまったところ

ディレクトリのマウントタイミング

ディレクトリのマウントのところはかなり悩みました。
ディレクトリのマウントは、Dockerコンテナ実行時に行われる為、Build時に問題なくても実行時にエラーになる場合があります。

今回で言えば、最初はホストの d:\lara_project\source ディレクトリに何も格納しないで、docker-compose buildを行ったところ、何もエラーは出ずにイメージが出来ましたが、docker-compose run'でホスト側のsourceディレクトリが コンテナの/var/www/lara_project`にマウントされ、直前のLaravelのインストール操作で出来ていたはずのファイルが全て消えてしまい、エラーになっていました。
これになかなか気がつけず、かなり悩みました。

本文でも記載している通り、予めLaravelのファイル郡をホスト側に配備することで、対応しました。

リポジトリの一時接続エラー

docker-compose build実施時、Remiリポジトリに接続できないエラーが発生しました。
結局、少ししたら復旧したので事なきを得ましたが、同じような事象が発生した場合、待つしかない、というのは正直不安要素です。

参考

https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce
https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04

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

1台の物理マシンでPrometheusやらGrafanaやらを建てる(Docker使用)

「1台の物理マシンだけで、かつDockerコンテナを使用してPrometheusなどの監視環境を整える。」
みたいな記事が無かったのでメモ。

前書き

  • 全部Dockerコンテナで動かします
  • 1台の物理マシンだけで完結するように構成しています
    • 監視に際してこの構成を奨励するものではありません
  • 今回は各ソフトウェアを立ち上げるのがメインなのです
    • 「Prometheusとは」とか「監視とは」とか「正しいアラートとは」とかは書いてないのであしからず

今回のゴール

  1. 以下の図の通りに構成を完了する
  2. GrafanaのData SourcesにPrometheusを指定する

構成のイメージ図↓
prometheus_goal.png

軽く説明

  • ノートPCの図:あなたが操作するマシン
  • prom-network:Dockerで生成するネットワーク。ノートPC内に存在していると考えてください
  • :9090とか:ソフトウェアが使用するポート番号
  • 盾みたいなアイコン:アラートマネージャ(多分公式のものではない)

構築手順

Dockerイメージを取得する

$ docker pull prom/alertmanager
$ docker pull prom/node-exporter
$ docker pull prom/prometheus
$ docker pull grafana/grafana

今回はこの4つを建てます。

Dockerのネットワークを作成する

参考:https://knowledge.sakura.ad.jp/16082/

$ docker network create prom-network

これだけでおkです。prom-networkの部分は好きな名前をつけても問題ありません。
ネットワークが作成されたかどうかは以下のコマンドで確認できます。

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6bd30c077705        bridge              bridge              local
9bc0dad85516        host                host                local
7a2d5aa36f0b        none                null                local
1c7e57c599f6        prom-network        bridge              local  <- いま作ったやつ

Prometheus用の設定ファイルを用意する

/tmp/prometheus.yml
lobal:
  scrape_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
      - targets: ['alertmanager:9093']
rule_files:
  - rules.yml

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['node-exporter:9100']

tips

  • prometheus.ymldockerコマンドを使うユーザが編集できる場所に配置してください
    • (docker run時に、権限の問題でエラーになる可能性があるため)
  • targets:で定義されているalertmanagernode-exporterの部分を変更した場合、以降の操作では適宜読みかえて下さい

各コンテナを起動する

Prometheusの起動

$ docker run --rm -d -p 9090:9090 --net prom-network -v /tmp/prometheus.yml:/prometheus/prometheus.yml --name prometheus prom/prometheus --config.file=/prometheus/prometheus.yml

ちょっと複雑なので部分的に解説。

  • --net prom-network:コンテナを指定したネットワークに参加させます
  • -v /tmp/prometheus.yml:/prometheus/prometheus.yml:さっき作ったprometheus.ymlをPrometheusのコンテナにマウントします
  • --name prometheus:コンテナにprometheusという名前をつけます(重要)
  • --config.file=/prometheus/prometheus.yml:コンテナにマウントされた設定ファイルを使用してPrometheusを起動します

Node Exporterの起動

$ docker run --rm -d -p 9100:9100 --net prom-network --name node-exporter prom/node-exporter

AlertManagerの起動

$ docker run --rm -d -p 9093:9093 --net prom-network --name alertmanager prom/alertmanager

Grafanaの起動

$ docker run --rm -d -p 3000:3000 --net prom-network --name grafana grafana/grafana

GrafanaのData Sourcesを設定する

とりあえずwebブラウザでlocalhost:3000でGrafanaにアクセスしましょう。
admin/adminでログインできます。
grafana_login.png

ログインしたら左側の歯車アイコンからAdd data sourceでデータソース追加画面に移ります。
ここでHTTPセクションのURLを以下のように入力し、ページの一番下にある「Save & Test」を押下します。
緑のポップアップ通知が出ればPrometheusからデータを正しく受信する設定が整っています。
grafana_datasource.png

tips

  • ここでURLをhttp://prometheus:9090と指定したのは、PrometheusのDockerコンテナ名がprometheusだからです
    • docker run時に別のコンテナ名にした場合はココを変更する必要があります

Prometheusでnodeメトリクスを確認するところまでは書きません。

補足

Dockerのネットワーク詳細は以下のコマンドで確認できます。

$ docker network inspect prom-network

各コンテナをネットワークに参加させた状態で実行すると以下のような結果が得られるはずです。

[
    {
        "Name": "prom-network",
...中略
        "Containers": {
            "5786ef7a1c41bd01bd5528d01634105e5c7c6580b33a18711834bce449d1f91c": {
                "Name": "grafana",
                "EndpointID": "826a0ae110b09f1b1cc5ea3e55bfcfea54d32e75deb19f170b9e3c78571364e2",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "754eaf3ff20da12a4937edeba5c914464423102d78441679130afd15c540e767": {
                "Name": "prometheus",
                "EndpointID": "6d77c55693db68989e87f1ed72561a26576130a32ae3be49463d1bafce0f2fe8",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "fc035a73e5a01352f82e9d698662b1058d6b1b0ea9ca4cd8b38a21ca31115e3e": {
                "Name": "node-exporter",
                "EndpointID": "cb989db9d71a435aaf920be0c2f17f4015d2b30a24639d46c955b865e6eececc",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "fc5f4fadc352e6039f165c7bd141cb4787e2236d200c4259edb87b75b065143b": {
                "Name": "alertmanager",
                "EndpointID": "82578bf4a51996640ef61404eab6944eb637b28f9adbaae4ffe798eb7ce62849",
                "MacAddress": "02:42:ac:12:00:05",
                "IPv4Address": "172.18.0.5/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

ユーザ定義のDockerネットワーク(bridge)において、各コンテナは"Name"で指定されている値をDNSとして使用することで通信を行うことができる、というわけです。

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

マウスカーソルを目で追うGopherくんのサイトをDockerで開発してGitHub Pagesで公開した

完成品

gopher.gif
https://cajonito.github.io/gopher/
大変可愛らしい。

ソースコードはGitHubで公開されています。
https://github.com/cajonito/gopher

この記事

フロントの練習のために上記サイトを作成する過程を紹介します。
Webフロントエンドのプログラミングの練習のために作りましたが記事の内容は環境構築の話がメインです。
登場するものは以下の通りです。

  • GitHub Pagesでサイトを公開
  • Dockerで開発環境を構築
  • クリエイティブ・コモンズ・ライセンス
  • HTML + CSS + Javascript + jQuery でGopherくんを作成

動機と構想

HTMLとCSSの練習がしたい。何かサイトを作ろう。
Gopherくんがマウスカーソルを目で追いかける様を見たいから作ってみよう。

どこかで公開したいけどお金はかけたくない。
出来るだけストレス無く開発したい。
絵描けないけどGopherくんの画像をどうやって用意しよう?

GitHub Pagesで公開

静的なサイトなら無料で公開できる環境は多くありますが、個人的にはGitHub Pagesが一番楽だと思います。

https://pages.github.com/

Hosted directly from your GitHub repository. Just edit, push, and your changes are live.

ということで、GitHubのリポジトリを作っただけでページが公開されて、pushするだけでデプロイされます。すごく楽です。
一応細かい制限はあるみたいです。
https://help.github.com/ja/articles/what-is-github-pages

無料プランの場合、GitHub Pagesはパブリックリポジトリのみで利用出来るようです。

Hello Wolrd

今回は任意のリポジトリ名でdocsディレクトリ以下を公開するという設定にします。
(他の公開形式もありますが今回は割愛します。)

今回はgopherというパブリックリポジトリを作成しました。

$ git clone https://github.com/(ユーザー名)/(リポジトリ名).git
$ cd (リポジトリ名)
$ mkdir docs
$ echo 'hello world' > docs/index.html

ツリー構造はこんな感じ

$ tree
.
├── README.md
└── docs
    └── index.html

1 directory, 2 files

作成したファイルをmasterブランチにpushしておきます。

次にGitHubのリポジトリの設定からmasterブランチのdocsディレクトリ以下を公開するよう設定します。
docsディレクトリが存在しないとこの選択肢は選べないので注意です。

スクリーンショット 2019-08-30 13.28.27.png

これで以下のURLにアクセスするとdocs以下に配置したindex.htmlが表示されるはずです。
https://(ユーザー名).github.io/(リポジトリ名)/

スクリーンショット 2019-08-30 13.57.41.png
あとはdocs/以下を編集してmasterブランチにpushするだけで上記ページは更新されていきます。

Dockerで開発環境を構築

何か編集するたびにpushして確認するのも大変なのでローカルで開発環境を作ります。
Dockerを使うとさくっとサーバーを建てて、必要なくなったらさくっと消せるので便利です。

DockerとDockerComposeをインストール

公式サイトより入手してください。
https://www.docker.com/

設定ファイルを作成

今回はNginxコンテナをローカルで建てて利用します。
docker-compose.ymlとnginx.confを以下の位置に作成します。

$ tree
.
├── README.md
├── docker-compose.yml
├── docs
│   └── index.html
└── nginx.conf

1 directory, 4 files

まずnginx.confを作ります。
僕は詳しくないのですが、ローカルで自分で使うだけなので最低限必要そうなものを設定します。

nginx.conf
server {
    listen 80;
    server_name _;

    root /var/www/html;
    index index.html;

    charset utf-8;
}

次にdocker-compose.ymlを作成します。
DockerComposeは本来複数のコンテナを管理するためのものだった気がしますが、使うコンテナが1つでも簡単に構築、削除が出来るので今回みたいにサーバーを建てる用途の時はよく利用します。

docker-compose.yml
version: '3'

services:
  nginx:
    image: nginx:latest
    ports:
      - 8080:80
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - ./docs:/var/www/html
  • image
    • nginxコンテナの最新バージョンを使います。
    • バージョンを指定することもできます。
  • ports
    • ホストのポート8080をコンテナの80に関連付けます。
    • ホストで使いたいポートとnginx.confで指定したポートに応じて変更してください。
  • volumes:
    • ホストのnginx.confをコンテナ内の所定の位置にマウントします
    • ホストのdocs/以下をnginx.confで指定したrootディレクトリにマウントします

ポイントはGitHubPagesで公開されるdocs/以下をNginxのルートディレクトリにマウントしていることです。
こうすることでローカルではNginxコンテナで表示を確認し、そのままGitHubにpushして公開する事が出来ます。

これらの設定ファイルも同じリポジトリでバージョン管理すれば楽ちんです。

Dockerコンテナを起動

docker-compose.ymlが配置されたディレクトリで以下のコマンドを実行して起動。

$ docker-compose up -d

以下にアクセスするとGitHub Pagesと同じ表示がされるはずです。
http://localhost:8080

終了する時は同じくdocker-compose.ymlが配置されたディレクトリで以下のコマンドです。

$ docker-compose down

あとはdocs/以下を編集して、上記URLを開いて確認を繰り返して開発していきます。
公開したくなったらmasterブランチにpushしましょう。

マウスカーソルを目で追うGopherくんを作る

お待ちかねです。
画面に大きくGopherくんを表示して、マウスカーソルを目で追いかける感じにしたいです。

画像の用意

https://github.com/golang-samples/gopher-vector
こちらにCC BY 3.0ライセンスで公開されたGopherくんの画像がありました。

クリエイティブ・コモンズ・ライセンスは以下のサイトが非常にわかりやすかったです。
https://creativecommons.jp/licenses/

クリエイティブ・コモンズは、クリエイティブ・コモンズ・ライセンス(CCライセンス)を提供している国際的非営利組織とそのプロジェクトの総称です。
CCライセンスとはインターネット時代のための新しい著作権ルールで、作品を公開する作者が「この条件を守れば私の作品を自由に使って構いません。」という意思表示をするためのツールです。

「CC BY」は

原作者のクレジット(氏名、作品タイトルなど)を表示することを主な条件とし、改変はもちろん、営利目的での二次利用も許可される最も自由度の高いCCライセンス。

とのことなので、サイト上にクレジットを表示して利用させて頂く事にしました。
目を動かすために改変をしますがそれもOKのようです。

画像の加工

元の画像のSVGをテキストファイルで編集して目とそれ以外で2ファイル用意しました。
要素を削除したりサイズをいじるだけなのでフィーリングでなんとかなりました。

ページの作成

最終的な構成は以下のようになりました。

$ tree
.
├── README.md
├── docker-compose.yml
├── docs
│   ├── css
│   │   └── style.css
│   ├── image
│   │   ├── gopher.svg
│   │   └── gopher_eye.svg
│   ├── index.html
│   └── javascript
│       └── main.js
└── nginx.conf

4 directories, 8 files

ソースコードは悪戦苦闘した結果以下のようになりました。
色々セオリーを外してるかもしれませんがとりあえず動きました。
マウスカーソルのx, y座標を入力したら目の位置を計算するコードを書いてjQueryで制御するのが簡単かなと思いました。

index.html
index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="./css/style.css" />
    <title>Gopher Eye Tracking</title>
  </head>

  <body>
    <div id="page">
      <header>
        <div id="header_inner">
          <p>
            Gopherくんは <a href="http://reneefrench.blogspot.com/" target="_blank">Renee French</a> さんがデザインしました。
          </p>
          <p>
            画像は <a href="https://twitter.com/tenntenn" target="_blank">Takuya Ueda</a> さんが作成したものを元に加工したものです。
          </p>
        </div>
      </header>
      <main>
        <div id="gopher_image">
          <div id="gopher">
            <img src="./image/gopher.svg" alt="gohperくん" />
            <div id="gopher_right_eye">
              <img src="./image/gopher_eye.svg" alt="gohperくんの右目" />
            </div>
            <div id="gopher_left_eye">
              <img src="./image/gopher_eye.svg" alt="gohperくんの左目" />
            </div>
          </div>
        </div>
      </main>
      <footer></footer>
    </div>
    <script
      src="https://code.jquery.com/jquery-3.4.1.slim.min.js"
      integrity="sha256-pasqAKBDmFT4eHoN2ndd6lN370kFiGUFyTiUHWhU7k8="
      crossorigin="anonymous"
    ></script>
    <script src="./javascript/main.js"></script>
    <script>
      var gopher = new Gopher(
        "#gopher",
        "#gopher_right_eye",
        "#gopher_left_eye"
      );

      $(window).on("load mousemove", function(e) {
        var cX = e.clientX;
        var cY = e.clientY;

        if (!cX) {
          cX = $(window).width() / 2;
          cY = $(window).height() / 2;
        }

        gopher.update(cX, cY).render();
      });
    </script>
  </body>
</html>

css/style.css
style.css
html,
body,
div,
span,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
a,
img,
ul,
li,
table,
tr,
th,
td,
tbody,
footer,
header,
main,
nav,
section,
article {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: normal;
  list-style: none;
  text-decoration: none;
}

body {
  font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ",
    Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif;
  width: 100%;
}

#header_inner {
    padding: 10px;
    font-size: 10px;
    position: fixed;
    top: 0%;
    right: 0%;
    z-index: 100;
}

#gopher_image {
  overflow: hidden;
  position: fixed;
  bottom: 0%;
  width: 100%;
  height: 70%;
}

#gopher {
  position: absolute;   
  left: 50%;
  transform: translateX(-50%);
  width: 1000px;
  z-index: 1;
}

#gopher_right_eye {
  position: absolute;
  text-align: center;
    left: calc(50% - 17%);
    top: 120px;
    width: 120px;
    z-index: 2;
}

#gopher_left_eye {
  position: absolute;
  text-align: center;
    left: calc(50% + 14%);
    top: 120px;
    width: 120px;
    z-index: 2;
}

img {
  width: 100%;
}

javascript/main.js
main.js
class Gopher {
  constructor(gopherSel, rightPupilSel, leftPupilSel) {
    this._dom = $(gopherSel);
    var width = this._dom.width();
    var height = this._dom.height();
    this.x = width / 2;
    this.y = height / 2;

    var range = width * 0.07;

    this.rightEye = new Eye(
      rightPupilSel,
      this.x - width * 0.17,
      this.y - height * 0.33,
      range
    );

    this.leftEye = new Eye(
      leftPupilSel,
      this.x + width * 0.14,
      this.y - height * 0.34,
      range
    );
  }

  update(x, y) {

    var offset = this._dom.offset();
    var baseX = offset.left;
    var baseY = offset.top;

    this.rightEye.update(x - baseX, y - baseY);
    this.leftEye.update(x - baseX, y - baseY);

    return this;
  }

  render() {
    this.rightEye.render();
    this.leftEye.render();

    return this;
  }
}

class Eye {
  constructor(selector, x, y, range) {
    this._pupil = new Pupil(selector, x, y);
    this.x = x;
    this.y = y;
    this.range = range;
  }

  get pupil() {
    return this._pupil;
  }

  update(x, y) {
    const distanceRatio = 0.3;

    var distanceX = x - this.x;
    var distanceY = y - this.y;
    var distance = Math.min(
      Math.sqrt(distanceX ** 2 + distanceY ** 2) * distanceRatio,
      this.range
    );

    var rad = Math.atan2(distanceY, distanceX);

    var newX = this.x + Math.cos(rad) * distance;
    var newY = this.y + Math.sin(rad) * distance;

    this.pupil.update(newX, newY);
    return this;
  }

  render() {
    this.pupil.render();

    return this;
  }
}

class Pupil {
  constructor(selection, x, y) {
    this._dom = $(selection);
    this.update(x, y);
  }

  update(x, y) {
    this.x = x - this._dom.width() / 2;
    this.y = y - this._dom.height() / 2;

    return this;
  }

  render() {
    this._dom.css({
      top: this.y + "px",
      left: this.x + "px"
    });

    return this;
  }
}

感想

フロントエンドの練習をして公開するならDockerとGitHubPagesは手軽で強力だと思いました。
やっぱり手を動かすと得られるものは多いと思うので、手を気持ちよく動かせる環境は大事です。

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

Docker を CentOS 7.6 (1810) にインストールして簡単に WordPress を起動する

最近Dockerを使うようになってきたので、DockerコンテナでサクッとWordPressを立ち上げる方法を試してみました。
今回はDocker-CE(無料のコミュニティエディション)を使用してWordPressをインストールする方法を紹介します。

ホストOSバージョンとカーネルバージョン

今回したホストOSはCentOS 7.6 (1810)となります。

[root@cent76 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

Dockerに必要なパッケージをインストール

必須パッケージを先にインストールします。

[root@cent76 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
* base: ftp-srv2.kddilabs.jp
* extras: ftp-srv2.kddilabs.jp
* updates: ftp-srv2.kddilabs.jp

(省略)

===============================================================================================================
Package Arch Version Repository Size
===============================================================================================================
Updating:
 lvm2 x86_64 7:2.02.180-10.el7_6.8 updates 1.3 M
Updating for dependencies:
device-mapper x86_64 7:1.02.149-10.el7_6.8 updates 293 k
device-mapper-event x86_64 7:1.02.149-10.el7_6.8 updates 189 k
device-mapper-event-libs x86_64 7:1.02.149-10.el7_6.8 updates 188 k
device-mapper-libs x86_64 7:1.02.149-10.el7_6.8 updates 321 k
lvm2-libs x86_64 7:2.02.180-10.el7_6.8 updates 1.1 M

Transaction Summary
===============================================================================================================
Upgrade 1 Package (+5 Dependent packages)

(省略)

Complete!

安定版Dockerリポジトリを追加

Dockerをインストールするために、Dockerリポジトリを追加します。

[root@cent76 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror, langpacks
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo

Docker-CEインストール

Docker-CEとその他必要なパッケージをインストールします。

[root@cent76 ~]# yum install -y docker-ce docker-ce-cli containerd.io
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp-srv2.kddilabs.jp
* extras: ftp-srv2.kddilabs.jp
* updates: mirror.navercorp.com
(省略)
===============================================================================================================
Package Arch Version Repository Size
===============================================================================================================
Installing:
containerd.io x86_64 1.2.6-3.3.el7 docker-ce-stable 26 M
docker-ce x86_64 3:19.03.1-3.el7 docker-ce-stable 24 M
docker-ce-cli x86_64 1:19.03.1-3.el7 docker-ce-stable 39 M
Installing for dependencies:
audit-libs-python x86_64 2.8.4-4.el7 base 76 k
checkpolicy x86_64 2.5-8.el7 base 295 k
container-selinux noarch 2:2.107-1.el7_6 extras 39 k
libcgroup x86_64 0.41-20.el7 base 66 k
libsemanage-python x86_64 2.5-14.el7 base 113 k
policycoreutils-python x86_64 2.5-29.el7_6.1 updates 456 k
python-IPy noarch 0.75-6.el7 base 32 k
setools-libs x86_64 3.3.8-4.el7 base 620 k
Updating for dependencies:
policycoreutils x86_64 2.5-29.el7_6.1 updates 916 k

Transaction Summary
===============================================================================================================
Install 3 Packages (+8 Dependent packages)
Upgrade ( 1 Dependent package)

(省略)

Complete!

Dockerバージョン確認

今回インストールしたバージョンは「19.03.1」となります。

[root@cent76 ~]# docker version
Client: Docker Engine - Community
Version: 19.03.1
API version: 1.40
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:21:07 2019
OS/Arch: linux/amd64
Experimental: false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Docker 起動

systemctl コマンドでDockerを起動します。

[root@cent76 ~]# systemctl start docker

WordPress の docker image を取得

WordPress の Docker image を Docker Hub から取得します。

[root@cent76 ~]# docker pull wordpress
Using default tag: latest
latest: Pulling from library/wordpress
f5d23c7fed46: Pull complete
4f36b8588ea0: Pull complete
6f4f95ddefa8: Pull complete
187af28c9b1d: Pull complete
3c4135e0a3e9: Pull complete
764143bdfc93: Pull complete
3a141d427998: Pull complete
10a514d45c55: Pull complete
38caab815709: Pull complete
7be2532c1013: Pull complete
4af1c0fea247: Pull complete
88c32579f6b6: Pull complete
4435d7ad1fed: Pull complete
eb012b532a23: Pull complete
b45b6b08a0f1: Pull complete
57a069704459: Pull complete
c7266b68617f: Pull complete
637472e69ed3: Pull complete
748eaacd7f1d: Pull complete
0d7f34f2c87d: Pull complete
Digest: sha256:fdecb6fc92b04d88419544722ac1679158c12eb8f519b83b0480a6375e823dec
Status: Downloaded newer image for wordpress:latest
docker.io/library/wordpress:latest

WordPress に必要な MySQL の docker image を取得

今回はMySQL5.7をWordpress用のDBとし、こちらも Docker Hub から取得します。

[root@cent76 ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
0a4690c5d889: Pull complete
98aa2fc6cbeb: Pull complete
0777e6eb0e6f: Pull complete
2464189c041c: Pull complete
b45df9dc827d: Pull complete
b42b00086160: Pull complete
bb93567627c7: Pull complete
419b68a254a1: Pull complete
8c4bc5b87c07: Pull complete
59234e88c262: Pull complete
2406ac6e266f: Pull complete
Digest: sha256:540488d8f0e04c1077d17934d1c1511fe417e2221dff508ce4621f5efe6131db
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

取得済みイメージ一覧表示

取得したイメージを確認します。取得した wordpress と mysql が存在していればOKです。

[root@cent76 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress latest 02126202b6ea 32 hours ago 502MB
mysql 5.7 f6509bac4980 2 weeks ago 373MB

コンテナを生成して起動

取得したイメージを使用して、WordPressとMySQLのコンテナを生成・起動します。

[root@cent76 ~]# docker container run --name wp-mysql -e MYSQL_ROOT_PASSWORD=hoge -d mysql:5.7
a954a2f27251e30ca861583c722d277152e714708dfcfe2576c143f964d33037
[root@cent76 ~]# docker container run --name samplewp -d -p 80:80 --link wp-mysql:mysql wordpress
427c5e2ed465802d8ac709f834cdafb43baaa2d900b4b9f76d6b97354f0c6f04

実行中コンテナ一覧の確認

起動したコンテナ2つが実行状態であることを確認します。

[root@cent76 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
427c5e2ed465 wordpress "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:80->80/tcp samplewp
a954a2f27251 mysql:5.7 "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 3306/tcp, 33060/tcp wp-mysql

※ここで2つのコンテナが起動されていなかったら「docker logs samplewp」「docker logs wp-mysql」コマンドでdockerログを確認します。

WordPressに接続

ブラウザから「http://<ホストのIP>」でアクセスします。
wordpress01.png

必要な情報を入力し、「WordPress をインストール」ボタンを押下します。
wordpress02.png

最終的に以下の画面が表示されればWordPressインストール完了です。
wordpress03.png

これでWordPressを色々操作できるようになります。
wordpress04.png

WordPressコンテナ内で作業する

WordPressのコンテナに接続します。ソースの修正等はこれで行います。

[root@cent76 ~]# docker container exec -it samplewp /bin/bash
root@427c5e2ed465:/var/www/html# ls -l
total 200
-rw-r--r--. 1 www-data www-data 420 Nov 30 2017 index.php
-rw-r--r--. 1 www-data www-data 19935 Jan 1 2019 license.txt
-rw-r--r--. 1 www-data www-data 7447 Apr 8 22:59 readme.html
-rw-r--r--. 1 www-data www-data 6919 Jan 12 2019 wp-activate.php
drwxr-xr-x. 9 www-data www-data 4096 Jun 18 17:50 wp-admin
-rw-r--r--. 1 www-data www-data 369 Nov 30 2017 wp-blog-header.php
-rw-r--r--. 1 www-data www-data 2283 Jan 21 2019 wp-comments-post.php
-rw-r--r--. 1 www-data www-data 2808 Aug 7 06:55 wp-config-sample.php
-rw-r--r--. 1 www-data www-data 3172 Aug 7 06:55 wp-config.php
drwxr-xr-x. 6 www-data www-data 84 Aug 7 07:17 wp-content
-rw-r--r--. 1 www-data www-data 3847 Jan 9 2019 wp-cron.php
drwxr-xr-x. 20 www-data www-data 8192 Jun 18 17:50 wp-includes
-rw-r--r--. 1 www-data www-data 2502 Jan 16 2019 wp-links-opml.php
-rw-r--r--. 1 www-data www-data 3306 Nov 30 2017 wp-load.php
-rw-r--r--. 1 www-data www-data 39551 Jun 10 13:34 wp-login.php
-rw-r--r--. 1 www-data www-data 8403 Nov 30 2017 wp-mail.php
-rw-r--r--. 1 www-data www-data 18962 Mar 28 19:04 wp-settings.php
-rw-r--r--. 1 www-data www-data 31085 Jan 16 2019 wp-signup.php
-rw-r--r--. 1 www-data www-data 4764 Nov 30 2017 wp-trackback.php
-rw-r--r--. 1 www-data www-data 3068 Aug 17 2018 xmlrpc.php

WordPress用のMySQLに接続してみる

あまり中身を気にする必要はないかもしれませんが、もちろんコンテナ内のMySQLにも接続できます。

[root@cent76 ~]# docker container exec -it wp-mysql /bin/bash
root@a954a2f27251:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.7.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 5.7.27 |
+-----------+
1 row in set (0.00 sec)

Dockerコンテナの停止

コンテナ停止前に起動状態を確認します。

[root@cent76 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
427c5e2ed465 wordpress "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp samplewp
a954a2f27251 mysql:5.7 "docker-entrypoint.s…" About an hour ago Up About an hour 3306/tcp, 33060/tcp wp-mysql

コンテナが起動しているので停止します。

[root@cent76 ~]# docker container stop samplewp
samplewp
[root@cent76 ~]# docker container stop wp-mysql
wp-mysql
[root@cent76 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

実行中コンテナがなくなりました。

Dockerコンテナの起動

コンテナを起動します。

[root@cent76 ~]# docker container start wp-mysql
wp-mysql
[root@cent76 ~]# docker container start samplewp
samplewp
[root@cent76 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
427c5e2ed465 wordpress "docker-entrypoint.s…" About an hour ago Up 11 seconds 0.0.0.0:80->80/tcp samplewp
a954a2f27251 mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 20 seconds 3306/tcp, 33060/tcp wp-mysql

コンテナが起動しました。

さいごに

Docker を利用すれば、使い捨てのWordPressがサクッとできるので、私はソース変更やプラグインの検証等に使用しています。

※今回の記事は、自身のサイトから転載しています。
https://dekiruengineer.com/engineer/wordpress-for-docker/

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

Docker を CentOS 7.6 (1810) にインストールして簡単に WordPress を起動する

最近Dockerを使うようになってきたので、DockerコンテナでサクッとWordPressを立ち上げる方法を試してみました。
今回はDocker-CE(無料のコミュニティエディション)を使用してWordPressをインストールする方法を紹介します。

ホストOSバージョンとカーネルバージョン

今回したホストOSはCentOS 7.6 (1810)となります。

[root@cent76 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

Dockerに必要なパッケージをインストール

必須パッケージを先にインストールします。

[root@cent76 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
* base: ftp-srv2.kddilabs.jp
* extras: ftp-srv2.kddilabs.jp
* updates: ftp-srv2.kddilabs.jp

(省略)

===============================================================================================================
Package Arch Version Repository Size
===============================================================================================================
Updating:
 lvm2 x86_64 7:2.02.180-10.el7_6.8 updates 1.3 M
Updating for dependencies:
device-mapper x86_64 7:1.02.149-10.el7_6.8 updates 293 k
device-mapper-event x86_64 7:1.02.149-10.el7_6.8 updates 189 k
device-mapper-event-libs x86_64 7:1.02.149-10.el7_6.8 updates 188 k
device-mapper-libs x86_64 7:1.02.149-10.el7_6.8 updates 321 k
lvm2-libs x86_64 7:2.02.180-10.el7_6.8 updates 1.1 M

Transaction Summary
===============================================================================================================
Upgrade 1 Package (+5 Dependent packages)

(省略)

Complete!

安定版Dockerリポジトリを追加

Dockerをインストールするために、Dockerリポジトリを追加します。

[root@cent76 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror, langpacks
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo

Docker-CEインストール

Docker-CEとその他必要なパッケージをインストールします。

[root@cent76 ~]# yum install -y docker-ce docker-ce-cli containerd.io
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp-srv2.kddilabs.jp
* extras: ftp-srv2.kddilabs.jp
* updates: mirror.navercorp.com
(省略)
===============================================================================================================
Package Arch Version Repository Size
===============================================================================================================
Installing:
containerd.io x86_64 1.2.6-3.3.el7 docker-ce-stable 26 M
docker-ce x86_64 3:19.03.1-3.el7 docker-ce-stable 24 M
docker-ce-cli x86_64 1:19.03.1-3.el7 docker-ce-stable 39 M
Installing for dependencies:
audit-libs-python x86_64 2.8.4-4.el7 base 76 k
checkpolicy x86_64 2.5-8.el7 base 295 k
container-selinux noarch 2:2.107-1.el7_6 extras 39 k
libcgroup x86_64 0.41-20.el7 base 66 k
libsemanage-python x86_64 2.5-14.el7 base 113 k
policycoreutils-python x86_64 2.5-29.el7_6.1 updates 456 k
python-IPy noarch 0.75-6.el7 base 32 k
setools-libs x86_64 3.3.8-4.el7 base 620 k
Updating for dependencies:
policycoreutils x86_64 2.5-29.el7_6.1 updates 916 k

Transaction Summary
===============================================================================================================
Install 3 Packages (+8 Dependent packages)
Upgrade ( 1 Dependent package)

(省略)

Complete!

Dockerバージョン確認

今回インストールしたバージョンは「19.03.1」となります。

[root@cent76 ~]# docker version
Client: Docker Engine - Community
Version: 19.03.1
API version: 1.40
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:21:07 2019
OS/Arch: linux/amd64
Experimental: false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Docker 起動

systemctl コマンドでDockerを起動します。

[root@cent76 ~]# systemctl start docker

WordPress の docker image を取得

WordPress の Docker image を Docker Hub から取得します。

[root@cent76 ~]# docker pull wordpress
Using default tag: latest
latest: Pulling from library/wordpress
f5d23c7fed46: Pull complete
4f36b8588ea0: Pull complete
6f4f95ddefa8: Pull complete
187af28c9b1d: Pull complete
3c4135e0a3e9: Pull complete
764143bdfc93: Pull complete
3a141d427998: Pull complete
10a514d45c55: Pull complete
38caab815709: Pull complete
7be2532c1013: Pull complete
4af1c0fea247: Pull complete
88c32579f6b6: Pull complete
4435d7ad1fed: Pull complete
eb012b532a23: Pull complete
b45b6b08a0f1: Pull complete
57a069704459: Pull complete
c7266b68617f: Pull complete
637472e69ed3: Pull complete
748eaacd7f1d: Pull complete
0d7f34f2c87d: Pull complete
Digest: sha256:fdecb6fc92b04d88419544722ac1679158c12eb8f519b83b0480a6375e823dec
Status: Downloaded newer image for wordpress:latest
docker.io/library/wordpress:latest

WordPress に必要な MySQL の docker image を取得

今回はMySQL5.7をWordpress用のDBとし、こちらも Docker Hub から取得します。

[root@cent76 ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
0a4690c5d889: Pull complete
98aa2fc6cbeb: Pull complete
0777e6eb0e6f: Pull complete
2464189c041c: Pull complete
b45df9dc827d: Pull complete
b42b00086160: Pull complete
bb93567627c7: Pull complete
419b68a254a1: Pull complete
8c4bc5b87c07: Pull complete
59234e88c262: Pull complete
2406ac6e266f: Pull complete
Digest: sha256:540488d8f0e04c1077d17934d1c1511fe417e2221dff508ce4621f5efe6131db
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

取得済みイメージ一覧表示

取得したイメージを確認します。取得した wordpress と mysql が存在していればOKです。

[root@cent76 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress latest 02126202b6ea 32 hours ago 502MB
mysql 5.7 f6509bac4980 2 weeks ago 373MB

コンテナを生成して起動

取得したイメージを使用して、WordPressとMySQLのコンテナを生成・起動します。

[root@cent76 ~]# docker container run --name wp-mysql -e MYSQL_ROOT_PASSWORD=hoge -d mysql:5.7
a954a2f27251e30ca861583c722d277152e714708dfcfe2576c143f964d33037
[root@cent76 ~]# docker container run --name samplewp -d -p 80:80 --link wp-mysql:mysql wordpress
427c5e2ed465802d8ac709f834cdafb43baaa2d900b4b9f76d6b97354f0c6f04

実行中コンテナ一覧の確認

起動したコンテナ2つが実行状態であることを確認します。

[root@cent76 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
427c5e2ed465 wordpress "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:80->80/tcp samplewp
a954a2f27251 mysql:5.7 "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 3306/tcp, 33060/tcp wp-mysql

※ここで2つのコンテナが起動されていなかったら「docker logs samplewp」「docker logs wp-mysql」コマンドでdockerログを確認します。

WordPressに接続

ブラウザから「http://<ホストのIP>」でアクセスします。
必要な情報を入力し、「WordPress をインストール」ボタンを押下します。
これでWordPressを色々操作できるようになります。

WordPressコンテナ内で作業する

WordPressのコンテナに接続します。ソースの修正等はこれで行います。

[root@cent76 ~]# docker container exec -it samplewp /bin/bash
root@427c5e2ed465:/var/www/html# ls -l
total 200
-rw-r--r--. 1 www-data www-data 420 Nov 30 2017 index.php
-rw-r--r--. 1 www-data www-data 19935 Jan 1 2019 license.txt
-rw-r--r--. 1 www-data www-data 7447 Apr 8 22:59 readme.html
-rw-r--r--. 1 www-data www-data 6919 Jan 12 2019 wp-activate.php
drwxr-xr-x. 9 www-data www-data 4096 Jun 18 17:50 wp-admin
-rw-r--r--. 1 www-data www-data 369 Nov 30 2017 wp-blog-header.php
-rw-r--r--. 1 www-data www-data 2283 Jan 21 2019 wp-comments-post.php
-rw-r--r--. 1 www-data www-data 2808 Aug 7 06:55 wp-config-sample.php
-rw-r--r--. 1 www-data www-data 3172 Aug 7 06:55 wp-config.php
drwxr-xr-x. 6 www-data www-data 84 Aug 7 07:17 wp-content
-rw-r--r--. 1 www-data www-data 3847 Jan 9 2019 wp-cron.php
drwxr-xr-x. 20 www-data www-data 8192 Jun 18 17:50 wp-includes
-rw-r--r--. 1 www-data www-data 2502 Jan 16 2019 wp-links-opml.php
-rw-r--r--. 1 www-data www-data 3306 Nov 30 2017 wp-load.php
-rw-r--r--. 1 www-data www-data 39551 Jun 10 13:34 wp-login.php
-rw-r--r--. 1 www-data www-data 8403 Nov 30 2017 wp-mail.php
-rw-r--r--. 1 www-data www-data 18962 Mar 28 19:04 wp-settings.php
-rw-r--r--. 1 www-data www-data 31085 Jan 16 2019 wp-signup.php
-rw-r--r--. 1 www-data www-data 4764 Nov 30 2017 wp-trackback.php
-rw-r--r--. 1 www-data www-data 3068 Aug 17 2018 xmlrpc.php

WordPress用のMySQLに接続してみる

あまり中身を気にする必要はないかもしれませんが、もちろんコンテナ内のMySQLにも接続できます。

[root@cent76 ~]# docker container exec -it wp-mysql /bin/bash
root@a954a2f27251:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.7.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 5.7.27 |
+-----------+
1 row in set (0.00 sec)

Dockerコンテナの停止

コンテナ停止前に起動状態を確認します。

[root@cent76 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
427c5e2ed465 wordpress "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp samplewp
a954a2f27251 mysql:5.7 "docker-entrypoint.s…" About an hour ago Up About an hour 3306/tcp, 33060/tcp wp-mysql

コンテナが起動しているので停止します。

[root@cent76 ~]# docker container stop samplewp
samplewp
[root@cent76 ~]# docker container stop wp-mysql
wp-mysql
[root@cent76 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

実行中コンテナがなくなりました。

Dockerコンテナの起動

コンテナを起動します。

[root@cent76 ~]# docker container start wp-mysql
wp-mysql
[root@cent76 ~]# docker container start samplewp
samplewp
[root@cent76 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
427c5e2ed465 wordpress "docker-entrypoint.s…" About an hour ago Up 11 seconds 0.0.0.0:80->80/tcp samplewp
a954a2f27251 mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 20 seconds 3306/tcp, 33060/tcp wp-mysql

コンテナが起動しました。

さいごに

Docker を利用すれば、使い捨てのWordPressがサクッとできるので、私はソース変更やプラグインの検証等に使用しています。

※今回の記事は、自身のサイトから転載しています。
https://dekiruengineer.com/engineer/wordpress-for-docker/

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

Docker + Rails + React

Docker + Rails + React

streampack の minsu です。

今年の夏は主に室内で過ごしていましたが、先日帰省した折に中古のカメラを手に入れたので今後はアウトドアな趣味としてお散歩カメラをきめこみたいと考えています。 涼しくなったら、たぶん

目的

フロント: React
バック: Rails
を Docker を利用して構築します。

React + Rails ですが webpacker を利用する方法で行います。

ファイルの用意

まず、GemfileGemfile.lockDockerfiledcocker-compose.ymlを用意します。

Gemfile
source 'https://rubygems.org'
gem 'rails', '5.1.4'
Dockerfile
FROM ruby:2.4.1

RUN apt-get update -qq && apt-get install -y mysql-client build-essential nodejs apt-transport-https

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install -y yarn

RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
docker-compose.yml
version: '3'
services:
  app:
    build: . 
    command: /bin/sh -c "rm -f /app/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db

  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    environment:
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - mysql_vol:/var/lib/mysql

volumes:
  mysql_vol:

pid は、開発用WEBサーバを起動するときに tmp/pids/server.pidに書き込まれて終了するときに削除されるのですが、なんらかの要因で削除されずに終了した場合は起動中と判断されて新たにサーバを起動できないのでrm -f /app/tmp/pids/server.pidで起動時に削除します。

rails new

コンテナから rails プロジェクトを作成します。
Gemfileは上書き、DBはMySQLを指定します。

$ docker-compose run app rails new . --force --database=mysql

docker-compose.yml の mysql の rootパスワードを MYSQL_ROOT_PASSWORD=root に設定したので config/database.yml の development に設定を追加しました。
host も同じく指定した db に変更します。

config/database.yml
username: root
password: root
host: db

Gemfile に

gem 'webpacker'
gem 'react-rails'

を追加し、 bundle install しなおした後に

$ docker-compose build

次のコマンドを実行します。

$ docker-compose run app rails webpacker:install
$ docker-compose run app rails webpacker:install:react
$ docker-compose run app rails generate react:install

上の2行は rails new のタイミングで --webpack=reactのオプションを追加でも良かったみたいです。

package.json の更新や
app/javascript/packs/配下に application.jshello_react.jsx が作成されます。

db、 model 作成

適当な model と seeds データを用意して DB を作成後にデータを入れます。

$ docker-compose run app rails g model List title:string desc:string
db/seeds.rb
5.times do
  List.create(
    title: 'title_' + SecureRandom.hex(4),
    desc: 'desc_' + SecureRandom.hex(4)
  )
end
$ docker-compose run app rails db:create
$ docker-compose run app rails db:migrate

作成したモデルを一覧表示させてみます。

controller、view を作成

$ docker-compose run app rails g controller Lists index
lists_controller.rb
  def index
    @lists = List.all
  end

view では javascript_pack_tagreact_component のタグを用いて js を呼び出します。

lists/index.html.erb
<%= javascript_pack_tag 'application' %>

<h1>Lists#index</h1>
<%= react_component 'Lists', lists: @lists %>

react component 作成

順番が前後しましたが、 view で呼び出している components を実装します。

$ rails g react:component Lists

のコマンドで app/javascript/components/Lists.js が作成されるので編集します。

Lists.js
import React from "react"
import PropTypes from "prop-types"
export default class Lists extends React.Component {
  constructor(props){
    super(props)
    this.state = {
      lists: []
    };
  }
  componentDidMount(){
    this.setState({
      lists: this.props.lists
    })
  }
  render () {
    return (
      <div>
        <table>
          <thead>
            <tr>
              <th>ID</th>
              <th>Title</th>
              <th>Description</th>
              <th>created_at</th>
              <th>updated_at</th>
            </tr>
          </thead>
          <tbody>
            {this.state.lists.map((list) => {
              return (
                <tr key={list.id}>
                  <td>{list.id}</td>
                  <td>{list.title}</td>
                  <td>{list.desc}</td>
                  <td>{list.created_at}</td>
                  <td>{list.updated_at}</td>
                </tr>
              );
            })}
          </tbody>
        </table>
      </div>
    );
  }
}

動作確認

rails, webpack を立ち上げます。

$ docker-compose up -d
$ docker-compose run app bin/webpack-dev-server

http://localhost:3000/lists/index にアクセスします。
スクリーンショット 2019-08-30 15.19.12.png
無事に一覧が表示されました。

まとめ

起動と表示確認までを行いました。

この状態では何の機能もないので React での CRUD 操作を実装するまでを追記、または新しく記事にしたいと思います。

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

「The Twelve-Factor APP III.設定」をKubernetes上に置き換えて考えたときの話

はじめに

最近、とある事情で「The Twelve-Factor APP Ⅲ。設定(https://12factor.net/ja/config) 」を読みました。
そこで、今、自分が絶賛勉強中であるKubernetesでは、「Ⅲ.設定」の形にするにはどのようにすればよいのか、あるいは何を使えばいいのかを考えてみました。その過程で、Kubernetesの知識、The Twelve-Factor APPの解釈に必要な知識などを一から学習し、本稿では学んだことや参考文献などをまとめてみることにしました。
たらたらと長めの浅い文章を記述したので、結論から見ることをお勧めします。

本稿は、自身の学習過程で参考になったブログ、記事を集めて、補足的な説明を加えたものになっています。深い、小難しい内容ではございません。また個人的な見解が多く散見します。本来の見解とは異なる可能性がありますので、ご了承ください。

The Twelve-Factor APP Ⅲ.設定について

まず、The Twelve-Factor APPについての説明です。
「The Twelve-Factor APPのはじめに」の部分(https://12factor.net/ja/) を引用すると、

現代では、ソフトウェアは一般にサービスとして提供され、Webアプリケーション や Software as a Service と呼ばれる。Twelve-Factor Appは、次のようなSoftware as a Serviceを作り上げるための方法論である。
・ セットアップ自動化のために 宣言的な フォーマットを使い、プロジェクトに新しく加わった開発者が要する時間とコストを最小化する。
・下層のOSへの 依存関係を明確化 し、実行環境間での 移植性を最大化 する。
・モダンな クラウドプラットフォーム 上への デプロイ に適しており、サーバー管理やシステム管理を不要なものにする。
・開発環境と本番環境の 差異を最小限 にし、アジリティを最大化する 継続的デプロイ を可能にする。
・ツール、アーキテクチャ、開発プラクティスを大幅に変更することなく スケールアップ できる。

感想として、解釈がかなり難しかったです。コスト最小化、移植性とアジリティの最大化、クラウドプラットフォーム上へのデプロイ可能、高度な拡張性、これらを実現できるサービスとは何が必要なのか。そのような方法論をThe Twelve-Factor APPは示していると捉えています。
ここでは、詳細な解釈の説明は省きますが、ざっくりいうと、The Twelve-Factor APP(以下「12Factor」)とは、上記のSoftware as a Serviceを構築する方法として、少なくとも12個の要因が存在し、その要因の指針あるいは方針について書かれたものであると認識しています。

そこで、本題の「12Factor#Ⅲ.設定」についての説明です。
「Ⅲ.設定」では、 「設定を環境変数に格納する」と書かれています。ここでいう「設定」とは以下の通りです(引用:https://12factor.net/ja/config)

・データベース、Memcached、他のバックエンドサービスなどのリソースへのハンドル
・Amazon S3やTwitterなどの外部サービスの認証情報
・デプロイされたホストの正規化されたホスト名など、デプロイごとの値

上記3つに該当する設定情報などは環境変数に格納すべきと記述しています。
実際の開発では、「12Factor#設定」の設定とはどこを指すのか。その判断材料としては、デプロイの間(種々の実行環境ごと)で変わるかどうかであると考えています。設定の定義には、以下の記述を抜粋しました。

アプリケーションの 設定 は、デプロイ(ステージング、本番、開発環境など)の間で異なり得る唯一のものである。

アプリケーションは時に設定を定数としてコード内に格納する。これはTwelve-Factorに違反している。Twelve-Factorは 設定をコードから厳密に分離すること を要求する。設定はデプロイごとに大きく異なるが、コードはそうではない。
            ・・・略・・・
なお、この“設定”の定義には、アプリケーション内部の設定は 含まない ことに注意する。内部の設定とは、Railsにおけるconfig/routes.rbや、Springにおいてコードモジュールがどう接続されるかなどの設定を指す。この種の設定はデプロイの間で変わらないため、コードの内部で行うべきである。
            ・・・略・・・
Twelve-Factor Appは設定を 環境変数 に格納する。 環境変数は、コードを変更することなくデプロイごとに簡単に変更できる。

デプロイごとに変更されうる設定情報をコード内に入れると、デプロイが変化するたびにコードの変更を要求されます。これはコストの最小化、移植性の最大化に反していると考えられます。
コード内に設定情報を入れるのではなく、環境変数に設定情報を格納することにより、コードを変更することなくデプロイごとに簡単に設定の変更が可能であることを示しています。

また、設定ファイルを使用した観点と環境変数を使用した観点を対称的に取り上げて、尚も環境変数に格納すべきであると示しています。

設定ファイルとは異なり、誤ってリポジトリにチェックインされる可能性はほとんどない。

まとめると、環境変数はデプロイごとに簡単に変更可能で、リポジトリにチェックインされることのない要素を持っているから、設定情報を格納すべきであると解釈しました。

kubernetesとは

まず、kubernetesってなんだという話で最初に参考させていただいたのは以下の記事です。

今さら人に聞けない Kubernetes とは?
[https://qiita.com/MahoTakara/items/85096f8b2632c802ab22]

Kubernetesのできることやメリット、構成要素(アーキテクチャ)の話をまとめています。インフラ、Docker周りの知識がない私にとっては、正直、当初はむずしかったですが、用語の概念さえを抑えていけば(まだ完璧ではないが)、Kubenetesに対するイメージが浮かび上がってくると思います。

ちなみにDocker周りの知識は以下の参考資料を頼りに学びました。

Dockerの基礎をまとめてみた ~ 第一章:コンテナ?Dockerとは?
https://qiita.com/supaiku2452/items/8b06b774c0e2fce7df92

仮想化についての基本的な説明からDockerが動く仕組みについてまとめられています。仮想化、Dockerについての説明が入門者にとってはわかりやすかったです。Dockerが動く仕組みを理解するには、Linuxにおけるnamespaceとリソース管理(cgroups)の概念の知識が必要でした。

Docker/Kubernetes 実践コンテナ開発入門
https://gihyo.jp/book/2018/978-4-297-10033-9

個人的には、体系的に学びたかったので、「Docker/Kubernetes 実践コンテナ開発入門」を参考に写経しています。感想としてはかなりわかりやすいです。

Kubernetesと12Factor#Ⅲ.設定の関連性

以上で、Kubernetes と12Factorについて初歩的な知識を少し学びましたと。
では、Kubernetes において、12Factor#Ⅲ.設定はどのようにフィールドに該当するか考えていきます。

Kubernetes上においてのデプロイとは

上記「The Twelve-Factor APP Ⅲ.設定について」で、設定の定義について自分が解釈したことを記述しました。その上で、設定の定義については、デプロイの間で設定情報が変更されうるかどうかが肝になってくると考えています。ではKubernetesにおいて、デプロイの仕組みはどうなっているか,学習したころを簡単にまとめてみました。

Dockerではイメージとよばれる実行するアプリケーションの設定や構成をまとめたものを基に、コンテナを生成し、アプリケーションを実行するということでした。
Kubernetesでは基本的にPod(コンテナの集合体)やJobなどのリソースの集合体、クラスタを構築してアプリケーションのデプロイを行います。デプロイ構成には、アプリケーションの構成する部品のようなものが必要で、それがリソースにあたり、Kubernetesでは様々なリソースが存在します。

Kubernetesで実行されるアプリケーションは様々なリソースと協調して動作しています。

ここで、12Factor#Ⅲ.設定とKubernetes との対応関係について理解するには、リソースという概念あるいはその種類の知識が必要であることがわかりました。また、Kubernetesでは環境変数をどのように設定および利用しているのかについて注目し始めました。

リソースの種類については、以下を参照しました。

Kubernetes の各リソースに対するメモ
https://qiita.com/apstndb/items/e75c40975183b8aabba6

PodやNodeなどの知識には以下を参照しました。

Kubernetes チュートリアル
https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/explore/explore-intro/
k8s pod 概要について自習ノート
https://qiita.com/MahoTakara/items/f5130bb6e9e493c46c6b

環境変数の話

上記の背景から、Kubernetesで環境変数の扱いを学習しました。

Kubernetesでは環境変数の埋め込みは5つリソースによって埋め込めます。

  • 静的設定
    • sepec.containers[].envに静的な値を定義
  • Pod情報
    • Podの情報をfieldRefで参照
  • コンテナ情報
    • コンテナ情報をresourceFiledRefで参照
  • ConfigMapリソースの設定値
    • ConfigMapリソースをspec.containers[].envvalueFrom.configMapKeyRef`で利用
    • 設定とアプリケーションを切り離す・設定を動的に注入することが容易
    • 同一のコンテナイメージを様々な場面・環境で使い回せる
  • Secretリソースの機密情報
    • Secretリソースをspec.containers[].envvalueFrom.secretKeyRef`で利用
    • ConfigMap同様、設定とアプリケーションを切り離す・設定を動的に注入することが容易でコンテナイメージの使い回し可能
    • 機密情報を別リソースとして定義しておき、Podからそれを読み込むことができる。
    • マニフェストをGitリポジトリにアップロードすることはできない。(kubesecと呼ばれるOSS使用によりアップロード可能)

結論

「The Twelve-Factor APP III.設定」に則ってみると、デプロイごとに変更されうる設定情報は環境変数に格納し、Kubernetesでは、静的設定、Pod、コンテナの情報、Secret、ConfigMapで環境変数を利用できる。
上記でまとめたそれぞれの使い道に合わせて、設定を環境変数に格納しましょうよって話。

おわりに

Kubernetesの環境変数について一番最初に調べるのが手っ取り早いし、それを記述すべきですが、体系的に理解したことをメモしたかったので、長めの投稿になりました。

参考文献

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

curlのHTTP/3通信をDocker上で使ってみる

upstreamのcurlにおいてHTTP/3の実験的サポートが追加されました。
公式リポジトリのReadmeに詳細が載ってますが、とりあえずDocker上で動かせるのを確認したのでシェアします。

HTTP/3についてよくわからない方は詳解HTTP/3をご覧ください(ステマ)。

すぐ試したいという方は docker run --rm -it inductor/curl-quiche:latest でコンテナを起動したあとに以下を実行すればよいです。(Ref: https://asnokaze.hatenablog.com/entry/2019/08/07/031904)

$ curl --http3 https://www.facebook.com/ -v -s -o /dev/null

公式の手順を参考に書き起こしたDockerfileが以下です。

$ docker images
REPOSITORY            TAG     IMAGE ID      CREATED         SIZE
inductor/curl-quiche  latest  b8288aeca6a3  24 minutes ago  98.1MB

Git repoはこちら

Dockerfile
FROM debian:buster-slim as base
RUN apt-get update && apt-get install -y git build-essential pkg-config

FROM base as fetch-quiche
WORKDIR /root
RUN git clone --recursive --depth 1 https://github.com/cloudflare/quiche
RUN mkdir quiche/deps/boringssl/build
WORKDIR /root/quiche/deps/boringssl/build
RUN apt-get update && apt-get install -y cmake golang-go
RUN cmake -DCMAKE_POSITION_INDEPENDENT_CODE=on ..
RUN make -j`nproc`
WORKDIR /root/quiche/deps/boringssl
RUN mkdir .openssl/lib -p
RUN cp build/crypto/libcrypto.a build/ssl/libssl.a .openssl/lib
RUN ln -s $PWD/include .openssl

FROM base as build-quiche
WORKDIR /root
RUN apt-get update && apt-get install -y wget && \
    wget https://sh.rustup.rs -O install.sh && chmod +x install.sh && ./install.sh -y && rm -rf install.sh && \
    apt-get purge -y --auto-remove wget
COPY --from=fetch-quiche /root/quiche /root/quiche
WORKDIR  /root/quiche/
RUN QUICHE_BSSL_PATH=$PWD/deps/boringssl $HOME/.cargo/bin/cargo build --release --features pkg-config-meta

FROM base as build-curl
WORKDIR /root
RUN git clone --depth 1 https://github.com/curl/curl
WORKDIR /root/curl
RUN apt-get update && apt-get install -y autoconf libtool
RUN ./buildconf
COPY --from=build-quiche /root/quiche /root/quiche
RUN ./configure LDFLAGS="-Wl,-rpath,$PWD/../quiche/target/release" --with-ssl=$PWD/../quiche/deps/boringssl/.openssl --with-quiche=$PWD/../quiche/target/release
RUN make -j`nproc`
RUN make install

FROM debian:buster-slim as executor
COPY --from=build-curl /etc/ld.so.conf.d/libc.conf /etc/ld.so.conf.d/libcurl.conf
COPY --from=build-curl /usr/local/lib/libcurl.so.4 /usr/local/lib/libcurl.so.4
COPY --from=build-curl /etc/ld.so.conf.d/libc.conf /etc/ld.so.conf.d/libquiche.conf
COPY --from=build-curl /root/quiche/target/release/libquiche.so /usr/local/lib/libquiche.so
COPY --from=build-curl /usr/local/bin/curl /usr/local/bin/curl
RUN ldconfig
CMD ["bash"]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerってなんだろう

Dockerとはコンテナ型の仮想環境を構築するもので、その中にアプリ・ミドルウェア・DockerEnginをなどをいれて他のパソコンに配布できる。どのパソコンでも同じような環境で使うことができる。

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