Dockerfileの使用
Dockerfileの概要
Dockerfileは、命令(Instruction)を含むテキストファイルであり、各命令はレイヤーを構築するため、各命令の内容は、レイヤーの構築方法を説明します。
基本知識
- 各コマンドは大文字の予約済みキーワードです
- 実行シーケンスは上から下に実行されます。各コマンドはレイヤーです。
- #コメントを示します
Dockerfileの一般的な手順を使用する
コマンド | 効果 | 例 |
---|---|---|
から | 基本的な鏡は、鏡の母親が誰であるかを示します | Ubuntuから |
メンテナー | ミラーの名前とメールアドレスを書いたのは誰ですか | |
実行 | 鏡に何をしてもらいたいですか | |
コピー | ファイルをコンテナにコピーします | |
追加 | ソースパスがhttpパスの場合、ADDコマンドを実行できます自動ダウンロード 次に、コピーしたファイルがtar.gzの場合、指定したパスにコピーします。自動減圧 そして、圧縮されたパッケージを削除します | |
WORKDIR | コンテナの作業ディレクトリはcdです。 | |
ボリューム | データを保存する場所 | |
EXPOSE | ミラーリングされたポートを公開します | |
CMD | コンテナの起動時に指定されたコマンドは、最後にのみ有効になり、置き換えられます | |
エントリーポイント | コンテナの起動時に指定したコマンドを追加することができ、追加されます | |
オンビルド | ただし、継承されたDockerfileをビルドします | |
ENV | イメージを構築するときに環境変数を設定する |
コマンド | 効果 | 例 |
---|---|---|
FROM imageName | に基づいてカスタマイズされたDockerfileを開始する必要があるイメージ | FROMtomcatまたはFROMtomcat:8.5.32 |
WORKDIR切り替えるディレクトリ | ワークスペースを切り替えると、cdコマンドを置き換えることができます | WORKDIR / usr / local / tomcatは、現在のディレクトリを指定されたディレクトリに切り替えることができます |
RUNbashコマンド | bashコマンドを実行します | echo "Hello World"> / usr / local / 1.txtなどを実行します。 |
コンテキストパスのCOPYファイル/コンテナパス | ファイルをコンテナにコピーします | index.js / usr / local / docker / testをコピーします |
コンテキストパスのファイルを追加します。コンテナパス | ファイルをコンテナにコピーします | ソースパスがhttpパスの場合、ADDコマンドをダウンロードして、指定したパスにコピーできます。コピーしたファイルがtar.gzの場合、ADDは自動的に解凍して削除します。 |
CMDコマンド | ミラーでプログラムを開始します | CMD ["nginx"、 "-g"、 "daemon off;"] |
EXPOSEポート[ポート2、ポート3、...] | Dockerコンテナにミラーリングされたポートを公開します | EXPOSE [80,8080]またはEXPOSE80 |
。。。などなど |
イメージを構築する
docker build -f dockerfile名称 -t 镜像名称 .
# -f 指定dockerfile文件名
# -t 构建的镜像名称
# . 上下文路径
予防
CMDとENTRYPOINTの違い
RUNコマンドは複数のコマンドを実行します
#正确用法
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/*
#错误用法
FROM debian:jessie
RUN apt-get update
RUN apt-get install -y gcc libc6-dev make
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz"
RUN mkdir -p /usr/src/redis
RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install
Dockerfileの各命令はレイヤーを表し、同じことがRUNにも当てはまり、上記の書き込み方法で7レイヤーのイメージが作成されます。これは完全に無意味です。ビルド時間が長くなるだけでなく、エラーが発生する可能性も高くなります。
注: Union FSには最大数のレイヤーがあります。たとえば、AUFSには最大42レイヤーがありましたが、現在は127レイヤーを超えることはできません。
正しい記述方法は、Dockerfile命令を\記号で連結して、&&をラップして使用することです。これにより、前の7つのレイヤーが1つのレイヤーに変換されます。
添付、Dockerカスタムイメージのコンテキスト説明
注意を払うとdocker build
、最後のコマンドaが表示され.
ます。.
これは現在のディレクトリを表しますが、現在のディレクトリでDockerfile
は、これがパスで指定されDockerfile
たパスであると多くの初心者が考えているため、理解は実際には不正確です。上記の形式に対応するコマンドの場合、これが指定されたコンテキストパスにあることがわかります。では、コンテキストとは何ですか?
- このコマンドのように
docker build -t imageName .
Dockerfileをビルドするとき、ユーザーはイメージコンテキストをビルドするためのパスを指定します。docker build - t name .
コマンドがこのパスを認識した後、ユーザーが指定したパスの下にあるすべてのコンテンツがパッケージ化され、Dockerエンジンにアップロードされます。このように、Dockerエンジンはこのコンテキストパッケージを受信すると、イメージのビルドに必要なすべてのファイルを取得するために展開されます。
もしDockerfile
そうなら、書き込みます:
COPY ./package.json /app/
これは、実行コピーすることではありませんdocker build
Dockerfileコマンドのディレクトリをpackage.json
、またそれはコピーすることですDockerfile
下のディレクトリをpackage.json
、しかし、複製コンテキスト(文脈)ディレクトリの下にpackage.json
。
独自のミラーを公開する
DockerHubに公開する
アカウント登録
# 先登录自己的账户
docker login -u yufire
# 输入密码
Password:
# 提示你没有把将未加密地存储在/root/.docker/config.json中。
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
# 登陆成功
Login Succeeded
docker push 镜像名:版本号
Alibaba Cloud ImageServiceに公開する
- AlibabaCloudにログインします
- コンテナイメージサービスを探す
- 競合を防ぐために名前空間を作成します 作成できるアカウントは3つだけです
- 倉庫を作成する
作成したミラーのバージョン番号を持参してください
docker login -u username
dockerlogout
花を広げるのをやめる
作者:yufire © [email protected]