Translate

2015年3月6日金曜日

The Docker User Guide: Dockerizing Applications: A "Hello world" を翻訳してみた



今頃気づいたのですが、The Docker User Guideを翻訳している人って
別にいたんですね。
読んでみるとこちらのほうが、翻訳がエレガントでした..

もし読みやすい方を探している方はコッチを参照することをおすすめします。

Dockerとは - Docker User Guide
http://qiita.com/zembutsu/items/bbf740839c887835f2ee



とはいえせっかく翻訳したので、私の拙い訳も
一応公開します。

今回の記事は、以下のサイトを翻訳したものです。
Dockerizing Applications: A "Hello world"
 https://docs.docker.com/userguide/dockerizing/



---

"Hello world"アプリケーションのDocker化


それで Docker に関する全てについてですか?

Dockerはコンテナ内部でのアプリケーション実行を許可します。コンテナ内部でアプリケーションを実行させるには、次のコマンドを使います:docker run
 注意:
 もしBoot2DockerのようなリモートDockerデーモンを使用しているのであれば、
 ドキュメンテーション内の例にあるdockerコマンドの先頭のsudoをタイプしないで
 ください。

 訳者注:
 rootによるログインを許可している場合も不要です。



Hello world


今すぐ次のコマンドを試してみてください。

 $ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
 Hello world

そしてこれがあなたの一番最初のコンネナ起動になります。

それで、何が起こったのでしょう?docker runコマンドが実行した内容を順番に見て行きましょう。

最初に、実行したいdockerバイナリとコマンドを指定し、実行します。docker runコンビネーションはコンテナを実行します。

次に、イメージ「ubuntu:14.04」を特定します。これは実行するコンテナの元となります。Dockerはイメージを呼び出します。この場合は、Ubuntu 14.04 OS イメージを使用します。

イメージを特定すると、Dockerは、最初にDockerホスト上のイメージを見に行きます。もし発見できなかった場合は、Docker Hubのパブリックイメージをダウンロードします。

次に、なにのコマンドを新規コンネな内で実行するかDockerと対話します:


 /bin/echo 'Hello world'

コンテナが起動すると、DockerはあらたにUbuntu14.04環境を新規生成します。そして内部で/bin/echo コマンドを実行します。結果はコマンドライン上で見ることができます:

 Hello world

それで、この後コンテナに何が起こるの?ええと、Dockerコンテナは指定したコマンドが有効な限り実行し続けます。この例ではできるだけ早くHello worldechoして、コンテナを停止します。


対話型(Interactive)コンテナ


再度docker runコマンドを試してみましょう、今度はコンテナに新たなコマンドを指定します。

 $ sudo docker run -t -i ubuntu:14.04 /bin/bash
 root@af8bae53bdd3:/#

ここでは再度docker runコマンドで「ubuntu:14.04」イメージを指定しています。ただし、2つのフラグを追加しています:「-t」と「-i」です。「-t」フラグはpseudo-ttyもしくは新しいコンテナ内部のターミナルを割り当てます。そして「-i」フラグはコンテナの標準入力(STDIN)を使った対話型接続を許可します。

/bin/bas
hを実行するためのコンテナのための新たなコマンドも指定しています。これはコンテナ内部でBashを起動することを指定しています。


そして、コンテナが起動したら、コマンドプロンプトが表示されます:


 root@af8bae53bdd3:/#

いくつかのコマンドを試してみましょう:

 root@af8bae53bdd3:/# pwd
 /
 root@af8bae53bdd3:/# ls
 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var


カレントディレクトリを表示するためにpwdを実行し、/ ルート・ディレクトリに入っていることを表示しています。また典型的なLinuxファイルシステムのようなルートディレクトリ上のディレクトリリスト表示を実行しています。

コンテナ内部で遊ぶことができ、終わったらexitコマンドもしくはCtrl-Dを入力して終了することができます。

 root@af8bae53bdd3:/# exit


一つ前のコンテナの場合のように、一度Bashプロセスを終了すると、コンテナが停止します。


デーモン化したHello world


コマンドを実行して終了したコンテナは使い道がありますが、あまり役に立ちません。Dockerを使っておそらく実行しようとする多くのアプリケーションのように、デーモンとして実行するコンテナを作成してみましょう。

もう一度、docker runコマンドを使います:

 $ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

なに待ってるの?"Hello world"がありますよ、ここで実行結果を見てみましょう。それはかなり簡単に見られるべきです。docker runを実行しましたが、この場合「-d」フラグを使います。「-d」フラグはDockerにコンテナの実行を問い合わせ、それをデーモン化するために、バックグラウンドに配置します。

同じイメージ「ubuntu:14.04」をまた指定しています。

最後に、実行コマンドを指定しています:

 /bin/sh -c "while true; do echo hello world; sleep 1; done"

これは(hello)worldの最も愚かなデーモンです:永遠にhello worldechoし続けます。

そしてなぜたくさんのhello worldが見えないのでしょう?代わりにDockerは次のような本当に長い文字列を返しました:

 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

この長い文字列は、コンテナIDと呼ばれるものです。コンテナごとに一意に定義されており、そこで動作していることを表してます。

 注意:
 コンテナIDは、少し長くて扱いづらいです。それらが動作するコンテナを名前付けるより短いIDを使う方法を後ほど紹介します。

hello worldデーモンが何を発生させたかを見るためにコンテナIDを使用します。

最初にコンテナが動作しているか確認してみましょう。そのためにはdocker psコマンドを使います。docker psコマンドはDockerデーモンに対して知っているすべてのコンテナの情報を問い合わせます。


 $ sudo docker ps
 CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
 1e5535038e28  ubuntu:14.04  /bin/sh -c 'while tr  2 minutes ago  Up 1 minute        insane_babbage

このようにデーモン化されたコンテナを照会することができます。docker psコマンドは有益な情報を得ることができます。この時のコンテナIDは短縮されています: 1e5535038e28

ビルドに使用したイメージ(ubuntu:14.04)、実行中のコマンド、ステータス、自動的に割り当てられた名前(insane_babbage)が参照可能です。

 注意:
 Dockerは自動的にコンテナに名前をつけます、もう少し後で名前の指定方法を学習します。

