DockerFileによるミラーのパッケージング

7002 ワード

Dockerの具体的な操作を紹介する前に、Dockerのアーキテクチャを簡単に復習しておくと、Dockerの各コマンドをよりよく理解することができます.
まず、Dockerという呼び方について誤解しています.Dockerは、アプリケーションの開発、導入、実行のためのプラットフォームを指しています.普段のDockerは正確にDocker Engineです.
Docker EngineはC/Sアーキテクチャの応用である.主なコンポーネントは次のとおりです.
  • Docker Server:バックグラウンドで長時間実行されるプログラムは、よく知られているdaemonプロセスです.
  • Docker Client:コマンドラインインタフェースのクライアント.
  • REST API:daemonプロセスとのインタラクションに使用されます.

  • 私たちはDocker Clientに様々な命令を発行し、ClientはDocker daemonが提供するREST APIインタフェースを通じてインタラクティブになり、daemonにコンパイル、実行、コンテナの導入の煩雑な作業を処理させます.ほとんどの場合、Docker ClientとDocker Daemonは同じシステムで実行されますが、Docker Clientを使用してリモートのDocker Daemonプロセス、つまりリモートのサーバ側に接続することもできます.
    Dockerのシンプルなアーキテクチャが分かれば、具体的なコマンドがわかります.
    Dockerミラー構築命令
    命令1:ミラーの構築
    docker build [OPTIONS] PATH | URL | -

    Dockerはミラーのコンテキストを構築します.
    ここで文脈とは命令の最後のパラメータPATH | URL| -を指し、具体的にはdocker build ..の多くはこの.がDockerFileの位置だと思っているが、実際にはそうではなく、正確にはコンテキストを構築する位置である.前述のDockerはC/Sアーキテクチャであり、Client側で具体的なコマンドを発行し、Server側で具体的なコンテンツを実行します.これは、ミラーを構築するプロセスが実際にServer側で完了していることを意味します.コンテキストの出現は、必要なコンテンツをServerに伝えるためであり、構築のたびにこのような言葉が見られる理由です.
    [root@localhost python_shell]# docker build --rm -t temp/python-test .
    Sending build context to Docker daemon  4.608kB

    ここでのSendingとは,ローカルClient側のファイル内容をサーバ側にコピーすることである.多くの初心者は、DockerFileにCOPY /opt/xxxx /appと書いているが、実はコンテキストの概念を理解していないので、Server側にopt/xxxxのファイルがないことを知らない.
    また、Docker Fileをハードディスクのルートディレクトリに配置して実行する人もいますが、ルートディレクトリのすべてのファイルをサーバ側にコピーし、構築が極めて遅くなります.
    Options共通パラメータ:
  • -t:ミラーの名前とラベルをパッケージ化し、通常はname:tag
  • と書く.
  • --rm:構築に成功した後、中間に生成されたコンテナを削除します.
  • --force-rm=true:構築が成功するかどうかにかかわらず、中間生成容器
  • を削除する.
  • --no-cache:ミラーを構築するときにキャッシュを使用しません.
  • -f:DockerFileのパス
  • を指定
    docker build --no-cache --force-rm -t --no-cache local/centos7:v1 . 

    DockerFile命令および記述仕様
    命令1:ベースミラーの指定FROMでベースミラーを作成するには、コマンドは簡単ですが、latesstと書くのではなく、ベースミラーのバージョンを正確に指定する必要があります.時間が経つにつれて、公式の最新ミラーが更新され続け、構築できない場合があります.
    FROM centos:7 # That's perfect!
    FROM centos:latest # That's so bad!

    コマンド2:コンテナでコマンドを実行
    RUNコマンドは、コンテナ内でコマンドラインを実行するコマンドです.一般的には2つの書き方があります.
  • shell形式:
  • RUNの後はshellに直接命令すればいい.shell形式では、コマンドを複数行RUNに分解しないでください.毎回RUNは新しいミラーを構築するので、無駄な実行情報がたくさん保存されています.さらにUnion FSは最大層数で制限されている.だからできるだけ命令を1行に合成します.
    RUN yum -y install httpd; yum clean all; systemctl enable httpd.service # That's perfect!
    
    RUM yum -y install httpd / # Another perfect solution!
        yum clean all /
        systemctl enable httpd.service 
    
    RUN yum -y install httpd # That's so bad!
    RUN yum clean all;
    ....

    もう一つ注意したいのは、構築時に役に立たない依存パッケージを空にしたいということです.そうでなければ,ミラーの重複構築に伴い,大量の無情報が保存される.
  • exec書き方
  • execの書き方は、関数呼び出しのフォーマットに似ています.
    RUN ["     ", "  1", "  2"]
    
    RUN ["yum", "-y", "install", "httpd"]

    命令3:作業ディレクトリの設定
    WORKDIRは、各階層の作業ディレクトリ(コンテナ内に入るデフォルトディレクトリ)を変更するために使用され、指定したディレクトリが存在しない場合に作成されます.作業ディレクトリは構築中に各階層にアクセスできます.
    WORKDIR /src

    命令4:匿名ボリュームの設定
    コンテナの実行時には、コンテナのストレージレイヤに対して書き込みを行わないようにし、データベースのような動的なデータファイルに対してはVOLUMEで保存する必要があります.DockerFile VOLUMEでは、ディレクトリを匿名ボリュームとして指定できます.これにより、実行時に指定したディレクトリがマウントされていなければ、コンテナのストレージ層のようにデータが書き込まれず、ストレージ層の無状態化が保証されます.
    VOLUME /data

    Systemd Centos 7ミラーを開く
    公式Centos 7のミラーにはシステムの機能が含まれていますが、オンになっていません.ここでは,それをベースにミラーリングし,systemdの機能を開くだけでよい.システムを開くには、実行時にCgroupなどのコンテンツをマウントするために特権を開く必要があることに注意してください.
    DockerFileの作成
    [root@localhost docker_images]# cat Dockerfile
    FROM centos:7
    
    ENV container docker
    
    RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
    systemd-tmpfiles-setup.service ] || rm -f $i; done); \
    rm -f /lib/systemd/system/multi-user.target.wants/*;\
    rm -f /etc/systemd/system/*.wants/*;\
    rm -f /lib/systemd/system/local-fs.target.wants/*; \
    rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
    rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
    rm -f /lib/systemd/system/basic.target.wants/*;\
    rm -f /lib/systemd/system/anaconda.target.wants/*;
    
    VOLUME [ "/sys/fs/cgroup" ]
    
    CMD ["/usr/sbin/init"]
  • VOLUMEは匿名ディレクトリを指定しており、このディレクトリの内容はストレージ層に保存されず、動的変化などの永続性ファイルに適しています.
  • CMD保証容器起動時systemd
  • ミラーのパッケージング
     docker build --rm -t local/c7-systemd .
  • --rm:パッケージを削除する際の一時的なコンテナ
  • を示す.
    ミラーの実行
    docker run --privileged=true -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro local/c7-systemd
  • --privileged:コンテナに特殊な権限を与え、Cgroupなどをマウントします.

  • Httpdミラー
    次に、システムdをオンにした上のミラーに基づいて、Httpdミラーをパッケージ化する.
    DockerFileの作成
    FROM local/c7-systemd
    
    RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
    
    EXPOSE 80
  • 依存パッケージをダウンロードした後、無駄なコンテンツを削除するのは、DockerFileを書くのに良い習慣です.

  • DockerFileのコンパイル
    docker build --rm -t local/c7-systemd-httpd .

    Containerの実行
    docker run --privileged=true -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    -p 80:80 local/c7-systemd-httpd

    ダウンロード依存中にネットワークの問題が発生した場合は、Dockerエージェントの記事を参照してください.
    Pythonミラー
    コンテナでpythonスクリプトを実行する必要がある場合があります.次に、類似のミラーをパッケージします.ダウンロードに依存する場合、通常のサーバはパブリックネットワークにアクセスできません.この場合、コンテナにエージェントを構成する必要があります.ダウンロード依存後、エージェントの原因で内部のサーバがアクセスできない場合があります.この場合、設定したエージェントを空にすることができます.
    ファイルの作成
    ここのファイルはDockerFileと同級ディレクトリの下にあることに注意してください.
    #    requirements       
    [root@localhost home]# cat python_shell/requirements.txt
    requests==2.21.0
    
    #    Python   
    [root@localhost home]# cat python_shell/success.py
    print("python Running", "!");

    DockerFileの作成
    FROM python:3.6.8
    
    # set proxy
    ENV MY_PROXY_URL="http://173.39.112.117:80"
    ENV HTTP_PROXY=$MY_PROXY_URL \
        HTTPS_PROXY=$MY_PROXY_URL \
        FTP_PROXY=$MY_PROXY_URL \
        http_proxy=$MY_PROXY_URL \
        https_proxy=$MY_PROXY_URL \
        ftp_proxy=$MY_PROXY_URL
    
    WORKDIR /src
    
    COPY . .
    
    RUN ["pip", "install", "--no-cache-dir",  "-r",  "./requirements.txt"]
    
    # clear the proxy
    ENV MY_PROXY_URL=
    ENV HTTP_PROXY=$MY_PROXY_URL \
        HTTPS_PROXY=$MY_PROXY_URL \
        FTP_PROXY=$MY_PROXY_URL \
        http_proxy=$MY_PROXY_URL \
        https_proxy=$MY_PROXY_URL \
        ftp_proxy=$MY_PROXY_URL
    
    
    CMD ["python", "./success.py"]

    ミラーのパッケージング
    docker build --rm -t temp/python-test .

    ミラーの実行
    [root@localhost home]# docker run temp/python-test
    python Running !

    リファレンス
    docker-overview
    docker-centos-image
    docker-python-image
    https://blog.fundebug.com/2017/05/15/write-excellent-dockerfile/
    dockerfile_best-practices
    docker-chinese-reference