書かれたチュートリアルDockerfile
します。https://yeasy.gitbooks.io/docker_practice/image/build.htmlこの記事の内容のほとんどはから来ています
ディレクトリを作成し、Dockerfileを作成したディレクトリのファイルに
vim /root/test/Dockerfile
あなたは、イメージファイルをインストールする必要があります
ここでは、依存のCentOSとpython3.7.4とインストールに必要な、オープンポート8000ポートの最新バージョンをインストール
- 主な執筆
FROM centos:latest MAINTAINER ryan.liu "[email protected]" RUN yum install -y gcc zlib-devel openssl-devel libffi-devel make WORKDIR /tmp RUN curl -O https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz RUN tar -zxvf Python-3.7.4.tgz WORKDIR Python-3.7.4 RUN mkdir -p /usr/local/python3 RUN ./configure --prefix=/usr/local/python3 RUN make && make install RUN echo export PATH="/usr/local/python3/bin:$PATH" >> ~/.bashrc RUN source ~/.bashrc RUN /usr/local/python3/bin/pip3 install Django==2.2.3 RUN /usr/local/python3/bin/pip3 install pymysql WORKDIR / EXPOSE 8000
各コマンドは、1層Dockerfileに設立され、
RUN
例外ではありません。すべてのRUN
行為、私たちは手動で同じミラーを作成しているだけのプロセスは:実行後、これらのコマンドが実行されている新しい層を、確立するために、commit
この層の変化は、新しい画像を構成します。上記の文言は、ミラー層7が作成されます。これは完全に無意味です、と物事を実行しているの多くを必要としない、彼らは、そのようなので、上のコンパイラ環境、更新されたパッケージ、およびとして、ミラーイメージに入れてきました。結果は、展開するビルド時間を増加させ、そしてエラーに非常になりやすいだけでなく、非常に肥大化し、非常に多層膜ミラーです。これは、多くの初心者ドッカーの人々はしばしば作る間違いです。
組合FSは、AUFSなどの層の数の上限であり、最大ではない以上42層と、今以上127層ではありません。
- 正しい言葉遣い
FROM centos:latest MAINTAINER ryan.liu "[email protected]" RUN yum install -y gcc zlib-devel openssl-devel libffi-devel make \ && cd /tmp \ && curl -O https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz \ && tar -zxvf Python-3.7.4.tgz \ && rm -rf Python-3.7.4.tgz \ && mkdir -p /usr/local/python3 \ && cd Python-3.7.4 \ && ./configure --prefix=/usr/local/python3 \ && make && make install \ && echo export PATH="/usr/local/python3/bin:$PATH" >> ~/.bashrc \ && source ~/.bashrc \ && /usr/local/python3/bin/pip3 install Django==2.2.3 \ && /usr/local/python3/bin/pip3 install pymysql \ && cd / EXPOSE 8000
実行
で
Dockerfile
実行ディレクトリdocker build -t centos7:latest .
ミラービル文脈(コンテキスト)
あなたが注意を払っている場合は、表示される
docker build
最後のコマンドaを.
。.
これは、現在のディレクトリを表しますが、Dockerfile
現在のディレクトリに、非常に多くの初心者はこれがで指定されたパスだと思いDockerfile
パスなので、理解は実際に不正確です。コマンドは、上記の形式に対応している場合は、これが指定されていることがありますコンテキストパス。だから、文脈それは何ですか?まず、理解する必要が
docker build
作品を。ドッカードッカーは、ランタイムエンジン(つまり、サーバデーモンである)とクライアントツールで分けます。ドッカーエンジンが呼び出され、RESTのAPIのセットを提供し、リモートAPIドッキングウィンドウ、および場合はdocker
、クライアント・ツールとして、コマンド、ドッキングウィンドウは、エンジンと対話し、このAPIによって設定され、これにより様々な機能を実行しています。したがって、けれども表面上では、さまざまな実行するために、我々はマシンであると思われるdocker
機能を、実際には、すべてがサービス側(ドッカーエンジン)を完了するために使用される長距離電話の形です。このため、Cの/ Sは、私たちは、リモートサーバードッカーエンジンに風を操作できるように設計されています。私たちは、ミラーを構築し、すべてによってカスタマイズされていない場合には
RUN
完了する命令、多くの場合、あなたは、例えば、鏡の中にコピーされたいくつかのローカルファイル必要COPY
命令、ADD
ように指示しています。docker build
ミラーを構築するためのコマンドは、それがローカルに内蔵されていませんが、サービス側では、それは、ドッカーエンジンのビルドです。だから、このクライアント/サーバアーキテクチャでは、どのサーバがローカルファイルにそれを得るために取得するには?これは、コンテキストの概念を導入しています。構築された場合、ユーザーは、ミラーを構築するために、パスのコンテキストを指定し、
docker build
そのパスこのコマンドは、パッケージのすべての内容はパスで、その後、ドッカーエンジンにアップロードされます。したがって、この文脈ドッカーエンジンパッケージを取得した後、必要なすべての書類の画像を取得する建物を展開します。もし
Dockerfile
で書くので:COPY ./package.json /app/
これは、実行コピーすることではありません
docker build
コマンドは、ディレクトリpackage.json
、またコピーされDockerfile
たディレクトリの下にpackage.json
はなく、複製コンテキスト(文脈)をディレクトリの下package.json
。このように、
COPY
ソースファイルで、このような命令のパスがある相対パス。多くの場合、これが初心者である理由を尋ねるCOPY ../package.json /app
やCOPY /opt/xxxx /app
コンテキストの範囲を超えてこれらのパスは、ドッカーエンジンが利用できるこれらの場所を提出することができないので理由は、動作しないことができます。あなたが本当にこれらのファイルが必要な場合は、ディレクトリのコンテキストにそれらをコピーしてください。今、あなただけのオーダーを理解することができ
docker build -t nginx:v3 .
、この中で.
、実際には、指定されたディレクトリのコンテキストで、docker build
コマンドは、ミラーを構築するためにドッカーエンジンにディレクトリの内容をパックします。あなたが見れば
docker build
出力、実際には、我々は、これは、プロセスのコンテキストを送信します見てきました:$ docker build -t nginx:v3 . Sending build context to Docker daemon 2.048 kB ...
理解ミラー構築のための建物のコンテキストが非常に重要であり、ミスのいくつかを避けるべきではありません。例えば、いくつかの初心者は見つける
COPY /opt/xxxx /app
そう簡単にされ、機能していない後にDockerfile
構築するためのハードディスクのルートディレクトリに配置され、ことがわかったdocker build
の実装後、何かが非常に遅く、構築することは非常に簡単に障害が発生したの数十GBを送信します。この練習はさせて頂いておりためですdocker build
明らかに間違っているハードディスク全体を、パッケージ化します。一般的に、それはされるだろう
Dockerfile
空のディレクトリ、またはプロジェクトのルートディレクトリに置か。そのディレクトリに必要なファイルの場合は、必要な紙の上にコピーする必要があります。ディレクトリが何かドッカーエンジンビルドを渡したくない場合は、あなたができる.gitignore
別の構文を書き.dockerignore
、ファイルはドッカーエンジンにコンテキストを渡すなどつまらない取り除くために使用されます。なぜ誰もミスは考え
.
を指定することでDockerfile
、それをディレクトリ?あなたが追加指定しない場合、デフォルトでは、これは、あるDockerfile
言葉を、ディレクトリのコンテキストで呼び出されますDockerfile
Dockerfileなどのファイル。これは、実際には、単にデフォルトの動作される
Dockerfile
ファイル名はする必要はなくDockerfile
、例えば、使用することができ、ディレクトリのコンテキスト内でなければならない必要はありません-f ../Dockerfile.php
パラメータとしてファイルを指定しますDockerfile
。もちろん、一般的にそれが習慣的にデフォルトのファイル名を使用し
Dockerfile
て、ミラーリングされた建物のディレクトリのコンテキストに配置されます。ビューミラー
docker images
ファイル名を指定して実行コンテナ
docker run -it --name=centos7 centos7:latest /bin/bash
その他の関連するコマンド
コンテナの実行を停止
docker stop centos7
停止したコンテナを削除するには
docker rm centos7
ダウンロードしたすべての画像を見ます
docker images