Dockerイメージの圧縮と最適化操作

Dockerイメージの圧縮と最適化操作

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 が表示される場合のみ、次のようになります。

yum install を実行します***

yum uninstall を実行します ***

RUN yum uninstall *** を使用すると、イメージを圧縮して最適化できます。上記の 2 つの文は、ツールをインストールしてからアンインストールするためです。通常、インストールとアンインストールのサイズは 0 であると感じますが、docker イメージではそうではありません。RUN yum uninstall *** は前のレイヤーを非表示にすることしかできず、前のレイヤーのサイズは変わりません。したがって、0 の効果を実現したい場合は、これらの 2 つのレイヤーを 1 つのレイヤーに圧縮する必要があります。これは次のように記述されます。

yum install *** && \ を実行します。

ユムンインストール***

これにより、画像を圧縮する効果が得られます。

したがって、画像を圧縮する際の主なポイントは 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をインストールします。

yum で bzip2 をインストールします

3. スクリプトを実行します(すべて「yes」と入力します)

sh Anaconda2-5.0.1-Linux-x86_64.sh

4. アナコンダを更新する

conda アップデート anaconda

5. Jupyterをインストールする

conda 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. 設定ファイルを生成する

Jupyter ノートブック --generate-config --allow-root

注意: この手順でエンコード エラーが発生する可能性があります: UnicodeEncodeError:'ascii'codec は位置... の文字をエンコードできません。

解決策は、anaconda2 フォルダーの lib>python2.7>site.py で、次のように変更します。

0の場合:  
 # ロケールに対応したデフォルトの文字列エンコーディングをサポートするには有効にします。  
 インポートロケール  
 loc = ロケール.getdefaultlocale()  
 loc[1]の場合:   
 エンコーディング = loc[1]
# 上記のコード セグメントの if の後の 0 を 1 に変更し、保存して Anaconda を再起動します。

8. 設定ファイルを変更します。

vi ~/.jupyter/jupyter_notebook_config.py

次のコンテンツを追加します。

c.NotebookApp.ip='*'
c.NotebookApp.password = u'sha1:5311cd8b9da9:70dd3321fccb5b5d77e66080a5d3d943ab9752b4' #ここでのキーは先ほど生成されたものであることに注意してください c.NotebookApp.open_browser = False
c.NotebookApp.port =8888 #ポートをランダムに指定します。デフォルトの8888を使用することもできます。

9. 画像を保存する

docker コミット コンテナ ID イメージ名

10. サービスを提供するためにイメージを起動します。

docker run --privileged -d -p 8889:8888 -v /sys/fs/cgroup:/sys/fs/cgroup --name jupyter jupyter2:v2 /usr/sbin/init

注意: Centos7 には大きな落とし穴があります。ファイアウォールをオフにすると、systemctl が使用できなくなり、次のエラー メッセージが表示されます: D-Bus 接続の取得に失敗しました: 操作は許可されていません

したがって、起動するには init を使用する必要があり、Dockerfile では CMD を使用してランタイムを起動できます。

11. Dockerイメージを入力する

docker exec -it jupyter /bin/bash

12. ファイアウォールをオフにする

systemctl ファイアウォールサービスを停止します

13. Jupyterを起動する

jupyter ノートブック --notebook-dir=/root/ --allow-root

14. ブラウザにサーバーのIPとマッピングされたポート番号を入力してアクセスします。完了です。

以上が、Dockerイメージの圧縮と最適化の操作について、エディターが皆さんにシェアする内容の全てです。参考になれば幸いです。また、123WORDPRESS.COMを応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerイメージ解析ツールのダイブ原理解析
  • Dockerfileを使用してApacheイメージを作成する方法
  • Docker イメージのローカル Elasticsearch ポート操作へのアクセス
  • スーパーバイザーによるDockerfileのマルチサービスイメージパッケージ操作
  • 独自の Docker イメージを作成して Dockerhub にアップロードする方法

<<:  角度に基づくツリー型セカンダリテーブルを実現する

>>:  HTMLウェブページのMETAタグのコンテンツを書く際のポイント

推薦する

DockerでRedisを使用するための詳細な手順

1. はじめにこの記事では、Docker を使用して Redis を探索する方法を説明します。 Do...

配列をフィルタリングするJavaScript

この記事では、配列フィルタリングを実装するためのJavaScriptの具体的なコードを参考までに紹介...

Web ページの HTML コードの説明: 順序付きリストと順序なしリスト

このセクションでは、HTML のリスト要素について学習します。リストは、Web サイトのデザインにお...

時刻を保存するために適切な MySQL の datetime 型を選択する方法

データベースを構築してプログラムを書くとき、日付と時刻の使用は避けられません。データベースには、ti...

VirtualBox の仮想ディスク vdi ファイルの容量を拡張する方法 (グラフィック チュートリアル)

VirtualBoxのインストールディレクトリを見つけます。ディレクトリ内には容量を拡張するために...

ネイティブJSで禁止すべきメソッドの記述

目次ブロックレベル関数オブジェクトのプロトタイプを直接変更すると呼び出された人発信者評価ブロックレベ...

Vue3.0プロジェクトの構築と利用プロセス

目次1. プロジェクト構築2: ディレクトリ構造3: コンポジションAPI 4: 基本的な使い方:最...

Linux 環境の Apache で https サービスを有効にする方法の詳細な説明

この記事では、Linux 環境の Apache で https サービスを有効にする方法について説明...

Tomcat を使用して Centos 環境に SpringBoot WAR パッケージをデプロイする

戦争パッケージを準備する1. 既存のSpringBootプロジェクトを準備し、pomに依存関係を追加...

MySQL query_cache_type パラメータと使用方法の詳細

MySQL クエリ キャッシュを設定する目的は次のとおりです。クエリ結果をキャッシュしておくと、次回...

UrlRewriter のキャッシュ問題と関連する一連の調査

ウェブサイト機能を開発する場合、セッション キャッシュを時間内にクリアできません。一連の探索が始まり...

Vueリクエストインターセプターの設定方法の詳しい説明

以下の手順に従ってください1. request.jsコンテンツ: http リクエスト インターセプ...

Jenkins の Docker のデプロイとインストール手順

まず、Docker がインストールされたサーバーが必要です。 (私はすでにこれをサーバーにインストー...

MySQL の「特殊キーが長すぎます」の解決策

目次解決策1解決策2テーブルを作成するときに、興味深い問題に遭遇しました。「指定されたキーが長すぎま...