OK、ここで動作中であることを知りました。しかし実行を指示したことをコンテナが実行していますか?それを見るためにはdocker log コマンドを使ってコンテナの内部を参照します。Dockerにアサインされたコンテナ名を使いましょう。

 $ sudo docker logs insane_babbage
 hello world
 hello world
 hello world
 ...

docker logコマンドはコンテナ内部を参照し標準出力を表示します:この場合はhello worldコマンドの出力になります。

すごい!デーモンが動作しています、そしてこれがあなたにとって初めてのDockerアプリケーションになります!

自分でコンテナを作成できることが確認できたので、片付けをしてデーモン化したコンテナを終了してみましょう。このためには、docker stopコマンドを使います。

 $ sudo docker stop insane_babbage
 insane_babbage

docker stopコマンドはDockerに対して実行中のコンテナ対して礼儀正しく停止を指示します。もし成功したのであれば、停止させたコンテナの名前を返却します。

docker psコマンドを使って動作状態を確認してみましょう。


 $ sudo docker ps
 CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES

完璧です、コンテナは停止済みです。


次のステップ


Dockerをはじめることがいかに簡単かわかったと思いますので、より先進的なタスクの実行方法を学習しましょう。

コンテナの動作へ進む

2015年3月5日木曜日

The Docker User Guide を翻訳してみた

Dockerを使いはじめるなら、やはりUser Guideを読まないと..

..ということで、超私的に翻訳をはじめました。
この記事では、
The Docker User Guide
https://docs.docker.com/userguide/
の範囲だけ翻訳してみました。

At Your Own Riskで参考にしてください。


なお、各セクションは少しづつ翻訳していきます。


----------

Dockerユーザガイドへようこそ


序論では、Dockerとはなにか、そして Docker がどのようにして実行されているのか知ることができます。このガイドでは、環境をDockerの基礎的な使い方を理解でき、あなたの環境に(Dockerを)融合します。

以下の内容を学習することができます:
  • アプリケーションのDocker化
  • 自分のコンテナの実行
  • Dockerイメージをビルド
  • 自分のDockerイメージを他人と共有
  • そして、もっと!

本ガイドのメジャーセクションはDockerライフサイクルを分割したものです:


Docker Hubを使ってみよう


Docker Hubってどうつかったらいいの?

Docker hubとは Dockerのセントラルハブのことです。公式Dockerイメージがホストされており、Docker環境を構築ビルドを支援するサービスが提供されています。詳細はこちら:

Docker Hubの使い方へ進む



"Hello world"アプリのDocker化


どうやってコンテナ内でアプリケーションを実行するの?

Dockerはアプリケーション実行のためのコンテナベースの仮想プラットフォームを提供します。アプリケーションをDocker化して実行するには:

アプリケーションのDocker化へ進む


コンテナの動作


自分のコンテナをどうやって管理するの?

一度Dockerコンテナ内でアプリケーションを実行すると、それらのコンテナが管理されているか参照したくなるでしょう。どうやってコンテナを監査(inspect)・監視・管理するかは:


コンテナの動作へ進む


Dockerイメージの動作


どうやって自分のイメージをアクセスして、共有して、ビルドするの?

Dockerの使い方を学習したら、次はDockerを使ってアプリケーションイメージのビルド方法を学習しましょう。

Dockerイメージの動作へ進む



コンテナへのリンク


これまでは、Dockerコンテナ内部の個別のアプリケーションのビルド方法を学習してきました。次は複数のDockerコンテナ群へリンクすることでDockerでアプリケーションスタック全体のビルド方法を学習します。

コンテナへのリンクへ進む


コンテナ内データの管理


Dockerコンテナのリンク方法を学習したら、次はコンテナ内部のデータ、ボリューム、マウントの管理方法について学びます。

コンテナ内のデータ管理へ進む


Docker Hubの動作


Dockerの使い方についてもう少し学ぶために、Dockerと信頼性のあるビルドや個人のリポジトリを含むDocker Hub上で有効なサービスの連携方法についてみていきましょう。

Docker Hubの動作へ進む

Docker Compose


Docker Compose は、1つのファイルにアプリケーションのコンポーネント(コンテナ、設定、リンク、ボリューム)を定義することを許可します。そして1つのコマンドでアプリ実行準備や起動なにもかも設定することができます。


Docker Composeユーザガイドへ進む



Docker マシン


Docker マシンはDocker エンジンを素早く準備し起動を助けます。マシンはあなたのコンピュータ、クラウドプロバイダ、そして/もしくはあなたのデータセンタ上のDockerエンジンのためにホストを準備することができます。そしてそれらのホストと安全に通信するDockerクライアントを設定します。

Dockerマシンへ進む



Docker Swarm


Docker Swarm はいくつかのDocker エンジンをプールし、単一のDockerエンジンとして露出させています。Docker Swarmは標準Docker APIを提供しているので、Dockerで動作確認されたどんなツールでも複数のホストへ透過的にスケールアウトできます。


Docker Swarm ユーザガイドへ進む


参考


 訳者注:以下のリンク先は、翻訳していません。


---------

このページはユーザガイドの目次みたいなページですね。

The Docker User Guide: Managing Data in Containers を翻訳してみた



The Docker User Guideの1セクションである

 Managing Data in Containers
 https://docs.docker.com/userguide/dockervolumes/


の範囲だけ翻訳してみました。
もちろん参照する際はAt Your Own Riskでお願いします。

----------

コンテナ内データの管理


いくつかの基本的なDockerコンテナについて紹介し、Dockerイメージがいかにして動作するかだけでなくコンテナ間のネットワーキングやリンクについて見てきました。このセクションでは、内部そしてDockerコンテナ間のデータをいかにして管理することができるかを議論します。

Docker内のデータ管理方法として主に2つの手段に着目します。

  • データボリューム
  • データボリュームコンテナ

データボリューム


データボリュームは、(永続化もしくは共有されたデータのためにいくつかの有用な機能を提供する)ユニオンファイルシステムをバイパスする1つ以上のコンテナの範囲内で特別に設計されたディレクトリです:

  • ボリュームはコンテナが生成されると初期化される
  • データボリュームはコンテナ間で共有や再利用が可能
  • データボリュームへの変更によりディレクトリが作成される
  • データボリュームへの変更にはイメージの更新時は含まれない
  • データボリュームはそのコンテナ自身が削除されても永続している

データボリュームは、コンテナのライフサイクルに独立して、データを永続させるために設計されています。Dockerはそれゆえコンテナを削除した時でも決して自動的にボリュームを削除しません。コンテナによって参照されない"ガーベージコレクト"ボリュームも削除しません。

