blog

Dockerでサービスをデプロイする際の注意点

半年前から、徐々に新しいサービスがドッカーに入れられ、いくつかの洞察の使用は、ここで要約します。...

Jun 29, 2017 · 4 min. read
シェア


半年前から、徐々に新しいサービスをすべてdockerに入れ、いくつかの知見を使って、ここにまとめています。

はじめに

Dockerfileの書き方

Dockerfileは以下のルールに従って記述します。

  1. イメージキャッシュの階層化と再利用

    Dockerfileの各コマンドはレイヤーを作成します: 新しいレイヤーが作成され、コマンドが実行され、実行の最後にこのレイヤーに加えられた変更がコミットされて新しいImageが形成されます。

    イメージのレイヤーを多く作成することは全く無意味であり、コンパイルされた環境や更新されたパッケージなど、実行時に必要のない多くのものがイメージにロードされます。その結果、非常に肥大化し、非常に多層化したイメージになり、ビルドのデプロイ時間が長くなるだけでなく、非常にエラーが発生しやすくなります。これはDocker初心者の多くの人が犯しがちな間違いです。

    まず、すべてのコマンドの目的が1つだけであれば、多くのレイヤを構築する必要はありません。そのため、異なるコマンドに対応するために多くのRUNペアを使用する代わりに、単一のRUNコマンドを使用し、 &&を使って 必要なコマンド同士をリンクするだけです。これにより、以前の7つのレイヤーを1つに減らすことができます。Dockerfileを書くときは、シェルスクリプトを書いているのではなく、各レイヤーをどのようにビルドするかを定義しているのだということを常に意識してください。

  2. 現在のレイヤーで作成されたファイルの削除

    Dockerを初めて使う人の多くが、非常に肥大化したImageを作る理由の一つは、各レイヤのビルドの最後に余計なファイルをクリーンアップすることを忘れてしまうことです。ビルドをコンパイルするために必要なソフトウェアを削除し、ダウンロードされ展開されたファイルをすべてクリーンアップし、aptキャッシュファイルをクリーンアップするために、コマンドセットの最後にクリーンアップコマンドを追加することができます。これは非常に重要なステップです。前に述べたように、Image は多階層のストレージで、各階層にあるものは次の階層でも削除されず、常に Image に追従します。

  3. ベースとなるイメージのサイズを小さくします。

プライベートリポジトリを使いましょう。

非推奨のImageを明確に

使われなくなったImageが多すぎるとディスクスペースを圧迫するので、削除する必要があります。ラベルのないイメージは ダミー イメージとも呼ばれ、以下のコマンドで表示できます:

docker image ls -f dangling=true

一般的に言って、ダングリングイメージはその価値を失っているので、以下のコマンドで自由に削除できます。

docker image prune

このコマンドがうまく機能しない場合は、さらに3つのコマンドをまとめました:

docker ps -a | grep "Exited" | awk '{print $1 }' | xargs docker stop docker ps -a | grep "Exited" | awk '{print $1 }' | xargs docker rm // docker images | grep "<none>" | awk '{print $3 }' | xargs docker rmi // 以下の3つの文を実行します。

これら3つの文は、それぞれ以下のアクションを実行します:

  1. Exited 状態のコンテナを停止します。
  2. Exited 状態のコンテナを削除します。
  3. ラベルの付いたコンテナを削除

この3つのアクションで、基本的に非推奨のImageを一掃することができます。私は通常、.bashrcに彼を書いて、Jenkinsのビルドスクリプトで.bashrcをソースにして、各ビルドの前にスペースを解放するという目的を達成します。

イメージのバックアップ

Imageタグは、ソフトウェアの様々なバージョンに対応するためによく使われます。これは、主にオンラインサービスのためのもので、テスト環境は、バックアップする必要はありません、単にパブタグを再生するイメージを生成するだけで十分ですが、オンラインサービスは、通常、別々に保存する2つのタグを再生するイメージを生成し、1つは、バージョン番号のタグを再生するために、もう一つは、最新のタグを再生するように、良いイメージのバックアップ。

感想

デプロイとメンテナンスが容易に

隔離された環境

私たちのために、サンドボックスは、ノードのバージョンをアップグレードすることはもはや問題ではありませんが、操作とメンテナンスは、私たちのためにサーバーを開くには、我々はサービスの異なるノードのバージョンを展開することができますし、サービスは、良好な分離を行うには、いくつかのコンテンツのいくつかの操作を心配する必要はありませんいくつかの他の操作に干渉すること。

まとめ

サービスを展開するコンテナの使用は、将来のトレンドであり、現在、Webサービスの展開で広く使用されています。また、分散コンピューティング、ビッグデータ、さらには機械学習アプリケーションの分野でも、go言語によるDockerが期待されています。

Read next

プログラミング言語にできること

Kevin Kelleherは、プログラミング言語の長所と短所を比較する興味深い方法を提案しています。この方法で、どれだけ多くの優れたプログラミング言語を説明できるかは驚きです。\n

Mar 24, 2017 · 1 min read