dockerについて継続的に何か書くと約束しました。私はCØでローカルのlinuxカーネルを持っている幸運な人間なので、ローカルのデスクトップですべてのプロジェクトを管理する方法について、いくつかの記事を書こうと思います。
なぜ純粋なLXCではなくdockerなのですか?
数年前、私がまだAdcloudにいた頃、私はすべての構築するためにLXCを使い始めました。 私はデスクトップでArchlinuxを使っていて、それはかなりうまく機能しているのですが、本番環境はUbuntuで、chefスクリプトを使ってコンテナを作成することがあります。コンテナには独自のDNSドメイン名、IPアドレス、SSHサービス、すべてのディスクファイルバインディングがあります。そのため、新しいプロジェクトを始めるときはいつも、まずSSH経由でコンテナにログインしてからでないと作業を始めることができません。実際、私はChefが全く好きではなかったので、Adcloudを去った後、Chefを捨ててBabushkaを使い始めました。後者はスタンドアロン環境をデプロイする最も簡単な方法でしたが、新しいコンテナを作成するのに時間がかかり、すべてのコンテナを立ち上げるとSSDのディスクスペースを大量に消費し、複数のサービスを手動で設定しなければなりませんでした。
Dockerコンテナを初めて起動したとき、その速さに驚きました。
コンテナはマシンと同じではありません
まずはgithubのDockerfileを見てみましょう。
以下のエイリアスを持つコンテナでgoを開始し、後でコンテナを削除します:
alias go="docker run --rm -t -i teemow/go" 
異なるタグを使って異なるバージョンのgoを実行することもできますが、実際に動作させるにはもう少し手間がかかります。カレントディレクトリのバインディングをコンテナにマウントして、go getなどを実行できます。
alias go="docker run --rm -t -i -v \$(pwd):\$(pwd) -w \$(pwd) teemow/go" 
プライベートな git リポジトリがある場合は、現在の ssh エージェントをコンテナにマウントすることもできます:
alias go="AGENT=\$(ls -1 --sort t /tmp/ssh-*/agent.* | head -1) && docker run --rm -t -i -v \$AGENT:\$AGENT -e SSH_AUTH_SOCK=\$AGENT -v \$(pwd):\$(pwd) -w \$(pwd) teemow/go" 
GOPATHのような環境変数もコンテナに渡すことができます。
この作業はすべて自分のツールで行うことができるので、ホストはクリーンな状態になります。Imageの異なるバージョンにタグを付けることを忘れないでください。rbenvのようにプロジェクトにタグをつけるといいかもしれません。私は、npm、grunt、coffee-script、aws-cli、tugboatなどのツールを含む一連のImageを作成しました。
Pro tip: エイリアスを使いすぎないこと、そして可能な限り /usr/local/bin/ のような小さなスクリプトを使うことをお勧めします。
Docker レゴ。
プロジェクトを複数のコンテナで実行またはテストしたい場合は、前述のエイリアスを使用してプロジェクトをビルドします。Webサービス、postgres、redisを同じコンテナで実行することはできません。各サービスはそれぞれ独自のコンテナを持つ必要があり、あとはすべての「レンガ」をまとめるだけです。
Dockerには「リンク」と呼ばれる機能があります。リンクされたコンテナは、環境変数経由で自分自身をインポートするので、他のコンテナはリンクされたコンテナへのIpアドレスとインターフェイスを発見することができます。Herokuも同様のアプローチでプラグイン情報を追加しています。
しかし、使えばこれを簡単にすることができます。fig.ymlファイルをプロジェクトに追加し、figを起動して環境全体をオンにするだけです。ローカルディレクトリはコンテナにバインドされ、ファイルが変更されるとファイルモニタが自動的にサービスを再起動します。fig.yml ファイルを追加しました。
実際、fig自体もローカルマシン上のコンテナで動作しています。しかし、docker socket serviceをfigのコンテナにバインドして、他のコンテナを起動できるようにする必要があります。
未完の仕事