データボリュームの追加


docker createコマンドやdocker runコマンドに「-v」フラグを使うことで、コンテナにデータボリュームを追加することができます。複数のデータボリュームをマウントするために複数の「-v」フラグを使用することができます。Webアプリケーションコンテナに1つのデータボリュームをマウントしてみましょう。


 $ sudo docker run -d -P --name web -v /webapp training/webapp python app.py

このコマンドは /webappのコンテナ内部に新規ボリュームを生成します。

 注意:
 イメージから生成されたコンテナに対して1つ以上のボリュームを追加するために
 Dockerfile内のVOLUMEインストラクションもまた使用可能です。

データボリュームとしてホストディレクトリをマウント


-v」フラグを使用したボリュームの新規作成に加えて、コンテナ内のDockerデーモンのホストからディレクトリをマウントすることも可能です。

注意:
もしBoot2Dockerを使用するのであれば、Dockerデーモンだけは OSX/Windows ファイルシステムへのアクセスが制限されます。Boot2Dockerは /Users(OSX) もしくは C:\Users(Windows) ディレクトリへの自動共有を試行します。-「docker run -v /Users/:/ ... 」(OSX)もしくは「 docker run -v /c/Users/:/ 」することができます。他のすべての経路はBoot2Docker仮想マシンのファイルシステムからとなります。


 $ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

上記のコマンドは、ホストのディレクトリ/src/webapp をコンテナの/opt/webappへマウントします。
 

注意:
もし /opt/webapp がコンテナイメージの内部ですでに存在していた場合、コンテナは期待されるマウント動作と一致し続けるために、ホスト上の/src/webappのコンテンツに置き換えられます。

これはテストの際にはとても有効です、例えばコンテナ内へソースコードをマウントして、ソースコードを変更した際のアプリケーションの動作を確認することができます。ホスト上のディレクトリは絶対パスで指定しなくてはなりません。もしディレクトリが存在しないと、Dockerは自動的に作成します。
 

注意:
これはビルドされたイメージのポータビリティや共有を目的としたDockerfileからは有効ではありません。ホストディレクトリはもともとホスト依存であるため、おそらくDockerfile内で指定したホストディレクトリはすべてのホスト上ではおそらく動作しないでしょう。

Dockerはデフォルトでは読み書きボリュームですが、読み込みのみのディレクトリをマウントすることもできます。

 $ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

ここでは同一の /src/webapp ディレクトリをマウントしていましたが、ro オプションを追加することで読み込みのみでマウント
指定できます。

データボリュームとしてホストファイルをマウント


「-v」フラグで、ホストマシンからディレクトリの代わりに、単一のファイルをマウントすることもできます。

 $ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

このコマンドは、ホスト上のbashヒストリを新規のコンテナのbashシェルへ投入します、そしてコンテナから出た際にコンテナ内でタイプしたコマンドのヒストリがホスト側にも反映しています。

 注意:
 viやsedを含むファイル編集のための多くのツールは結果としてinodeを変更します。Docker v1.1.0 以降、以下の様なエラーが発生します。
 "sed: cannot rename ./sedKdJ9Dy: Device or resource busy"
 マウントされたファイルを編集したい場合は、親ディレクトリをかわりにマウントする方法がおそらく最も簡単です。


データボリュームコンテナの新規作成とマウント


永続データを複数のコンテナ間で共有したい場合、もしくは非永続コンテナから使用したい場合、データボリュームコンテナ(Data Volume Container)と名付けられたものを作成してそこからデータをマウントする方法がベストです。

共有ボリュームを持つ新たな名前のコンテナを作成しましょう。このコンテナはアプリケーションが動作せず、「training/postgres」イメージとして再利用されます、このためすべてのコンテナは保存するためのディスクスペースのレイヤとして一般的に使用されます。

 $ sudo docker create -v /dbdata --name dbdata training/postgres

次に「--volumes-from」フラグを使って、別のコンテナの /dbdata ボリュームをマウントすることができます。

 $ sudo docker run -d --volumes-from dbdata --name db1 training/postgres

更に他のコンテナでは:

 $ sudo docker run -d --volumes-from dbdata --name db2 training/postgres

複数の「--volumes-from」パラメータを使って、複数のコンテナから複数のデータボリュームを持ち出すことができます。

db1もしくはdb2コンテナを経由して更に別のコンテナがdbdata コンテナのボリュームをマウントすることによってチェーンを延長することができます。

 $ sudo docker run -d --name db3 --volumes-from db1 training/postgres

もしもとのdbdataコンテナを含む、もしくは以降のコンテナdb1db2を含むマウントボリュームを削除したとしても、ボリュームは削除されません。ディスクからボリュームを削除するには、ボリュームを参照する最後のコンテナに対して「docker rm -v」と明記して実行しなくてはなりません。これを使って更新や、コンテナ間のデータボリュームを効果的に移すことができます。
 

注意:
ボリューム削除のために「-v」オプションを使わないでコンテナを削除する場合、Dockerは警告しません。もし「-v」オプションなしでコンテナを削除したなら、これ以上コンテナから参照できない"dangling(ぶらさがった)"ボリュームとなります。Danglingボリュームは削除が困難で、全体として大量のディスクスペース専有します。我々はボリューム管理の改善に取り組んでおり、リクエスト8484を調べることで進捗を確認することができます。


バックアップ、リストア、データボリュームの移動


ボリュームで実行できるもうひとつの役に立つ機能として、バックアップ、リストア、移動があります。次のような「--volumes-from」フラグを使って対象ボリュームをマウントした新規コンテナを作成することで操作します:

 $ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

ここでは、新規コンテナを用意して、dbdataコンテナのボリュームをマウントしています。そしてローカルホストのディレクトリを /backup としてマウントしています。最終的に、tar コマンドを使って dbdata ボリュームのコンテンツを backup.tar にアーカイブするコマンドを実行します。コマンドが完了すれば、コンテナがストップした場合でも、dbdata ボリュームのバックアップが残ります。

そして、同じコンテナや別に作成したコンテナへリストアすることができます。新規コンテナを作成します。

 $ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

次に、バックアップファイルの tar をはずしてコンテナのデータボリュームへ格納します。


 $ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

