Dockerfileの書く規則と命令の使用方法

8169 ワード

Dockerfileの命令は大文字と小文字を無視し、大文字を使用することをお勧めします.注釈として#を使用します.各行は1つの命令しかサポートされていません.各命令は複数のパラメータを運ぶことができます.
Dockerfileの命令は役割によって2種類に分けられ,構築命令と設定命令である.構築命令はimageを構築するために使用され、指定された操作はimageを実行するコンテナでは実行されません.設定コマンドはimageのプロパティを設定するために使用され、指定された操作はimageを実行するコンテナで実行されます.
FROM(ベースイメージ指定)
ビルド命令は、Dockerfileの他の命令の前に指定する必要があります.後続の命令は、その命令によって指定されたimageに依存する.FROM命令で指定されたベースイメージは、公式リモートウェアハウスであってもよいし、ローカルウェアハウスであってもよい.
このコマンドには2つのフォーマットがあります.
FROM 

ベースイメージがそのイメージの最後に変更されたバージョンを指定します.または、
FROM :

ベースイメージがそのイメージのtagバージョンであることを指定します.
MAINTAINER(ミラー作成者情報を指定するために使用)
イメージの作成者に関する情報をイメージに書き込むための構築命令.このイメージに対してdocker inspectコマンドを実行すると、出力には対応するフィールドが記録されます.
書式:
MAINTAINER 

RUN(ソフトウェアインストール用)
構築命令、RUNは基礎imageでサポートされている任意の命令を実行することができる.ベースイメージがubuntuを選択した場合、ソフトウェア管理セクションではubuntuのコマンドしか使用できません.このコマンドには2つのフォーマットがあります.
RUN  (the command is run in a shell - `/bin/sh -c`)  
RUN ["executable", "param1", "param2" ... ]  (exec form)

CMD(container起動時に実行する操作を設定)
container起動時に指定した操作に使用するコマンドを設定します.この操作は、カスタムスクリプトを実行するか、システムコマンドを実行するかのいずれかです.このコマンドはファイルに1回のみ存在し、複数ある場合は最後の1つのみ実行されます.このコマンドには、次の3つのフォーマットがあります.
CMD ["executable","param1","param2"] (like an exec, this is the preferred form)  
CMD command param1 param2 (as a shell)

DockerfileがENTRYPOINTを指定した場合、次の形式が使用されます.
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

ENTRYPOINTは、param 1とparam 2をパラメータとして実行する実行可能なスクリプトまたはプログラムのパスを指定します.したがって、CMD命令が上記の形式を使用する場合、DockerfileにはENTRYPOINTがセットされている必要があります.
ENTRYPOINT(container起動時に実行する操作を設定)
コマンドを設定し、コンテナの起動時に実行するコマンドを指定します.複数回設定できますが、最後のコマンドのみ有効です.2つのフォーマット:
ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)  
ENTRYPOINT command param1 param2 (as a shell)

この命令の使用は2つのケースに分けられ,1つは単独で使用し,もう1つはCMD命令と組み合わせて使用する.単独で使用する場合、CMDコマンドを使用し、CMDが完全に実行可能なコマンドである場合、CMDコマンドとENTRYPOINTは互いに上書きされ、最後のCMDまたはENTRYPOINTだけが有効になります.
# CMD        ,  ENTRYPOINT       
CMD echo “Hello, World!”  
ENTRYPOINT ls -l

もう1つの使用法は、ENTRYPOINTのデフォルトパラメータを指定するためにCMD命令と組み合わせて使用され、この場合、CMD命令は完全な実行可能な命令ではなく、パラメータ部分にすぎない.ENTRYPOINT命令はJSON方式でのみ実行命令を指定でき、パラメータは指定できません.
FROM ubuntu  
CMD ["-l"]  
ENTRYPOINT ["/usr/bin/ls"]

USER(containerコンテナを設置するユーザ)
コマンドを設定し、コンテナを起動するユーザーを設定します.デフォルトはrootユーザーです.
#   memcached       
ENTRYPOINT ["memcached"]  
USER daemon  
   
ENTRYPOINT ["memcached", "-u", "daemon"]

EXPOSE(コンテナをホストマシンにマッピングする必要があるポートを指定)
コンテナ内のポートをホストマシン内のポートにマッピングするコマンドを設定します.コンテナにアクセスする必要がある場合は、コンテナのIPアドレスではなく、ホストマシンのIPアドレスとマッピングされたポートを使用することができます.操作全体を完了するには、まずDockerfileでEXPOSEを使用してマッピングするコンテナポートを設定し、コンテナを実行するときに-pオプションとEXPOSE設定のポートを指定します.これにより、EXPOSE設定のポート番号がホストマシンのポート番号にランダムにマッピングされます.ホストマシンにマッピングする必要があるポートを指定して、ホストマシンのポート番号が使用されていないことを確認することもできます.EXPOSE命令では、一度に複数のポート番号を設定することができ、対応するコンテナを運転する際には、-pオプションを複数回使用することができます.書式:
EXPOSE  [...]
#         
EXPOSE port1  
#               
docker run -p port1 image  

#         
EXPOSE port1 port2 port3  
#               
docker run -p port1 -p port2 -p port3 image  
#                        
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image

