Docker が今日非常に人気がある理由は、主にその軽量性、迅速な展開、およびリソースの利用にあります。ただし、Docker イメージの品質は主に Dockerfile の品質によって決まります。同じ機能イメージでも、Dockerfile が異なるとイメージ サイズが異なります。これは、Docker が読み取り専用レイヤーをレイヤーごとに蓄積し、各レイヤーが Dockerfile 内の各命令であるため、Docker イメージのサイズは Dockerfile 内の各命令によって生成される中間レイヤーのサイズに完全に依存するためです。 小さな例を使って、dockerimage の形成を詳しく説明しましょう。 Dockerfile があります: Ubuntu:14.04より 実行.shを追加 / ボリューム/データ CMD [“./run.sh”] このシンプルな Dockerfile が行う主なことは、Ubuntu:14.04 システムに基づいて、run.sh をルート ディレクトリに配置し、ボリュームのマウント ポイントを設定し、イメージの起動時にスクリプト run.sh を実行することです。 次の図は、結果として得られる Docker イメージを示しています。 図から、4 つの命令がそれぞれ 4 つのレイヤーを形成していることがわかります。Ubuntu:14.04 が 150MB、run.sh が 1MB であると仮定すると、FROM Ubuntu:14.04 レイヤーのサイズは 150MB、ADD run.sh / レイヤーのサイズは 1MB、VOLUME /data レイヤーと CMD ["./run.sh"] のサイズは、ファイルやその他のデータが追加されず、システムでデータが生成されないため 0 になります。 したがって、画像全体のサイズは 151MB になります。 Docker イメージ生成の原理を理解した後、Docker イメージの最適化と圧縮について説明します。 説明する必要があることの 1 つは、レイヤーの数によってイメージのサイズが決まらない場合があるということです。Dockerfile が表示される場合のみ、次のようになります。
RUN yum uninstall *** を使用すると、イメージを圧縮して最適化できます。上記の 2 つの文は、ツールをインストールしてからアンインストールするためです。通常、インストールとアンインストールのサイズは 0 であると感じますが、docker イメージではそうではありません。RUN yum uninstall *** は前のレイヤーを非表示にすることしかできず、前のレイヤーのサイズは変わりません。したがって、0 の効果を実現したい場合は、これらの 2 つのレイヤーを 1 つのレイヤーに圧縮する必要があります。これは次のように記述されます。
これにより、画像を圧縮する効果が得られます。 したがって、画像を圧縮する際の主なポイントは 2 つあります。 1. より小さい元の画像を選択します。つまり、FROM の後の画像はできるだけ小さくする必要があります。 2. 実際の状況に応じて、Dockerfile 内のレイヤーをマージします。具体的な状況は上記のとおりです。レイヤーをランダムにマージしても効果が得られないことに注意してください。 追加知識: Anaconda+Jupyter を Docker イメージにビルドする方法 最近、業務上のニーズにより、サービスを提供するために Jupyter イメージを構築する必要があります。Docker は軽量なので、簡単に移行できます。 私が行ったことと遭遇した落とし穴について簡単に紹介します。 まず、anacondaをインストールしましょう。python2と3のバージョンがあります。バージョンは異なりますが、ビルドプロセスは同じです。2つの方法があります。1つ目は、Dockerfileを介してイメージをビルドすることですが、Anaconda2-5.0.1-Linux-x86_64.shスクリプトを実行するときにインタラクションがないため、docker commitメソッドを使用して実行しました。しかし、Dockerfileを介してビルドすることもできることがわかりました。最初にローカルコンピューターでAnaconda2-5.0.1-Linux-x86_64.shスクリプトを実行し、生成されたフォルダー(anaconda2)をイメージ内の対応する場所にADDし、環境変数を変更してPATHを追加するだけです。 python2 を例に挙げてみましょう: 1. Anaconda 公式サイトからスクリプト Anaconda2-5.0.1-Linux-x86_64.sh をダウンロードして実行します。ダウンロードする際は、システムが 32 ビットか 64 ビットかに注意してください。 2. スクリプトをベースイメージにscpし、解凍コマンドbzip2をインストールします。
3. スクリプトを実行します(すべて「yes」と入力します)
4. アナコンダを更新する
5. Jupyterをインストールする
6. ログインパスワードを作成する root@localhost ~]# ipython Python 3.5.2 (デフォルト、2017 年 8 月 4 日、02:13:48) 詳細については、「著作権」、「クレジット」、または「ライセンス」と入力してください IPython 6.1.0 - 強化されたインタラクティブ Python。ヘルプを表示するには「?」と入力してください。 [1]: notebook.authからpasswdをインポート [2]: passwd() の場合 パスワードを入力してください: パスワードを確認してください: 出力[2]: 'sha1:5311cd8b9da9:70dd3321fccb5b5d77e66080a5d3d943ab9752b4' 7. 設定ファイルを生成する
注意: この手順でエンコード エラーが発生する可能性があります: UnicodeEncodeError:'ascii'codec は位置... の文字をエンコードできません。 解決策は、anaconda2 フォルダーの lib>python2.7>site.py で、次のように変更します。 0の場合: # ロケールに対応したデフォルトの文字列エンコーディングをサポートするには有効にします。 インポートロケール loc = ロケール.getdefaultlocale() loc[1]の場合: エンコーディング = loc[1] # 上記のコード セグメントの if の後の 0 を 1 に変更し、保存して Anaconda を再起動します。 8. 設定ファイルを変更します。
次のコンテンツを追加します。 c.NotebookApp.ip='*' c.NotebookApp.password = u'sha1:5311cd8b9da9:70dd3321fccb5b5d77e66080a5d3d943ab9752b4' #ここでのキーは先ほど生成されたものであることに注意してください c.NotebookApp.open_browser = False c.NotebookApp.port =8888 #ポートをランダムに指定します。デフォルトの8888を使用することもできます。 9. 画像を保存する
10. サービスを提供するためにイメージを起動します。
注意: Centos7 には大きな落とし穴があります。ファイアウォールをオフにすると、systemctl が使用できなくなり、次のエラー メッセージが表示されます: D-Bus 接続の取得に失敗しました: 操作は許可されていません したがって、起動するには init を使用する必要があり、Dockerfile では CMD を使用してランタイムを起動できます。 11. Dockerイメージを入力する
12. ファイアウォールをオフにする
13. Jupyterを起動する
14. ブラウザにサーバーのIPとマッピングされたポート番号を入力してアクセスします。完了です。 以上が、Dockerイメージの圧縮と最適化の操作について、エディターが皆さんにシェアする内容の全てです。参考になれば幸いです。また、123WORDPRESS.COMを応援していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: HTMLウェブページのMETAタグのコンテンツを書く際のポイント
MySQL 5.7.8 では json フィールドが導入されました。このタイプのフィールドは使用頻度...
この記事は、「1 分でインデックス作成スキルを学ぶ」という宿題から生まれました。注文ビジネス テーブ...
CSS の優先順位について話す前に、CSS とは何か、CSS が何に使用されるのかを理解する必要があ...
#文字列連結 concat(s1,s2); テーブル内の last_name と first_nam...
1. まず、次のパスに従って対応するフォルダを作成します。 ローカルのdockerでmysqlを実行...
MySQL は現在、ほとんどの企業や事業体で使用されているデータベースです。MySQL が使用される...
仮想マシンは非常に便利なテストソフトウェアです。ハードウェアに損傷を与えることなく、さまざまなテスト...
ベンダープレフィックスとは何ですか?ベンダー プレフィックス - ブラウザー エンジン プレフィック...
この記事では、MySQL 8.0.12のインストールチュートリアルを参考までに紹介します。具体的な内...
前回の記事では、MySQL ステートメントの実行時間をチェックする 2 つの方法を紹介しました。今日...
目次1. はじめに: 2. 最初のアイデアはインデックスを構築することです3. 命令P.S. Lik...
目次概要1. Refsオブジェクトの作成1.1 React.createRef() 1.2React...
この記事では、スライド選択効果を実現するピッカーをシミュレートするjQueryの具体的なコードを参考...
1: ターミナルに入ったらPHPのバージョンを確認する php -v出力は次のようになります。 PH...
以下に、トレーニング機関からのヒントと私自身の要約をいくつか示します。以下のインデックスの内容を説明...