4D-jp 4D Japan Technical Support Team

“Docker上の4D”

2020-02-18
アヨブ・カリ

Docker上で4Dを使う方法の紹介です。(原文

はじめに


2012年に市場に登場して以来、Dockerは最も急速に成長したテクノロジーの一つとなっています。多くの開発者やシステム管理者にとって、Dockerは最も急速に成長したテクノロジーの一つとなっています。多くの開発者やシステム管理者にとって、Dockerはあらゆるツールチェーンに欠かせない存在であることは間違いありません。そのユーティリティーが変化し、あらゆるプロファイルやニーズに適応しているからです。開発者は、最終ユーザーのシステムがどこで実行されるかを気にすることなく、コードの記述に集中できると同時に、最終アプリケーションの一部としてDockerコンテナで動作するように設計された既存のプログラムを使用することで、時間的なメリットを得ることもできます。DevOpsエンジニアは、Dockerを実装することで、必要なシステムの数を減らすことができるため、フレキシビリティ、共有性、コスト効率の面でもメリットがあります。

このテクニカルノートでは、Dockerツールを紹介し、インストールと設定の手順、Dockerコマンドを使用してDockerハブとコンテナを操作する様々な方法を一から説明します。

概要


Dockerは、コンテナを使用してアプリケーションの作成、運用、実行を容易にするために設計されたツールです。主にLinux用に開発され、Windowsシステムでも動作します。コンテナを使うことで開発者は、ライブラリーや従属物など、アプリケーションに必要な全てのパーツをパッケージ化した、カスタムアプリケーションのエコシステムを構築することができます。コンテナが作成されると、ターゲットマシンのカスタム設定に関係なく、開発者は自分のアプリケーションを(コンテナの種類によって)任意のLinuxまたはWindowsマシンで実行できることに安心できます。物理サーバーのリソースをスライス、あるいはダイスにカットする仮想マシンとは異なり、Dockerはオペレーティングシステムを使用して同じスライシング操作を実行するため、全てのコンテナに独自のプロセスIDとファイル・システムが割り当てられます。要するにDockerは、仮想オペレーティングシステムを作成し、それをアプリケーションが実行できるコンテナに割り当てるコンテナ・エンジンなのです。これにより、アプリケーションは実行中のシステムと同じカーネルを使用できます。

Dockerのアーキテクチャー


図 1 :

Dockerエンジン

Docerエンジンは、Dockerシステム全体の主要なパートです。クライアント/サーバー・アプリケーションは3つの主要なコンポーネントから成るホストマシンにインストールされます:

サーバー:”dockerd”と名付けられます。Dockerイメージ、コンテナ、ネットワークを作成、管理するDocker daemonです。

Rest API:Docker daemonを管理し、タスクを指示するのに必要です。

コマンド・ライン・インターフェイス:Dockerコマンドを入力するのに使用されるクライアント。

Dockerクライアント

Dockerユーザーはクライアントを経由してDockerと相互通信します。それはどこで実行されたとしても、各Dockerコマンドを”dockerd”daemonに送ります。

Dockerレジストリ

創作されたDockerイメージは全てこれらのレジストリに保存されます。Dockerハブの中で公的に管理されることも、私的に管理されることも可能です。Doker pull、runあるいはpushのいずれを使っても、要求されたDockerイメージは決められたレジストリにpullあるいはsentされます。

Dockerライフサイクル


図 2 :

イメージ

簡単に言うと、Dockerイメージは命令のリストを持つ読み取り専用のプレートであり、一度実行されるとDockerコンテナを作成します。Dockerイメージは、Dockerハブ(レジストリ)から取り出して直接利用することも、Dockerfileを使って作成することもできます。Dockerfileは拡張子のない単純なファイル名(名前付きDockerfile)で、コンテナを作成して実行するために必要な命令の全てが含まれています。Dockerイメージは多層化されているので、ベースレイヤとトップレイヤがあります。基本イメージは通常読み取り専用ですが、最上位レイヤは書き込み可能です。

コンテナ

コンテナが作成され、適切なコマンドを使用して実行されると、事前に構成された全てのアプリケーションがそのコンテナ内で実行されます。1つのイメージから、複数のDockerプラットフォーム上に複数のコンテナを作成することが可能です。

ゲスト・オペレーティング・システムを起動する必要がないため、コンテナはホストマシン上でサイレント・プロセスを実行し、非常にパフォーマンスが高く軽量です。

ボリューム

Dockerで作成され、コンテナで使用されるデータはボリュームに保存されます。全てのデータをコンテナの書き込み可能なレイヤに保存するのではなく、ボリュームを使用する方がずっと便利であることが証明されています。ボリュームはコンテナのライフサイクルのコンテキスト外に存在するため、ボリュームを介してデータを保存すると、コンテナの軽量化に役立ちます。

Dockerのインストール


最初のステップはDockerhubにアカウントを作ることです:https://hub.docker.com/

サインアップをクリックして、自分の情報を入力します。完了したらEメールの有効化に進みます。

図 3 :

  1. Dockerインストーラーをダウンロード。 図 4 :

  2. インストーラーを開始し、当面デフォルトのオプションをキープしながらウィザードに従って作業します。

  3. ターミナルを開いて、インストールが成功しているか確かめるために以下のコマンドをタイプします: docker version

Dockerを4Dに統合する


コンテナ化の利点

図 5 :

仮想マシンは、リソースの使用量が原因で多くの場合非常にコストがかかり、パフォーマンスが低下するのですが、それが不要となるアプリケーションのコンテナ化は、OSレベルの仮想化メソッドです。仮想マシンに対抗するために、このメカニズムを選択することで、1つのOSカーネルにアクセスする1つのホスト上で複数の独立したアプリケーションやサービスを実行できるため、とても有用であることが判明しました。

コンテナには、従来のコンテナに比べて多くの大きなメリットがあります。次の項目を確認してください:

  どこでも運用:コンテナは仮想上のどこでも動作可能です。Windows、Linux、あるいはmacOSではVM上で運用でき、データセンターやクラウドでも運用できます。

  一貫性:十分にコントロールされた予測可能な環境を作成するのはとても複雑ですが、コンテナは他のアプリケーションから適切に分離して依存関係を管理するため、コンテナであれば複雑にはなりません。

  一定のレベルのセキュリティ:セキュリティ・スキャナはコンテナ内のアプリケーションを保護しないので、コアのOSから分離されていないことはセキュリティ上の脅威をもたらしますが、コンテナ化はコンテナを考えられたレベルに分離するため、セキュリティ上の利点をもたらします。

コンテナ化と4D

4Dデベロッパーはこのコンセプトの恩恵を受けられます。なぜなら統合が簡単で、本番環境に重要な利点があるからです。以下の利用例では、前提条件から始めて、データとは別にコンテナで4D Serverを運用する方法を詳細に説明しています。

4Dの前提条件

4DをDockerで操作するために、以下の推奨に適合するかを確認してください:

  ・ データベースのスタートアップからトレースやウィンドウを削除

  ・ コンテナからはGUIが表示されないので、ライセンスはすでに登録されている必要があります。

  ・ 簡単にするために、ライセンスを埋め込んだサーバー・スタンドアロン・アプリケーションを生成するのは有効です。4D Serverでデータベースを開くこともまだ可能です:

さらなる前提条件は、コンテナの中でGUIアプリケーションを使う必要がある場合に追加可能です:

  ・GUIを表示するためにホストマシン上のVNCクライアント+コンテナ上にVNCサーバーをインストール

  ・Xサーバー(XはX Windowsシステム表示サーバーの標準的な名称)

デモ:4DサーバーとDocker


イメージとコンテナ

Dokerをインストールして、ダブルクリックします。Dockerが完全にブートアップするのを待ちます。新しいフォルダを作成し、拡張子なしの”dockerfile”に新しいファイル名をつけます。新しく作成されたファイルはイメージを作成するために必要な”スクリプト”を含んでいます。Dockerフォルダの内部では、データベースを含む”database”フォルダ、ライセンスの”license”フォルダ、最後に4D Serverの複製の”4d_server”フォルダが作られます。

特記1:4D Serverをダウンロードしてコンテナ内に直接インストールすることも可能ですが、ここで使うメソッドの方がシンプルです。

最初にコンテナ化するデータベースを選択し、Dockerフォルダ内の”database”フォルダにコピーします。それからライセンスも同じようにします。両方のデータベースと4d_serverフォルダは”content”という名称のフォルダに配置されます。

最終的にDockerフォルダは以下のようになります。

図 6 :

ステップ1:dockerfileスクリプトのタイプ入力

実行したらスクリプトは以下のようになります:

 1. システムからWindows 10イメージをダウンロード。イメージが見つからない場合は、Dockerhubから入手します。

 2. 以下のパスを持つ作業用のディレクトリをコンテナの内部に作成します。C://application

 3. ホストから4d_serverとデータベース・フォルダをコンテナの作業ディレクトリに複製します。Licensesフォルダのコンテンツは、ライセンスを取るのに使用した4Dディレクトリ、C://ProguramData//4D//Licenses、にコピーされます(パス内のフォルダのリストが作成されます)。

 4. コンテナ内部のエレメントと通信するのに必要なポートを指定します。

 5. 4D Serverで選択したデータベースを起動します。

これらのステップは以下のように翻訳されます:

図 7 :

各スクリプト行をより詳細に見ていきましょう:

1. From mar.microsoft.com/windows:10.0.18362.418 : Dockerhubで有効なイメージウィンドウ:10.0.18362.418からレイヤを作成します。これはコンテナを走らせる基本イメージとなります。hubからイメージを取るために以下のステップを実行しましょう:

  ・次のURLを開きます:https://hub.docker.com/

  ・検索バーに必要なイメージの名前をタイプします。これがWindowsイメージになります(全てのOSイメージが可能です)。

  ・リストから、プロジェクトに最も合うイメージを選択します。

  ・入力したら、スクロールダウンしてタグをチェックします。このケースでは、私たちのホストのWindows10バージョンに適合するので 18362.418タグが選択されています。(ホストのOSバージョンをチェックするには、cmd dxdiag を実行します。)このケースでは間違ったタグの選択は動きません。

特記:公式な、Dockerが承認した、あるいは有効なパブリッシャーのイメージを選択して、セキュリティの問題を回避することを忘れないでください。

図 8 :

2. WORKDIR C://application : Workdir は、dockerfile内でフォローする各RUN、CMD、EMTRYPOINT、COPYそしてADDインストラクションの作業ディレクトリを設定します。Workdir では絶対パスを使用することをお勧めします。

3. ADDコンテンツ ./ :複製と同様に、コンテナの中にローカルファイルを複製します。

4. EXPOSE 19813:エクスポーズ・インストラクションは、通信用にコンテナが使用するポートを指示します。私たちの場合は、19813(アプリケーション・サーバー・ポート)と8080(webサーバーにアクセスが必要な場合)です。

5. CMD[“c://application//4d_server//4D_Server.exe”, “c://application//plgn_area_creator_component.4dbase//plgn_area_creator_component.4DB”]: cmdインストラクションはイメージを使ったコンテナの中のアプリケーションの実行に使用します。このケースでは、4D Serverと選択したデータベースになります。エレメントへのパスはローカルではなく、コンテナ内です。従いまして、提供されるローカルパスでは使えません。

図 9 :

Dockerfileが完成したら、その中のインストラクションを実行してカスタムのローカルイメージを作成するのが、自然な流れです。ただしその前に、イメージがWindowsイメージであり、DockerがデフォルトでLinuxコンテナを使用しているため、小さな構成が必要です。これを修正するには、通知バーにあるDockerのアイコンをクリックし、「Windowsコンテナに切り替える」を選択します。この操作には数分かかる場合があります。

ステップ2:イメージの作成

イメージを作成するには、dockerfileが含まれるフォルダの中であることを確認する一方で、下記のコマンドを実行します:

Docker build-t autoit_img. :このコマンドは二つのエレメントからDockerイメージを構築します。その一つ、dockerfileにはインストラクションが含まれていて、もう一つの”context”は、特定のPath/Urlの中に配置されたファイルのセットとして定義されます。-t パラメータはイメージのカスタム名を特定するのに使われます。<p class="quote"> ”.”はパラメータであることに注意してください。</p>

特記:このイメージは”latest”としてタグ付けされています。それがDockerの異なるイメージ・バージョンの管理の仕方です。

ステップ3:コンテナを作成

一般的なイメージを使ったコンテナの作成と実行:

docker run -name autoit_conta -d -it autoit_img:

図 10 :

このインストラクションは、-nameフラグで指定された名前のコンテナを作成し実行します。 -d オプションは、 コンテナがdetachedモードで起動することを意味します。これは、コンテナの実行に使用されたルートプロセスが終了するとすぐに終了することを意味します。

特記:docker runが実行されると、dockerファイルから最後のCMD命令のみが実行されることに注意してください。この場合は、4D Serverの起動に使用されます。

コンテナがアップされて実行されていることをチェックするには、以下のコマンドを使います:

図 11 :

表示されたリストは、実行中のコンテナ、使われたイメージ、使用されたポート、コンテナの名前とIDのリストです。

(cmd経由で)Dockerに含まれるエレメントを見るには、以下のコマンドを使います:

docker exec -it autoit_conta cmd.exe :

図 12 :

このコマンドは実行中のコンテナで新しいコマンドを実行します。実行中の場合はコンテナのプライマリプロセスとしてのみ実行され、コンテナを再起動しても再起動しません。この場合、実行されるコマンドはcmd.exeで、コンテナ内のコマンドラインを開きます。 -it フラグは、コンテナがインタラクティブモードで開くことを示します。

実行に成功すれば、コンテナのアクティブなタスクを表示します:

図 13 :

4d_server.exeがアップされて実行されていることに気づくでしょう。4Dクライアントは、コンテナのIP経由でホストマシンからコンテナのサーバーへ接続できます。以下のメソッドのひとつを使ってコンテナのIPを得ることができます。

Docker exeコマンドを実行。コンテナの中でシンプルなipconfigを実行します。

ホストから次のコマンドを実行:Docker inspect autoit_conta。このコマンドはコンテナの情報のリストを表示します。”Networks”からIPアドレスをチェックします:

図 14 :

ボリュームの導入

Dockerボリュームを実装することは、コンテナによって作成され、利用される永続的なデータを扱う最も効率的な方法の一つである。この場合は、データベースのフォルダから .4DDファイルとインデックスを削除し、それらを個別のボリュームに配置します。 ボリュームには多くの利点もあります。

・ボリュームは、LinuxコンテナとWindowsコンテナの両方に実装できます。

・ボリュームは簡単に管理でき、多数のコンテナ間で安全に共有できます。

・コンテナから新しいボリュームを事前設定できます。

・ボリュームは、コンテンツを保護した状態でリモートホストまたはクラウドプロバイダに保存できます(暗号化)。 この機能を実装するには、コンテナを停止して削除する必要があります。再実行中に実行しないと、次のエラーが表示されます。

図 15 :

これを修正するには、以下のコマンドを実行します:(進める前に、”exit”を実行して)インタラクティブモードを終わらせたことを確認します。)

 ・Docker stop autoit_conta : コンテナの実行を止める。

 ・Docker rm autoit_conta : コンテナを削除する。

 ・Docker rm autoit_img : イメージを削除する。

データファイル (.4DD)をデータベースの他の部分+インデックスから分離するために、照合およびジャーナルファルは、データベースのフォルダからdataという名前のdockerfileの近くの新しいフォルダに、前述の全てのファイルを切り取って貼り付けます。

次に、コンテナへのエントリポイントとして機能する「execute_4d.bat」という名前の新しいファイルを作成します。これは、このファイルがCMDとしてdockerfile内で実行されることを意味します。新しい.batファイルは、ボリューム上のデータファイルを認識するのに必要なストラクチャーやデータファイル・パスなどのパスを渡して4D Serverを実行します。 フォルダは次のようになります:

図 16 :

最新の修正に対応するためにdockerfileとexecute_4d.batを修正します:

図 17 :

ADD execute_4d.bat: . bat ファイルをホストから直接作動するコンテナへ複製します。

CMD c://application//execute_4d.bat : .batファイルを実行。

execute_4d.bat :コンテナの中にある正しい4DBと4DDファイルを使って4D Serverを開き、外部からデータベースにアクセスできるようにします。

新しいコンテナを新しく作成したボリュームと共に走らせるために、以下のコマンドを実行します:

図 18 :

図 30 :

docker run -it - -name autoit_conta -v c://Users/Ayoub/Desktop/docker/data:c/data autoit_img: これは、ボリュームのローカルパス(フォルダ)とコンテナ中に作成された新しいパスを指定するために使用される新しいフラグ “-v” を除いて、同じDocker run コマンドです。

特記:(Docker exeコマンドを使って)コンテナの中に入ると、作成されたフォルダやファイルを見ることができ、全てが(デバッグ目的で)期待通りに動作することを確認できます。以下のスクリーンショットは、コンテナ内で dirコマンドを実行した結果を示しています:

図 19 :

ブラウザで “container_jp_address” : “exposed_port”を実行すると、4D Serverのデフォルトのホームページが表示されます。これはdockerfileに「8080」を表示し、4D Serverが起動時に8080を関連ポートとしてWebサーバーを起動するように設定したためです。

図 20 :

Dockerイメージの共有

Dockerイメージが Dockerサーバーによって構築されると、イメージのコンテンツから直接派生したIDが割り当てられます。英数字IDの画像を参照するのは不便です。代わりに名前とタグが優先され、-tフラグ、ターミナル、またはdockerfile内で使用できます。作成されたイメージはサーバーキャッシュに置かれます。イメージを共有するために、Dockerエコシステムはレジストリ(Dockerハブの例)のコンセプトに依存しています。画像のプルとプッシュ機能を提供するWebサービスがあります。作成したイメージを共有できるようにするには、最初にレポジトリを作成します。

https://hub.docker.com/ にサインインして、レポジトリをクリックします。

図 21 :

“Create Repository”をクリックして詳細を記入して進めます。確実にビジビリティをprivateに設定します。

ターミナルに戻って、Dockerログインコマンドをタイプ入力し、詳細を記入して進めます。

図 22 :

これで、作成されたイメージをビルド・サーバーからリモート・レジストリにプッシュすることができます。そのためには、まずDockerハブの新しいレポジトリに関連付けられた新しい名前を以下のコマンドで指定します:

docker tag local_image_name repo_user_name/repo_name

図 23 :

これでイメージがプッシュされ、共同作業者が使用できるようになり、dockerハブを介して追加できるようになります。同様に、イメージは、直接docker pullコマンドを使用するか、fromコマンドを使用してdockerfileから呼び出すか、またはDocker runコマンド中でパラメータとして呼び出して取得することもできます。

GU経由のDocker


ターミナルを通してコマンドを使ったり、目を細めたりする煩わしさを避けたい人のために、簡単なGUIの選択肢が残されています。しかし、このソリューションは完全とは言えず、遭遇する問題の多くを解決できないのですが、コンテナを作成、削除、管理するためのシンプルで利用可能な方法として残っています。多くのソリューションが市場に出回っており、KitematicはDockerにバンドルされたレガシーソリューションであるため、最初の選択肢でした。ツールをインストールするには、通知パネルの下にあるDockerアイコンをクリックし、Kitematicを選択します。ダウンロードプロンプトが表示されます。インストールが完了したらツールを起動します。

このインターフェイスではDockerハブの公開イメージを直接検索して使用することが可能です。また、すでに作成されているコンテナやイメージを直接選択して表示したり、新しいコンテナを作成したり、古いコンテナを管理することもできます。

図 24 :

基本的なコンテナ作業によって、ボリュームを作成したり影響を与えたり、ネットワーク設定の構成など、GUIインターフェイスを使用して容易に管理できるようになります。インタラクティブモードが少々使いにくいとしても、開発者やDockerユーザーにとっては、Dockerをターミナル経由で使用することが望ましいソリューションであることに変わりはありません。

図 25 :

終わりに


このテクニカルノートでは、Dockerアーキテクチャーとその機能に関する一般的な情報に加えて、特定の4Dコンテキストと使用方法に合わせた必須の設定と微調整について、詳細なステップバイステップのデモが提供されています。

4Dユーザーが遭遇する可能性のある基本的なDockerコマンドの大部分は、現実的なシナリオで使用するために用意されたものです。しかし、Dockerの奥深くに入り込み、知識を広げることに意欲的な開発者のために、より高度なコマンドが数多く提供されています。一度マスターすれば、時間とパフォーマンスの両面で効率的であることが証明された、新しい興味深い操作を試すことができまます。

資料


Dockerコマンド: https://docs.docker.com

Docker VolumeをWindows上で管理する方法:https://adamtheautomator.com と https://towardsdatascience.com

Windows上のDockerコンテナの中で4D Serverアプリケーションを運用する: https://taow.4d.com/Deploying-a-4D-server-application-in-a-docker-container-on-Windows/tips.178214087.en.html

Dockerの利点トップ10:https://dzone.com

技術的な問題と解決方法: https://forums.docker.com と https://stackoverflow.com

Dockerを使い始める: https://www.pluralslight.com

Dockerを使った基本的なネットワーク:https://runnable.com

Dockerビルド: Dockerイメージの初級ガイド: https://stackify.com