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はミラーのコンテキストを構築します.
ここで文脈とは命令の最後のパラメータ
ここでのSendingとは,ローカルClient側のファイル内容をサーバ側にコピーすることである.多くの初心者は、DockerFileに
また、Docker Fileをハードディスクのルートディレクトリに配置して実行する人もいますが、ルートディレクトリのすべてのファイルをサーバ側にコピーし、構築が極めて遅くなります.
Options共通パラメータ: と書く. を削除する. を指定
DockerFile命令および記述仕様
命令1:ベースミラーの指定
コマンド2:コンテナでコマンドを実行
RUNコマンドは、コンテナ内でコマンドラインを実行するコマンドです.一般的には2つの書き方があります. shell形式: RUNの後はshellに直接命令すればいい.shell形式では、コマンドを複数行RUNに分解しないでください.毎回RUNは新しいミラーを構築するので、無駄な実行情報がたくさん保存されています.さらにUnion FSは最大層数で制限されている.だからできるだけ命令を1行に合成します.
もう一つ注意したいのは、構築時に役に立たない依存パッケージを空にしたいということです.そうでなければ,ミラーの重複構築に伴い,大量の無情報が保存される. exec書き方 execの書き方は、関数呼び出しのフォーマットに似ています.
命令3:作業ディレクトリの設定
WORKDIRは、各階層の作業ディレクトリ(コンテナ内に入るデフォルトディレクトリ)を変更するために使用され、指定したディレクトリが存在しない場合に作成されます.作業ディレクトリは構築中に各階層にアクセスできます.
命令4:匿名ボリュームの設定
コンテナの実行時には、コンテナのストレージレイヤに対して書き込みを行わないようにし、データベースのような動的なデータファイルに対してはVOLUMEで保存する必要があります.DockerFile VOLUMEでは、ディレクトリを匿名ボリュームとして指定できます.これにより、実行時に指定したディレクトリがマウントされていなければ、コンテナのストレージ層のようにデータが書き込まれず、ストレージ層の無状態化が保証されます.
Systemd Centos 7ミラーを開く
公式Centos 7のミラーにはシステムの機能が含まれていますが、オンになっていません.ここでは,それをベースにミラーリングし,systemdの機能を開くだけでよい.システムを開くには、実行時にCgroupなどのコンテンツをマウントするために特権を開く必要があることに注意してください.
DockerFileの作成 VOLUMEは匿名ディレクトリを指定しており、このディレクトリの内容はストレージ層に保存されず、動的変化などの永続性ファイルに適しています. CMD保証容器起動時systemd ミラーのパッケージング--rm:パッケージを削除する際の一時的なコンテナ を示す.
ミラーの実行--privileged:コンテナに特殊な権限を与え、Cgroupなどをマウントします.
Httpdミラー
次に、システムdをオンにした上のミラーに基づいて、Httpdミラーをパッケージ化する.
DockerFileの作成依存パッケージをダウンロードした後、無駄なコンテンツを削除するのは、DockerFileを書くのに良い習慣です.
DockerFileのコンパイル
Containerの実行
ダウンロード依存中にネットワークの問題が発生した場合は、Dockerエージェントの記事を参照してください.
Pythonミラー
コンテナでpythonスクリプトを実行する必要がある場合があります.次に、類似のミラーをパッケージします.ダウンロードに依存する場合、通常のサーバはパブリックネットワークにアクセスできません.この場合、コンテナにエージェントを構成する必要があります.ダウンロード依存後、エージェントの原因で内部のサーバがアクセスできない場合があります.この場合、設定したエージェントを空にすることができます.
ファイルの作成
ここのファイルはDockerFileと同級ディレクトリの下にあることに注意してください.
DockerFileの作成
ミラーのパッケージング
ミラーの実行
リファレンス
docker-overview
docker-centos-image
docker-python-image
https://blog.fundebug.com/2017/05/15/write-excellent-dockerfile/
dockerfile_best-practices
docker-chinese-reference
まず、Dockerという呼び方について誤解しています.Dockerは、アプリケーションの開発、導入、実行のためのプラットフォームを指しています.普段のDockerは正確にDocker Engineです.
Docker EngineはC/Sアーキテクチャの応用である.主なコンポーネントは次のとおりです.
私たちは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つの書き方があります.
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;
....
もう一つ注意したいのは、構築時に役に立たない依存パッケージを空にしたいということです.そうでなければ,ミラーの重複構築に伴い,大量の無情報が保存される.
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"]
docker build --rm -t local/c7-systemd .
ミラーの実行
docker run --privileged=true -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro local/c7-systemd
Httpdミラー
次に、システムdをオンにした上のミラーに基づいて、Httpdミラーをパッケージ化する.
DockerFileの作成
FROM local/c7-systemd
RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
EXPOSE 80
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