DockerベースのWeb開発環境の作成

猫の下で、 DockerFigDNSMasqnsenterに基づいたWeb開発環境の自動作成と展開をどのように改善したかを説明します。 実際、これはLAMPサーバーの展開であり、DNSMasqに記録しますが、優先順位は、ホストマシン上のWebサーバー、DBサーバー、実行するコマンドの最小数などの不要なソフトウェアでホストマシンが詰まらないことです。

まえがき


前回の記事http://habrahabr.ru/post/236573/で、 VirtualBoxに基づいたWeb開発用のクイックデプロイメント環境を整理する方法について話しましたが、同時に、経験豊富なhabrausersからDockerに目を向けるよう勧められました。 その後、その男を開いて実験を開始し、 PHPの異なるバージョン( 5.3、5.4、5.5 )の3つのコンテナーを自分で収集しました。 将来的には、ブートストラップスクリプトをより健全な言語で書き直し、なんとかしてこれをすべて整理し、男を書きたいという要望がありました。 しかし、いつものように、手はこれに届かず、クリスマスイブにドッカーのホームディレクトリを誤って削除してしまった場合は、おそらく到達しなかったでしょう。 はい、そうです。 最終的に、すべてが書き直され、再編成され、 GitHubにアップロードされました

何が必要ですか?


  1. Docker.IO( https://www.docker.com/
  2. fig( http://www.fig.sh
  3. DNSMasq( http://www.thekelleys.org.uk/dnsmasq/doc.html
  4. nsenter( https://github.com/jpetazzo/nsenter


何が起こっているの?


figを使用してスクリプトから起動すると、必要なすべてのコンテナーが展開され、リンクされます。 その後、データベースダンプのあるファイルが指定されている場合、ダンプはコンテナ内に作成されたデータベースに注がれます。 次に、コンテナエントリがDNSMasq構成に追加され、デーモンが再起動します。
スクリプトを使用してシャットダウンすると、データベースがファイルにダンプされ、 DNSMasq構成からのレコードが削除され、デーモンが再起動します。

設定方法は?


必要な最小DNSMasq構成:
 # cat /etc/dnsmasq.conf | grep -E -v '^(#.*)?$' listen-address=127.0.0.1 

これらすべてが機能する.efigに、 https://github.com/dvapelnik/efigリポジトリのクローンを作成し、そこにある.efigフォルダーを探します。これをプロジェクトフォルダーに配置します。 このフォルダにはすでに次のものがあります。
  1. logs -Webサーバーログのディレクトリ
  2. xd_profilexd_trace -XDebugファイル用の2つのディレクトリ
  3. db展開とバックアップ用の2つのスクリプトを使用してデータベースを操作するためのディレクトリ
  4. efig.yml -figの構成
  5. efig.conf -efig自体の構成
  6. httpd.conf -apache2 config
  7. efig.shするefigスクリプト自体

efig.yml 、データベース名、データベースのユーザー名、およびパスワードを指定する必要があります。 必要に応じて、テスト用のデータベース。 データベースを正しくデプロイしてダンプバックするには、データベースの名前がダンプ付きファイルにどのように関連付けられているかを示す必要があります。
E_DB_DUMPメインデータベースのファイル名
E_DB_NAMEメインデータベース名
E_DB_TEST_DUMPテストデータベースファイル名
E_DB_TEST_NAMEテストデータベース名

テストデータベースが不要な場合は、最後の2行でコメントし、テストデータベースの名前を変数DB_NAMEから削除できます。 ダンプのあるファイルは、 dbフォルダーに関連して検索されます。
アプリケーション用にhttpd.conf構成します。
次の値がefig.conf指定されていefig.conf
PROJECT_NAMEプロジェクト名( URLで使用されます
FIG_CONFfig設定名
SUBDOMAINS_ENABLED各コンテナにサブドメインを作成するかどうか
DNS_ZONEプロジェクトのDNSゾーン、元は.doc使用
MAIN_CONTAINER_NAMEメインコンテナの名前、最初はwebfig configから取得)
DB_CONTAINER_NAMEDBコンテナの名前、最初はdbfig configから取得)
DNSMASQ_CONFIG_PATHDNSMasq構成へのパス

SUBDOMAINS_ENABLEDの補足
たとえば、データベースコンテナにアクセスするには、ドメイン名(たとえば、 http://db.myproject.doc/を使用します。IPではなく、起動するたびに常に変更されます)。


そして今 これらすべての設定、フォルダー、およびスクリプトを使用して、離陸しようとします 走ってみる


離陸するには、 .efigフォルダーに移動し、 sudo介してスクリプトを実行する必要があります。
 sudo ./efig.sh 

この時点で、コンテナが起動され、データベースが/etc/dnsmasq.conf新しいコンテナに関するエントリが/etc/dnsmasq.confに追加され、デーモンが再起動します。 その後、ブラウザhttp://project.doc/のリンクを安全にたどり、すでにブラウザにあるプロジェクトを確認できます。
コンテナーを無効化して削除し、データベースをバックアップするには、同じフォルダー( .efig )で次のように書き込みます。
 sudo ./efig.sh rm 

データベースはファイルにダンプされ、コンテナは停止して削除されます。すべてが意図したとおりにクリーンです。

コンテナにはどのイメージを使用する必要がありますか?


Webコンテナーとして、均一に構成されたイメージを使用することをお勧めします(以前のバージョンのPHP5.3、5.4、5.5、5.6 )を備えたDebian / Ubuntuに基づくイメージはDockerHubで入手できます)。 PHPのパッケージは、必要なYiiFramework(1、2)を考慮して選択されました。必要に応じて、開発に必要な他のパッケージを追加できます。 dbコンテナーとして、sameersbnのイメージを使用します。

そして練習する?


たとえば、同じJoomla CMSをデプロイしようとすることができます(最初にCMSとして発生しました。これはデプロイが簡単で、データベース自体を生成します)。
  1. efigからefigする
  2. Joomla CMSアーカイブを取得する
  3. 開梱
  4. Joomla CMSを .efigして.efigをフォルダーにコピーします
  5. .efig/efig.ymlデータベースのパラメーターを指定します
  6. このビジネスを開始しますcd .efig/ && sudo bash ./efig.sh
  7. 人生を楽しむ 見る/設置する
  8. cd .efig/ && sudo bash ./efig.sh rm


過去、現在、未来?


少なくとも、起動する場合のみ、アプリケーションの展開を簡素化するために、これは自分用に書かれています。 誰にもわからないが、どこかに新しいサブドメインを作成してそこにファイルをアップロードしたり、別のプロジェクトにサブフォルダーを使用したりするのは面倒だ。 さらに、 PHPの 4つのバージョンすべてが必要でした。 要求と私のニーズとして、私はすでにそこにあるものを終了します。 PostgreSQLのサポートを台無しにするつもりですが、まだ自分で使用していないので、 台無しにしませんでした。 スクリプトはUbuntu OSで実行されましたが、他のLinuxディストリビューションに問題があるとは思いません。 他の配布の確認はできませんでした。

リンク?


  1. GitHubのプロジェクトリポジトリ: https : //github.com/dvapelnik/efig
  2. GitHub上のDockerのイメージリポジトリ: https : //github.com/dvapelnik/docker-lap
  3. DockerHub上のDockerの イメージリポジトリ: https : //registry.hub.docker.com/u/dvapelnik/docker-lap/


落とし穴?


  1. データベースダンプがなく、データベースがそれ自体で生成された場合(移行、 Joomla CSMなどのデプロイメントなど)、コンテナーが切断されると、データベースはダンプされますが、 rootとしてダンプされます。 これは、コンテナでは、ダンプが実際にはコンテナルートの下にあるためです。 開始する前に、シャットダウン時にデータベースがダンプされる空のファイルを作成できます-これはそのような回避策です。 Webコンテナーでの同様の状況。 コンテナにフォルダをマウントすると、コンテナから作成されるすべてのファイルがルートによって作成されます。 使用した回避策について説明します。ユーザーとしてUIDとGIDを持つロバユーザーがコンテナ内に作成され、その下で開発を行います。 ユーザーのUIDとGIDが1000と異なる場合は、対応するDockerfileを取得して、ユーザーのUIDとGIDをそこに置き換えて、イメージを再構築する必要があります。 e-データベースイメージの場合、これは特に重要ではありませんが、ダンプするときは横向きにクロールします。 そんな松葉杖だから。
  2. 合理的な疑問が生じます。コンテナ内のデータベースにアクセスする方法は? すべてのSUBDOMAINS_ENABLEDコンテナのドメイン名を作成するオプションを作成したのは論理的であり、そのためだけです。 フラグが1に設定されている場合、すべてのコンテナに対して、フォームのDNSMasq構成に記録することによって作成されます CONTAINER_NAME.PROJECT_NAME.DNS_ZONE CONTAINER_NAME.PROJECT_NAME.DNS_ZONE コンテナは、データベースにアクセスするためのポートを吐き出し、このドメイン、ポート、およびefig.confに登録されたユーザーデータを使用してアクセスできます。

Source: https://habr.com/ru/post/J247547/


All Articles