- 投稿日:2019-08-30T22:02:04+09:00
最近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)では上手くいきませんでした。
・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を使うのがポイントです。参考になれば幸いです。
参考文献
- 投稿日:2019-08-30T19:59:38+09:00
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
と宣言されたImmutableList
にaddAll
されています。この変数
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
による実行なので、問題あるんだよって話でした。「そらそうよ。だから配列なんやで。」 って感じですかね。
何か間違っている点等がありましたら、ご指摘いただけると幸いです。
- 投稿日:2019-08-30T19:59:38+09:00
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
と宣言されたImmutableList
にaddAll
されています。この変数
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
による実行なので、問題あるんだよって話でした。「そらそうよ。だから配列なんやで。」 って感じですかね。
何か間違っている点等がありましたら、ご指摘いただけると幸いです。
- 投稿日:2019-08-30T19:49:38+09:00
Laravel開発環境構築
はじめに
前回記事で、Laravel開発環境を仮想環境(VirtualBox)上に作成することはできた。
今回は仮想環境上で動作するDockerコンテナでLaravelのビルドインWebサーバーを実行します。ホストOS、ゲストOS、Dockerコンテナ間のディレクトリマッピングを整備することで、ホストOS上で変更したソースの内容をリアルタイムでDockerコンテナへ反映させ、動作を確認できるような開発環境を整備します。目的
docker-compose.yml および Dockerfile の記述方や配置方法などを学ぶことを目的としています。
最終目標は、Vagrantfileやdocker-compose.yml、Dockerfile、各種設定ファイルを配布することで、誰でも同じ開発環境を構築できることです。
実際の開発環境整備を考える場合、DBやWebサーバーもコンテナ化してLaravelコンテナと連携させる必要がありますが、今回は割愛します。システム構成
ディレクトリ構成
Vagrant、VirtualBoxのインストール
VirtualBox
https://www.virtualbox.org/wiki/Downloads作業を始める前に
こちらの記事を元に、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/bargeBargeLinux起動用の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 d7080c1Docker 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-composedocker-compose.yml の作成
Docker Compose の設定ファイル、docker-compose.yml を新規作成します。
$ touch /vagrant/env/docker-compose.yml作成したdocker-compose.ymlを編集していきます。
詳細はこちらの記事を参照してください。$ vi /vagrant/env/docker-compose.ymldocker-compose.ymlversion: '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/DockerfileDockerfile// ベースイメージは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です。
ホストOS側でソースコードを変更
では、ホストOS側でソースコードを修正し、反映されるか確認します。
D:\lara_project\source\resources\views\welcome.blade.php
をエディタで開き、以下のように変更します。welcome.blade.php- 82| Laravel + 82| Laravel_Customこれでホスト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
- 投稿日:2019-08-30T18:09:25+09:00
1台の物理マシンでPrometheusやらGrafanaやらを建てる(Docker使用)
「1台の物理マシンだけで、かつDockerコンテナを使用してPrometheusなどの監視環境を整える。」
みたいな記事が無かったのでメモ。前書き
- 全部Dockerコンテナで動かします
- 1台の物理マシンだけで完結するように構成しています
- 監視に際してこの構成を奨励するものではありません
- 今回は各ソフトウェアを立ち上げるのがメインなのです
- 「Prometheusとは」とか「監視とは」とか「正しいアラートとは」とかは書いてないのであしからず
今回のゴール
- 以下の図の通りに構成を完了する
- GrafanaのData SourcesにPrometheusを指定する
軽く説明
- ノート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.ymllobal: 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.yml
はdocker
コマンドを使うユーザが編集できる場所に配置してください
- (
docker run
時に、権限の問題でエラーになる可能性があるため)targets:
で定義されているalertmanager
やnode-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-exporterAlertManagerの起動
$ docker run --rm -d -p 9093:9093 --net prom-network --name alertmanager prom/alertmanagerGrafanaの起動
$ docker run --rm -d -p 3000:3000 --net prom-network --name grafana grafana/grafanaGrafanaのData Sourcesを設定する
とりあえずwebブラウザで
localhost:3000
でGrafanaにアクセスしましょう。
admin/adminでログインできます。
ログインしたら左側の歯車アイコンからAdd data sourceでデータソース追加画面に移ります。
ここでHTTPセクションのURLを以下のように入力し、ページの一番下にある「Save & Test」を押下します。
緑のポップアップ通知が出ればPrometheusからデータを正しく受信する設定が整っています。
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として使用することで通信を行うことができる、というわけです。
- 投稿日:2019-08-30T17:13:59+09:00
マウスカーソルを目で追うGopherくんのサイトをDockerで開発してGitHub Pagesで公開した
完成品
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が一番楽だと思います。
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ディレクトリが存在しないとこの選択肢は選べないので注意です。これで以下のURLにアクセスするとdocs以下に配置したindex.htmlが表示されるはずです。
https://(ユーザー名).github.io/(リポジトリ名)/
あとは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.confserver { listen 80; server_name _; root /var/www/html; index index.html; charset utf-8; }次にdocker-compose.ymlを作成します。
DockerComposeは本来複数のコンテナを管理するためのものだった気がしますが、使うコンテナが1つでも簡単に構築、削除が出来るので今回みたいにサーバーを建てる用途の時はよく利用します。docker-compose.ymlversion: '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.csshtml, 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.jsclass 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は手軽で強力だと思いました。
やっぱり手を動かすと得られるものは多いと思うので、手を気持ちよく動かせる環境は大事です。
- 投稿日:2019-08-30T17:05:13+09:00
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.repoDocker-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 dockerWordPress の 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:latestWordPress に必要な 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.phpWordPress用の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/
- 投稿日:2019-08-30T16:53:32+09:00
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.repoDocker-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 dockerWordPress の 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:latestWordPress に必要な 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.phpWordPress用の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/
- 投稿日:2019-08-30T15:38:25+09:00
Docker + Rails + React
Docker + Rails + React
streampack の minsu です。
今年の夏は主に室内で過ごしていましたが、先日帰省した折に中古のカメラを手に入れたので今後はアウトドアな趣味としてお散歩カメラをきめこみたいと考えています。
涼しくなったら、たぶん目的
フロント: React
バック: Rails
を Docker を利用して構築します。React + Rails ですが webpacker を利用する方法で行います。
ファイルの用意
まず、
Gemfile
、Gemfile.lock
、Dockerfile
、dcocker-compose.yml
を用意します。Gemfilesource 'https://rubygems.org' gem 'rails', '5.1.4'DockerfileFROM 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 . /appdocker-compose.ymlversion: '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=mysqldocker-compose.yml の mysql の rootパスワードを
MYSQL_ROOT_PASSWORD=root
に設定したので config/database.yml の development に設定を追加しました。
host も同じく指定した db に変更します。config/database.ymlusername: root password: root host: dbGemfile に
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.js
、hello_react.jsx
が作成されます。db、 model 作成
適当な model と seeds データを用意して DB を作成後にデータを入れます。
$ docker-compose run app rails g model List title:string desc:stringdb/seeds.rb5.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 indexlists_controller.rbdef index @lists = List.all endview では
javascript_pack_tag
とreact_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.jsimport 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
にアクセスします。
無事に一覧が表示されました。まとめ
起動と表示確認までを行いました。
この状態では何の機能もないので React での CRUD 操作を実装するまでを追記、または新しく記事にしたいと思います。
- 投稿日:2019-08-30T15:06:30+09:00
「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/e75c40975183b8aabba6Podや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[].env
の
valueFrom.configMapKeyRef
`で利用- 設定とアプリケーションを切り離す・設定を動的に注入することが容易
- 同一のコンテナイメージを様々な場面・環境で使い回せる
- Secretリソースの機密情報
- Secretリソースを
spec.containers[].env
の
valueFrom.secretKeyRef
`で利用- ConfigMap同様、設定とアプリケーションを切り離す・設定を動的に注入することが容易でコンテナイメージの使い回し可能
- 機密情報を別リソースとして定義しておき、Podからそれを読み込むことができる。
- マニフェストをGitリポジトリにアップロードすることはできない。(kubesecと呼ばれるOSS使用によりアップロード可能)
結論
「The Twelve-Factor APP III.設定」に則ってみると、デプロイごとに変更されうる設定情報は環境変数に格納し、Kubernetesでは、静的設定、Pod、コンテナの情報、Secret、ConfigMapで環境変数を利用できる。
上記でまとめたそれぞれの使い道に合わせて、設定を環境変数に格納しましょうよって話。おわりに
Kubernetesの環境変数について一番最初に調べるのが手っ取り早いし、それを記述すべきですが、体系的に理解したことをメモしたかったので、長めの投稿になりました。
参考文献
- https://12factor.net/ja/config
- https://qiita.com/MahoTakara/items/85096f8b2632c802ab22
- https://qiita.com/supaiku2452/items/8b06b774c0e2fce7df92
- https://gihyo.jp/book/2018/978-4-297-10033-9
- https://qiita.com/apstndb/items/e75c40975183b8aabba6
- https://qiita.com/MahoTakara/items/f5130bb6e9e493c46c6b
- https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/explore/explore-intro/
- 投稿日:2019-08-30T13:30:51+09:00
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.1MBGit repoはこちら
DockerfileFROM 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"]
- 投稿日:2019-08-30T11:36:03+09:00
Dockerってなんだろう
Dockerとはコンテナ型の仮想環境を構築するもので、その中にアプリ・ミドルウェア・DockerEnginをなどをいれて他のパソコンに配布できる。どのパソコンでも同じような環境で使うことができる。