適当なツールを使い自動バックアップ、移動、リストアテストを上記の技術を用いることで可能になります。

次のステップ


Dockerの使い方についてより深く学習してきました、次に自動化したビルドや個人のリポジトリを含むDocker Hub上の有益なさービスをどうやって結びつけていくかを見て行きましょう。

Docker Hubの動作へ進む


----------

簡単にいえばマウント元専用のコンテナを作りなさいということらしい。

バックアップ先としてマウントしてデータをtarで集めさせて、コピりなさいよ..か。もうすこし考えて構成設計しないと足元すくわれそう..

The Docker User Guide: Getting Started with Docker Hubを翻訳してみる


The Docker User Guideの1セクションである以下のページを翻訳してみました。

 Getting Started with Docker Hub
 https://docs.docker.com/userguide/dockerhub/


参照の際はAt Your Own Riskでお願いします。

----------

Docker Hub を使ってみよう


このセクションでは新規アカウント作成を含めたDocker Hubの概要を説明します。

Docker Hubは、DockerやDockerコンテナで動作するリソースを集約しています。Docker Hubは、Dockerの外部であなたが同僚が協力することを助けます。次のようなサービスを提供しています:

  • Dockerイメージのホスティング
  • ユーザ認証
  • 自動化されたイメージビルドや、ビルドトリガやwebフックのようなワークフローツール
  • GitHub や BitBucket とのインテグレーション

Docker Hubを使うために、最初に新規アカウントを作成します。気にしないでください、新規アカウント作成は単純で無料です。


Docker Hubアカウントの新規作成


新規アカウントの登録・作成をおこなうには以下の2つの方法があります:

Web経由、と
コマンドライン経由、です


Web経由のアカウント登録


氏名、パスワード、ずっと有効なメールアドレスをサインアップフォームに入力してください。何がDockerの世界中で続けられているかについてのたくさんの情報が投稿されるDocker ウィークリーメーリングリストによるサインアップも可能です。




コマンドライン経由のアカウント登録


docker loginコマンドを使うとコマンドライン経由でDocker Hubアカウントの新規作成が実行できます。

 訳者注:プロクシ経由の場合は、環境変数http_proxyを指定してください。
  以下のファイルに記述してもOKです。
  CentOS7: /etc/sysconfig/docker
  Ubuntu12: /etc/default/docker

 $ sudo docker login


メールによる確認


フォームを埋めると、指定したメールアドレスへようこそメッセージと確認依頼が送信されます。到着したら、メールの内容に従ってアクティベートを実施してください。

ログイン


確認プロセスを完了したら、Webコンソールからログイン可能です:



もしくは、docker loginコマンドを使えばコマンドライン経由でログイン可能です:

 $ sudo docker login

Docker Hubアカウントはこれで使用可能になりました。


次のステップ


次にアプリケーションのDocker化の方法を練習"Hello world"で学習しましょう

アプリケーションのDocker化へ進む

----------

docker pullはアカウントがなくてもできるらしいので、
上記の作業はいらないかも..

2015年2月25日水曜日

Docker上のCentOSコンテナでsystemdを使えるようにする方法

CloudStack、OpenStackときたら、Dockerにも手をつけないと..

というよくわからない強迫観念にかられ
私もついに Docker に手を出しました。


..こりゃ簡単だ..

できることはVMware PlayerのNATで仮想イメージ上げたような
感じだけど、むちゃくちゃ軽い。

OSはCentOS/ubuntuだけなのが残念。

だからこれまでのハイパーバイザ型の仮想化技術に
完全に取って代わることはできないけど、
アプリ開発をやっている人がちょいと
tomcatやhttpdを起動させたい時とか
開発で使うsubversion/redmine/jenkinsサーバを必要なときに起動して
必要なくなったらイメージで固めて保管すればいい。

インストールなんてCloudStackやOpenStackなんか死ぬほど難しいけど
CentOSやubuntuならyumapt-getでさっくりはいってしまう。

なによりホスト(?)OSはCentOSやubuntuのデフォルト最小構成インストールでOK
ゲストOSのインストールは一切不要(だからライセンス問題のある有料OSはなかなか対応できないだろうけど)。


デモ環境やアプリや向きの仮想化技術だ。

DockerfileもCentOS/ubuntuを普通につかってる人ならだれでも書ける。
コマンドラインに打ち込んでいたコマンドの先頭に"RUN"つけて列挙するだけ。
あとVOLUMEやEXPOSEやいろいろあるけど、
サンプルパクればさくっと作れる。


ただ..そこまでいくまでの情報が少ない。

現時点で紙で出版されている書籍はなく、
Kindleで以下の本が販売されていた。



(この記事を書いた時点で)星3つなのは、
最初の概要がとってもおざなりでどういう技術をもとに
動いているのか読んでもさっぱりわからない。
その後は、それなりにコマンドを理解している人なら有益だけど
さいしょのとっっかりには不親切な本だ。

..星3つなのはさいごの

「Dockerを
 ドカドカ使う
 春の空

  米村正明」
が、イラッとさせたのかもしれない..



雑誌ではSoftwareDesignがある。



Docker情報にみな飢えているのか
定価1220円の雑誌が2100円(この記事書いた時点)になってる..

こちらは、Dockerが登場することになったのかのLinux上の技術の変遷が
かたられており最初のKindle本の補填をしてくれた。

Docker上のネットワーク構成の絵があるのもありがたかった。

実際の動くところ紹介は端折り過ぎなので
初心者向きにはちょっと足りないかんじ。

たぶん初心者はここから入った方がいい。

いまさら聞けないDocker入門
http://goo.gl/uMIEv2

このリンクの周辺の記事をよんで
事前情報をえるとよいとおもう。


チュートリアルも英語だけど用意されている。
DockerHubへアカウント作った翌日にサイトから
チュートリアルのリンク付きメールが送られてきた。

The best way to understand Docker is to try it!
http://goo.gl/dB58ZF

このサイト、画面左側の英語を読んででてくる
指示にあったコマンドを右側のコンソールに入力して実行すると
つぎにすすめるこうせいになっていて、
Docker環境がなくてもよく使うコマンドをひととおりおぼえることができる。

チュートリアルを済ませた後
PC上にVirtualBoxなり、VMware playerなりでCentOS7を最小インストールで
たちあげて、「yum -y install docker」すればOK。

この環境で色々試していけばいい。