ポートマッピングはdockerの重要な機能であり、コンテナを実行するたびにコンテナのIPアドレスが指定できず、ブリッジカードのアドレス範囲内でランダムに生成されるためです.ホストマシンのIPアドレスは固定されており、コンテナのポートをホストマシンのポートにマッピングし、コンテナ内のサービスにアクセスするたびにコンテナのIPのアドレスを表示しないようにすることができます.実行中のコンテナの場合、docker portとコンテナにマッピングする必要があるポートとコンテナのIDを追加して、ホストマシン上のポート番号のマッピングポートを表示できます.
EnV(環境変数の設定用)
環境変数をimageに設定するコマンドを構築します.書式:
ENV  

設定後、後続のRUNコマンドを使用できます.containerが起動したら、docker inspectでこの環境変数を表示するか、docker run--env key=valueで環境変数を設定または変更できます.JAVAプログラムをインストールした場合、JAVAを設定する必要があります.HOME、それではDockerfileで「ENV JAVA」と書くことができます.HOME/path/to/java/dirent
ADD(srcからcontainerへのdestパス)
containerにコピーされたすべてのファイルとフォルダ権限は0755、uidとgidは0です.ディレクトリの場合、ディレクトリを含まないディレクトリの下にあるすべてのファイルがcontainerに追加されます.ファイルが認識可能な圧縮フォーマットである場合、dockerは解凍を手伝います(圧縮フォーマットに注意してください).がファイルであり、にスラッシュを使用して終了しない場合、はファイルとみなされ、の内容はに書き込まれる.がファイルであり、でスラッシュで終了した場合、ファイルはディレクトリにコピーされます.
書式:
ADD  
は、構築されたソースディレクトリに対する相対パスであり、ファイルまたはディレクトリのパスであってもよいし、リモートのファイルurlであってもよい.はcontainerの絶対パスです
VOLUME(マウントポイント指定)
コンテナ内の1つのディレクトリにデータを永続化して格納する機能を持たせるコマンドを設定します.このディレクトリはコンテナ自体で使用するか、他のコンテナに共有して使用することができます.コンテナがAFSを使用していることを知っています.このファイルシステムはデータを永続化できません.コンテナが閉じると、すべての変更が失われます.この命令は、コンテナ内のアプリケーションがデータを永続化する必要がある場合にDockerfileで使用することができる.書式:
VOLUME [""]
FROM base  
VOLUME ["/tmp/data"]

このDockerfileでimageを生成するコンテナを実行し、/tmp/dataディレクトリのデータはコンテナが閉じた後も、中のデータは存在します.たとえば、別のコンテナでもデータを永続化する必要があり、上のコンテナで共有されている/tmp/dataディレクトリを使用する場合は、次のコマンドを実行してコンテナを起動できます.
docker run -t -i -rm -volumes-from container1 image2 bash

container 1は1番目のコンテナのIDであり、image 2は2番目のコンテナがimageを実行する名前である.
WORKDIR(切り替えディレクトリ)
コマンドを設定すると、複数回切り替えることができ(cdコマンドに相当)、RUN、CMD、ENTRYPOINTに対して有効になります.書式:
WORKDIR /path/to/workdir
#   /p1/p2     vim a.txt  
WORKDIR /p1 WORKDIR p2 RUN vim a.txt

ONBUILD(サブミラーで実行)
ONBUILD 

ONBUILDで指定したコマンドは、ミラーの構築時には実行されず、そのサブミラーで実行されます.詳細は参照可能https://www.dockboard.org/docker-quicktip-3-onbuild
Dockerfileを作成し、jdk+tomcat環境を構築
Dockerfileファイル
# Pull base image  
FROM ubuntu:13.10  

MAINTAINER zing wang "[email protected]"  

# update source  
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list  
RUN apt-get update  

# Install curl  
RUN apt-get -y install curl  

# Install JDK 7  
RUN cd /tmp &&  curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz  
RUN mkdir -p /usr/lib/jvm  
RUN mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/  

# Set Oracle JDK 7 as default Java  
RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300     
RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300     

ENV JAVA_HOME /usr/lib/jvm/java-7-oracle/  

# Install tomcat7  
RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz  
RUN mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/  

ENV CATALINA_HOME /opt/tomcat7  
ENV PATH $PATH:$CATALINA_HOME/bin  

ADD tomcat7.sh /etc/init.d/tomcat7  
RUN chmod 755 /etc/init.d/tomcat7  

# Expose ports.  
EXPOSE 8080  

# Define default command.  
ENTRYPOINT service tomcat7 start && tail -f /opt/tomcat7/logs/catalina.out

tomcat7.sh
export JAVA_HOME=/usr/lib/jvm/java-7-oracle/  
export TOMCAT_HOME=/opt/tomcat7  

case $1 in  
start)  
  sh $TOMCAT_HOME/bin/startup.sh  
;;  
stop)  
  sh $TOMCAT_HOME/bin/shutdown.sh  
;;  
restart)  
  sh $TOMCAT_HOME/bin/shutdown.sh  
  sh $TOMCAT_HOME/bin/startup.sh  
;;  
esac  
exit 0

著者はこれらのファイルをGithubにアップロードしましたhttps://github.com/agileshell/dockerfile-jdk-tomcat.git
ミラーの構築
スクリプトが作成されました.ミラーに変換する必要があります.
docker build -t zingdocker/jdk-tomcat .  
docker run -d -p 8090:8080 zingdocker/jdk-tomcat