で、CentOSをdocker上でごそごそ動かしてみたら
色々と不都合なことがでてきた。

大きくは以下の2点。

  1. ネットワーク系のコマンドがないし設定できない
  2. systemdがない

最初の問題、Docker上のコンテナはIPアドレスがかえられない。
nmclientとかip addr showとかが使えない..

ホスト側のNICにブリッジ接続するからで、そのあたりは変えてくれるなということのようで、"ありき"で構築しないとダメらしい。

DNSは/etc/sysconfig/docker上のオプション指定でできるようだ。


で問題なのは2つめだ。

CentOSのバージョンが7になって
適応するのに困るのがsystemdfirewall-cmd/chconがらみ。

これまでserviceで起動停止していたのを
またこんどはsystemdに変えられて
必死で対応していたのに
おぼえたとおもったら
Dockerのデフォルトコンテナではsystemdが入っていない..

Googleってみると
みんないろいろがんばっている。

そもそもわざわざfakesystemdなんていれて
隠しているので何かこのデザインに意図があるように思えた。


で、ブログではなくDockerHubのCentOSサイトを開いてみたら
案の定systemdに関する記述が見つかった。

DockerHub: OFFICIAL REPO CentOS
http://goo.gl/aKYzXi

英語なので翻訳してみた。
以下翻訳した日本語であるが
当然 at your own risk で参照してほしい。


-------

サポートしているタグおよびDockerfile


    latest, centos7, 7 (docker/Dockerfile)
    centos6, 6 (docker/Dockerfile)
    centos5, 5 (docker/Dockerfile)
    centos7.0.1406, 7.0.1406 (docker/Dockerfile)
    centos6.6, 6.6 (docker/Dockerfile)
    centos5.11, 5.11 (docker/Dockerfile)

イメージと履歴については、docker-library/official-images GitHubリポジトリのマニフェストファイル(library/centos)を参照してください。

CentOS


CentOS Linuxは、RHEL(Red Hat Enterprise Linux)のために Red Hat により公式に提供されているフリーソースをもとに構成されたコミュニティサポートされたディストリビュージョンです。このため、CentOS LinuxはRHELと機能的に互換性を持つことを目的としています。CentOS プロジェクトは、主にベンダーの商標や意匠を必要とするものを削除したパッケージに変更しています。CentOS Linux はノーコストで再配布自由です。

CentOS Linux の各バージョンは10年以上維持され続けています(セキュリティアップデートの維持:Red Hatによるサポートの間隔はソース側リリースにより異なる)。CentOS Linux の新しいバージョンはほぼ2年毎にリリースされ、各バージョンは新規ハードウェアサポートのために定期的に更新されます(だいたい6ヶ月間隔)。この結果、安全で、低メンテナンスで、信頼性がたかく、予測可能で、再現可能なLinux環境を提供します。各々のCentOS Linux版は、最高10年の間維持されます(セキュリティ最新版によって Red Hatによる支持間隔の長さは、リリースされる源に関して、時間とともに異なりました)。 新しいCentOS Linux版は、ほぼ2年おきにリリースされます、そして、各々のCentOS Linux版は、より新しいハードウェアを支持するために、定期的に更新されます(ざっと6ヵ月ごと)。これは、安全で、低-メンテナンス、信頼できて、予想できて、再生可能なLinux環境に終わります。

https://wiki.centos.org/FrontPage


CentOS イメージ ドキュメンテーション


centos:latest」タグは現時点でほぼ最新な状態となっています。


定期ビルド


CentOS プロジェクトは、すべてのアクティブリリースのイメージを定期的に更新します。これらのイメージは毎月、もしくは緊急フィックスが必要な際に更新されます。これらのローリングアップデートはメジャーバージョン番号のみでタグ付けされています。

例:「docker pull centos:6」、「docker pull centos:7

マイナータグ


さらに、インストールメディアと一致するマイナーバージョンタグのついたイメージも提供します。これらのイメージは、インストール用ISOコンテンツとマッチさせることが目的なので更新しません。

もしこれらのイメージを選択するのであれば、「RUN yum -y update && yum clean all」をDockerfileに記述するか、もしくは利用者に潜在的なセキュリティ問題を含む可能性を申し入れることを強く推奨します。
これらのイメージを使用する場合は、マイナーバージョンタグを指定してください:

例:「docker pull centos:5.11」、「docker pull centos:6.6

パッケージ ドキュメンテーション


特に指定がない場合は、CentOSコンテナは、イメージのサイズを削減するために nodocs オプションを付けたyumをつかってビルドされます。
もしパッケージをインストールして行方不明になったファイルを発見するならば、「/etc/yum.conf」内の「tsflags=nodocs」をコメントアウトして再インストールしてください。

systemd インテグレーション


現時点では、CentOS7 に含まれる systemd は削除され、依存性解決のためにかわりに fakesystemd に入れ替わっています。これは、systemdが「CAP_SYS_ADMIN」ケーパビリティ(訳者注:root の持つ細かい権限のこと、CAP_SYS_ADMIN quotaswapmount などの操作が可能)を必要としているためです(ホストOS側の cgroups を読むことができるだけではありません)。
もしあなたが fakesystemd を置き換え systemd を不通に使いたいのであれば、以下のステップに従ってください。

systemd ベースイメージのための Dockerfile


FROM centos:7
MAINTAINER "あなたの名前" <あなたの@メールアドレス>
ENV container docker
RUN yum -y swap -- remove fakesystemd -- install systemd systemd-libs
RUN yum -y update; yum clean all; \
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i ==
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

この Dockerfilefakesystemd を実際のパッケージと交換しますが、問題を起こしそうな多くのユニットファイル群を削除します。ここからあなたのベースイメージファイルを構築することができます。

docker build --rm -t local/c7-systemd .」

systemd が使用可能なアプリケーションコンテナの例

上記で作成した systemd が使用可能なベースコンテナをつかって、以下のような Dockerfile を作る必要があります。


FROM local/c7-systemd
RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]

このイメージのビルド:

docker build --rm -t local/c7-systemd-httpd


systemd が使用可能なアプリケーションコンテナの実行


systemd が使用可能なコンテナを実行するためには、ホスト側のcgroupボリュームをマウントするだけでなく、「--privileged」オプションを使う必要があります。

以下は、事前に作成した systemd が使用可能な httpd コンテナを実行するためのコマンド例です。

docker run --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/c7-systemd-httpd

このコンテナは制限されたコンテキスト内でsystemdが使用可能な状態で実行していますが、ほぼcgroupsファイルシステムをマウントした特権が付与されたコンテナとしての実行となります。

サポートされている Docker バージョン


このイメージは Docker バージョン 1.5.0 を公式にサポートしています。

(1.0下の)古いバージョンのサポートは基本ベストエフォートで提供されています。

ユーザフィードバック

Issues


もしこのイメージについての問題や質問がある場合は、https://bugs.centos.org もしくは GitHub issue のチケットを発行してください。

Freenode(https://freenode.net/)上の「#docker-library」IRCチャネル経由で多くの公式イメージメンテナーへ連絡をとることができます。

寄贈・貢献(Contributing)


ぜひ新機能、フィックス、更新、大きいもの少ないものにかかわらず、寄贈(contribute)してください;私達はいつもぞくぞくして pull request を受け取り、可能な限り早く最善を尽くします。

コーディングを開始する前に、特に野心的な寄贈の場合は、 https://bugs.centos.org のチケットもしくは GitHub issue に計画を投稿して我々と議論することをおすすめします。ほかの寄贈に対しての正しい方向性を指し示すチャンスをあたえることになり、あなたの設計上のフィードバックを受けることができ、他の人が同様の作業をしているかどうかの発見を助けてくれます。

-------


なるほど、
ホスト側のcgroupsとの兼ね合いでゲスト・ホスト間の疎結合性が崩れるのと
パッケージコマンド管理による依存関係をだまくらかす意味で
fakesystemdをやむをえず入れたわけか..


このサイトに有るように systemd をむりくり入れてもいいけど..
わざわざ特権許可したコンテナでうごかすより
CMDで起動スクリプト叩いたほうが安全かもなあ..

ケースバイケースでえらぶしかないか..


2014年12月29日月曜日

Karotzを手に入れた後でサービス停止を知る





Jenkins実践入門という本の中(p17)に
eXreme Feedback Device(XFD)の例として
Nabaztagといううさぎ人形が紹介されていた。

調べてみるとNabaztagという会社から
別の会社にわたりKarotzという名前になった
ということを知った。

日本代理店もあったのだけど
リンクを辿って行くとコンサル会社のサイト
いきつく。

検索してもKarotzをやっているそぶりがない..


どうも日本国内では売ってないらしい..

ということで
AmazonサイトでKarotzを検索すると
並行輸入品でKarotz人形を手に入れることができるとわかった。


早速購入してみる。

..おもったよりでかい..

ほんとうに簡単なマニュアルが付いているだけだったのだけど
英語もあったのでなんとか読んでみると..

どうもこの人形、WiFi(オプションでEther接続可能)でインターネットに
直付しないといけないらしい。

しかもサーバ側にユーザ登録して、
そこにメールアドレスやらTwitterアカウントやらを登録しないと
だめらしい。

インストールもUSBデバイスが別途必要で
所定のサイトからダウンロードしたファイル群をUSBデバイスに入れて、
それを人形のおしりに挿し、スイッチをONにしないとだめらしい。


USBキーへ保存するファイル群をもらうためには
http://plug.karotz.com/
いけとあったのですすむと..


..あれ?白い画面しかでないんですけど..

で検索してみると
http://store.karotz.com/en_US/
のトップに「The end of Karotz's adventures」
という画像が..

「Karotz の冒険は、2015年2月18日に終わります 。」

なに?!

「詳細は http://store.karotz.com/en_US/ を見てください。」

とあったので開いてみたが、
トップページはあるものの
リンク先がない..
「Why stopping the server?」ってリンクくらい残してくれよ!



..途方に暮れていたが、
オープンソースにするナイスガイが
いるかもと検索してみると..


..あった、openkarotzプロジェクト..

http://openkarotz.filippi.org/

..でもフランス語..英語がない..

まあYahoo翻訳にかけるからどっちでも同じだけど;-p


で最初の記事を翻訳してみた。


L’assistant d’installation est disponible.
インストール支援サイトをオープンしました。

Vous n’avez désormais plus besoin d’aller sur
le site Karotz.com pour réinstaller votre lapin.
あなたはこれからうさぎをインストールするために
Karotz.com サイトへ行く必要はなくなりました。

Vous pouvez le faire directement depuis l’assistant
 disponible sur : plug.openkarotz.org

インストール支援サイト plug.openkarotz.org を利用してください。

http://plug.openkarotz.org/ へ進むと..


おおイギリスマークがある..ってことは英語サイトも用意されてる..

 これは..試してみるか..



でもkarotz pluginは..ダメだろうなあ..きっと..

2014年12月19日金曜日

SELINUX=enforcingのままでJenkinsを動かす

CentOS 7 LTS 環境に以下の手順でJenkinsサーバをインストールした。



yum -y updape
yum -y install httpd java wget
wget --retr-symlinks -O /etc/yum.repos.d/jenkins.repo \
 http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
yum -y remove wget
rpm --import http://pkg.jenkins-ci.org/redhat-stable/jenkins-ci.org.key
yum -y install jenkins
vi /etc/sysconfig/jenkins
 JENKINS_LISTEN_ADDRESS="127.0.0.1"
 JENKINS_ARGS="--prefix=/jenkins"
vi /etc/httpd/conf.d/jenkins.conf
 ProxyPass         /jenkins  http://127.0.0.1:8080/jenkins nocanon
 ProxyPassReverse  /jenkins  http://127.0.0.1:8080/jenkins
 ProxyRequests     Off
 AllowEncodedSlashes NoDecode
 <Proxy http://127.0.0.1:8080/jenkins*>
     Order deny,allow
     Allow from all
 </Proxy>
systemctl enable jenkins.service
systemctl enable httpd.service

SELINUX=enforcingのままで動かしたかったので

chcon -R -t httpd_sys_content_t /var/lib/jenkins/
chcon -R -t httpd_sys_rw_content_t /var/lib/jenkins/
firewall-cmd --permanent --zone=public --add-service=http

を実行して再起動し、http://server/jenkins をブラウザから
開こうとしたのだけど..

なぜか開かない..

/var/log/auth/auth.log を調べてみると


type=AVC msg=audit(1418962121.878:241): avc:  denied  { name_connect } for  pid=2129 comm="httpd" dest=8080 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_cache_port_t:s0 tclass=tcp_socket

というのを見つけた。

どうもhttpdから127.0.0.1:8080へ通信しようとしてるのを
SELINUXが弾いているようだ..

このため

setsebool -P httpd_can_network_connect true

を実行してブラウザからひらいてみたら..

..うまくいった..

SELINUX=disabledにするのは簡単だけど
パブリックIaaSとかに自動で仮想マシン作るChefとかかこうとなると
やはりenforcingで動かしたい..

ためしていないが、
yumhttpdtomcatをインストールして
jenkins.war$TOMCAT_HOME/webappsデプロイしていれば
たぶんさっくりうごくんじゃないかな
yumsetseboolしてくれているのだろう..

めんどくさいぞSELINUX..

2014年11月27日木曜日

CentOS7上のRedmine2.6.0にXLS Exportプラグインをインストールする



AWSとかの上でRedmine運用する際
SELINUXは有効にしたまま使いたくなるだろうとおもい、
CentOS7最小構成インストールしたサーバ上に
/etc/sysconfig/selinux
SELINUX=enforcing
にしたままで
Redmine2.6.0をインストールした。
Redmine以外のパッケージはすべてyum(かgem、bundle install)でインストールした。

Redmineは/opt/redmine以下にインストールした。

Redmineはapache(+passenger+ruby)で動作するWebアプリケーション
なので
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload

だけでなく
systemctl stop httpd.service
chown -R apache:apache /opt/redmine
chcon -R -t httpd_sys_content_t /opt/redmine
chcon -R -t httpd_sys_rw_content_t /opt/redmine
systemctl start httpd.service

と、アプリの入っている/opt/redmineに対して/var/www/html同様のルールをはらなくてはならない


chownしているのは、rootで操作しているためだ。
yumで導入したhttpdapacheアカウントで動作するので
rootで導入操作した後オーナを変更している。


で、プラグインをインストールする際も
この面倒な操作が必要になる。

たとえばXLS Exportをインストールする場合は


/rootにプラグインredmine_plugin_views_revisions_v001.zipredmine_xls_export-0.2.1.t6.zipをダウンロードしておいた状態で
cd /root/
unzip redmine_plugin_views_revisions_v001.zip
mv ./redmine_plugin_views_revisions /opt/redmine/plugins/
unzip redmine_xls_export-0.2.1.t6.zip
mv ./redmine_xls_export-0.2.1.t6 /opt/redmine/plugins/redmine_xls_export
cd /opt/redmine
bundle install
rake redmine:plugins:migrate RAILS_ENV=production
rake redmine:plugins:process_version_change RAILS_ENV=production
systemctl stop httpd.service
cd /opt
chown -R apache:apache ./redmine
chcon -R -t httpd_sys_content_t /opt/redmine
chcon -R -t httpd_sys_rw_content_t /opt/redmine
systemctl start httpd.service

としないと新規導入した/opt/redmine以下のファイルにアクセスできず
config.ruがどうのこうのという白い画面が出てしまう..


SELINUX=disabledにしないと、超めんどくさい..

2014年10月29日水曜日

Google Book APIを使って本のサムネイル画像を表示するJavaScriptを作る

ISBNコードを元に
本の表示の画像を表示したかったので
いろいろREST APIを公開しているサービスをみてみた。

ほとんどがアカウントを作成しないと取得できないタイプだったので
半分あきらめかけていたのだけど、
Google Book API ならセキュリティキーとか作成せずにできそうだったので
ためしてみた。

Google Book APIはISBNコードをハイフン無しのコード部分だけ
数字部13桁をGETのパラメータとして渡してやれば
JSONで情報がもどってくるしくみだ。

なのでjQuery1.11.1 (IEも対応する必要があったので..) を使って
JavaScript関数をつくり、



<script type="text/javascript">
function loadBookImage(){
 var isbnCode = $("#isbn").val();
 isbnCode = isbnCode.trim().toUpperCase().replace(/[^\dX]/gi, '');
 var googleUrl ="https://www.googleapis.com/books/v1/volumes?q=" + isbnCode;
 $.ajax({
  type: "GET",
  url: googleUrl,
  dataType: "json"
 }).done(function(json){
  var thumb = json.items[0].volumeInfo.imageLinks.thumbnail;
  if(thumb){
   $("#bookImage").empty();
   $("#bookImage").prepend("<img src='" + thumb + "'/>");
  };
 });
};
</script>



bodyタグ内に
  • id値がisbnのinputタグ(onBlurにloadBookImage()を定義)
  • id値がbookImageのdivタグ
を作って試すと、簡単に表示できた。

でも、たまにISBNコードと同じでないサムネイル画像が出る..

上記関数で1件目のサムネイル画像のみ使用しているのだけど、
候補が複数帰ってくる場合もあって
それでたまに違う画像が出てくる..

そのあたりは、もうすこし jQuery のAjax に慣れてからにしようかな..

2014年10月10日金曜日

Javaで書いたWebアプリをBluemixへデプロイする




Struts2+VelocityでMVCを、
Spring Framework でDIとセキュリティを、
MyBatisでDAOを
それぞれ使ってPostgreSQL上のデータベースの入出力させる
ごくごくふつうのアプリをEclipse上で作った。

テスト環境としてローカルにTomcatとPostgreSQLを入れて
Eclipse上からテストしているが、
Bluemixをテスト環境にすればいいんじゃないかとおもい試してみた。

Bluemixサイトにログインして、
「CATALOG」タブから「Liberty for Java」を選択
名前、URL(ホスト名だけ)、選択プランを選ぶ。
でCREATEする。

そうすると作成したサーバ(?)のダッシュボードに遷移するので
「ADD A SERVICE」を選択する。
そして「Data Management」の「ElephantSQL」を選択する。
#PostgreSQLでAWSで動いているらしい

で、App欄は先ほど作成したサーバの名前をいれ、プランを選択する。
Service name欄にはプログラム内で使っているJNDI名の"jdbc/"を
除いた文字列でCREATEする。

リスタート云々言ってくるのでOKボタンを押して再起動する。

作成したデータソースをクリックし、
Launch ElephantSQL Dashboard
を押すと、
URLが表示されるのでメモる。




そしてbluemixプラグインを入れたEclipseでサーバを作成、
同一アカウントでの接続を設定しておく。
で、Webアプリプロジェクトを作成したサーバへドラッグ&ドロップすると
ダイアログがでてくるので、先ほど作成したAppsを選択すれば
デプロイ処理をしてくれる。

当然DB上にテーブルなどを作成しなくてはならないので
ローカルのpgAdmin(PostgreSQLをローカルにインストールすると
入ってくる管理コンソール)をたちあげ
コンセントマークのアイコンを押して
先ほどメモったURLを元にプロパティタブへ入力する。

例えば
postgres://hogehoge:fugafuga@foo.bar.com:5432/tar
である場合、
ホスト欄に「foo.bar.com」
Portに「5432」※もちろんproxy環境ではつながらない
データベースメンテナンス欄に「tar」
ユーザ名欄に「hogehoge」
パスワード欄に「fugafuga」
といれ(名前などは適当に入れて)「OK」ボタンを押すと接続できる。

データベース名は「tar」でこていになっているようなので
「tar」を選択して虫眼鏡アイコンを押してSQLを押し流せば良い。




本当はよくある組合せセット(boiler plate)のなかから選べばいいのだけど、
課金されることになったらをかんがえると一つ一つ必要な物だけ選んでいくのが
いいかな、とおもう。




とうぜん、tomcat-users.xmlでBASIC認証しているような場合は
アプリとしてログインを実装する必要がある。


簡単ではあるけど、SSLトンネリングとかの設定しないと
開発環境としてはめんどくさい。
なによりステップ実行できるわけではないし...

とりあえず、JNDI名で実装しとけばDBにはつながることが分かっただけでも
よしとしよう。

2014年9月9日火曜日

ISBNコードのチェックサム判定するJavaScript関数をつくってみた


ISBNをJavaScriptで扱わないといけなくなり、
チェックサム判定の関数と
ハイフン付き形式にする関数を
ISBN10とISBN13それぞれでつくってみた。
あとISBN10をISBN13にする(978を先頭につけてチェックサムを計算しなおす)関数
もつくってみた。


function isValidISBN (target) {

 var targetCode = target.trim().toUpperCase().replace(/[^\dX]/gi, '');
 if(targetCode.length == 10){
  return isValidISBN10(targetCode);
 };
 targetCode = target.trim().toUpperCase().replace(/[^\d]/gi, '');
 if(targetCode.length == 13){
  return isValidISBN13(targetCode);
 };
 return false;
};

function toISBN13(isbn10){
 var modulas = 10;
 var weight = 3;
 var targetCode = isbn10.trim().toUpperCase().replace(/[^\dX]/gi, '');
 targetCode = "978" + targetCode;
 var checkSum = 0;
 var chars = targetCode.split('');
 for (var i = 0; i &t; (chars.length-1); i++) {
  if( (i % 2) == 0 ){
   checkSum += parseInt(chars[i]);
  }else{
   checkSum += ( weight * parseInt(chars[i]) );
  };
 };
 checkSum = modulas - (checkSum % modulas);
 var isbn13 = "";
 for(var i = 0; i &t; (chars.length-1); i++){
  isbn13 = isbn13 + chars[i];
 };
 isbn13 = isbn13 + checkSum;
 return isbn13;
};

function isValidISBN13(isbn13){
 var modulas = 10;
 var weight = 3;
 var targetCode = isbn13.trim().toUpperCase().replace(/[^\d]/gi, '');
 if(targetCode.length!=13){
  return false;
 };
 var checkSum = 0;
 var chars = targetCode.split('');
 for (var i = 0; i &t; (chars.length-1); i++) {
  if( (i % 2) == 0 ){
   checkSum += parseInt(chars[i]);
  }else{
   checkSum += ( weight * parseInt(chars[i]) );
  };
 };
 checkSum = modulas - (checkSum % modulas);
 return (checkSum == (parseInt(chars[chars.length-1])));
}

function isValidISBN10(isbn10){
 var modulas = 11;
 var weight = 10;
 var targetCode = isbn10.trim().toUpperCase().replace(/[^\dX]/gi, '');
 if(targetCode.length!=10){
  return false;
 };
 var checkSum = 0;
 var chars = targetCode.split('');
 for (var i = 0; i &t; (chars.length-1); i++) {
  checkSum += ( weight * parseInt(chars[i]) );
  weight--;
 };
 checkSum = modulas - (checkSum % modulas);

 var actualCheckSum = 10;
 if(chars[chars.length-1] != "X"){
  actualCheckSum = parseInt(chars[chars.length-1]);
 }
 return (checkSum == actualCheckSum);
}

function formatISBN(target){
 if(isValidISBN10(target)){
  return formatISBN10(target);
 };
 if(isValidISBN13(target)){
  return formatISBN13(target);
 };
 return target;
};

function formatISBN13 (isbn13) {
 var chars = isbn13.toUpperCase().trim().replace(/[^\d]/gi, '').split('');
 var reformedIsbn13 = "";
 for(var i=0; i&t;chars.length; i++){
  if( i == 3 || i == 4 || i == 7|| i == 12){
   reformedIsbn13 = reformedIsbn13 + "-";
  };
  reformedIsbn13 = reformedIsbn13 + chars[i];
 };
 return reformedIsbn13;
};

function formatISBN10 (isbn10) {
 var chars = isbn10.toUpperCase().trim().replace(/[^\dX]/gi, '').split('');
 var reformedIsbn10 = "";
 for(var i=0; i&t;chars.length; i++){
  if( i == 1 || i == 5 || i == 9){
   reformedIsbn10 = reformedIsbn10 + "-";
  };
  reformedIsbn10 = reformedIsbn10 + chars[i];
 };
 return reformedIsbn10;
};


ISBN10はもうつかわれないので、
入力された場合はやはりISBN13にしてあげたほうがよいとおもい
変換する関数も作った(もとに戻す関数はつくっていない)。

やはりDBとかにはISBN13で統一して入れておいたほうが良さそうだし..

にしても..JavaScript直書きはデバッグしにくいなあ..
みんなどうやってるのかなあ..




使う場合はat your own riskでお願いします。

Google Colab相当の環境をローカルPC上のDocker Composeで実現する

 Docker Composeの有料版に、お金を払いたくない ^H^Hが使えない ため古いゲーミングPC(GeForce3080)にDocker Composeを入れてその上のコンテナでGoogle Colab相当のノート操作ができないかためしてみた: コンテナイメージとして a...