DockerぞのダむビングDockerfileずコンテナヌ通信

前回の蚘事では 、 Dockerずは䜕か 、そしおDockerを䜿甚しおベンダヌロックをバむパスする方法に぀いお説明したした。 この蚘事では、Dockerのむメヌゞを準備する正しい方法ずしおDockerfileに぀いお説明したす。 たた、コンテナが盞互にやり取りする必芁がある状況も考慮したす。





InfoboxCloudでは、 Dockerを䜿甚しおUbuntu 14.04の完成したむメヌゞを䜜成したした。 サヌバヌの䜜成時に「OSカヌネル制埡を蚱可する」ボックスをチェックするこずを忘れないでください;これはDockerが機胜するために必芁です。



Dockerfile



前の蚘事で説明したdocker commitアプロヌチは、Dockerにはお勧めしたせん。 さらに、暙準サヌバヌのセットアップに慣れおいるのずほが同じようにコンテナヌを構成したす。



このアプロヌチの代わりに、 Dockerfileアプロヌチずdocker build commandを䜿甚するこずをお勧めしたす。 Dockerfileは、通垞のDSLずDockerむメヌゞの䜜成手順を䜿甚したす。 その埌、dockerfileの指瀺を䜿甚しお新しいむメヌゞをビルドするためにdocker buildコマンドが実行されたす。



Dockerfileの䜜成


Dockerfileを䜿甚しお簡単なWebサヌバヌむメヌゞを䜜成したしょう。 たず、ディレクトリずDockerfile自䜓を䜜成したす。

mkdir static_web cd static_web touch Dockerfile
      
      





䜜成されたディレクトリは、Dockerがコンテキストを呌び出すか、コンテキストを構築するビルド環境です。 Dockerは、むメヌゞアセンブリが開始されるず、Dockerデヌモンの動䜜䞭にフォルダヌ内のコンテキストをロヌドしたす。 このようにしお、Dockerデヌモンは、むメヌゞに含めるコヌド、ファむル、たたはその他のデヌタにアクセスできたす。



むメヌゞ構築情報をDockerfileに远加したす。

 # Version: 0.0.1 FROM ubuntu:14.04 MAINTAINER Yuri Trukhin <trukhinyuri@infoboxcloud.com> RUN apt-get update RUN apt-get install -y nginx RUN echo 'Hi, I am in your container' \ >/usr/share/nginx/html/index.html EXPOSE 80
      
      





Dockerfileには、匕数付きの呜什セットが含たれおいたす。 各呜什は倧文字で曞かれおいたすFROMなど。 呜什は䞊から䞋に凊理されたす。 各呜什は、むメヌゞに新しいレむダヌを远加し、倉曎をコミットしたす。 Dockerは、プロセスに埓っお指瀺を実行したす。



これは、䜕らかの理由でDockerfileの実行が停止した堎合たずえば、呜什を完了できない堎合、この段階たでむメヌゞを䜿甚できるこずを意味したす。 これはデバッグに非垞に䟿利です。むンタラクティブにむメヌゞからコンテナを起動し、最埌に䜜成されたむメヌゞを䜿甚しお呜什が実行されなかった理由を芋぀けるこずができたす。



Dockerfileはコメントもサポヌトしおいたす。 で始たる行はコメントを意味したす。



Dockerfileの最初の呜什は垞にFROMである必芁があり、どのむメヌゞからむメヌゞを構築するかを瀺したす。 この䟋では、ubuntuバヌゞョン14:04のベヌスむメヌゞからむメヌゞを構築しおいたす。



次に、むメヌゞ䜜成者ずそのメヌルのDockerに䌝えるMAINTAINER呜什を瀺したす。 これは、画像ナヌザヌが必芁に応じお䜜者に連絡できるようにするのに䟿利です。



RUN呜什は、特定のむメヌゞでコマンドを実行したす。 この䟋では、それを䜿甚しお、APTリポゞトリを曎新し、NGINXでパッケヌゞをむンストヌルしおから、ファむル/usr/share/nginx/html/index.htmlを䜜成したす。



デフォルトでは、RUN呜什は/ bin / sh -cコマンドラッパヌを䜿甚しおシェル内で実行されたす。 シェルなしでプラットフォヌムで呜什を実行する堎合、たたは単にシェルなしでステヌトメントを実行する堎合は、実行圢匏を指定できたす。

 RUN ["apt-get", "install", "-y", "nginx"]
      
      





この圢匏を䜿甚しお、実行するコマンドずコマンドパラメヌタヌを含む配列を指定したす。



次に、コンテナ内のアプリケヌションがコンテナ内の特定のポヌトを䜿甚する必芁があるこずをDockerに䌝えるEXPOSEステヌトメントを指定したす。 これは、コンテナポヌトこの䟋ではポヌト80で実行されおいるサヌビスに自動的にアクセスできるずいう意味ではありたせん。 セキュリティ䞊の理由から、Dockerはポヌトを自動的に開きたせんが、ナヌザヌがdocker runコマンドでこれを行うこずを期埅しおいたす。 倚くのEXPOSE呜什を指定しお、どのポヌトを開く必芁があるかを瀺すこずができたす。 EXPOSEステヌトメントは、コンテナ間でポヌトを転送する堎合にも圹立ちたす。



ファむルから画像を䜜成する


 docker build -t trukhinyuri/nginx ~/static_web
      
      





ここで、trukhinyuriはむメヌゞが保存されるリポゞトリの名前で、nginxはむメヌゞの名前です。 最埌のパラメヌタヌは、Dockerfileがあるフォルダヌぞのパスです。 むメヌゞの名前を指定しない堎合、自動的に最新の名前が付けられたす。 Dockerfileがあるgitリポゞトリを指定するこずもできたす。

 docker build -t trukhinyuri/nginx \ git@github.com:trukhinyuri/docker-static_web
      
      





この䟋では、DockerのルヌトディレクトリにあるDockerfileからむメヌゞを構築しおいたす。



コンテキストビルドのルヌトに.dockerignoreファむルがある堎合、䟋倖パタヌンのリストずしお解釈されたす。



呜什が倱敗するずどうなりたすか


Dockerfileのnginxの名前をnginに倉曎しおみたしょう。







むメヌゞID 066b799ea548を䜿甚しお、最埌から2番目のステップからコンテナヌを䜜成できたす。

docker run -i -t 066b799ea548 / bin / bash

実行をデバッグしたす。



デフォルトでは、Dockerはすべおのステップをキャッシュし、アセンブリキャッシュを構築したす。 たずえば、最新のapt-get曎新を䜿甚するなど、キャッシュを無効にするには、-no-cacheフラグを䜿甚したす。

 docker build --no-cache -t trukhinyuri/nginx
      
      







テンプレヌト化にアセンブリキャッシュを䜿甚する


アセンブリキャッシュを䜿甚しお、Dockerfileから単玔なテンプレヌトの圢匏でむメヌゞを構築できたす。 たずえば、UbuntuでAPTキャッシュを曎新するためのテンプレヌト

 FROM ubuntu:14.04 MAINTAINER Yuri Trukhin <trukhinyuri@infoboxcloud.com> ENV REFRESHED_AT 2014–10–16 RUN apt-get -qq update
      
      





ENV呜什は、むメヌゞ内の環境倉数を蚭定したす。 この堎合、テンプレヌトがい぀曎新されたかを瀺したす。 ビルドされたむメヌゞを曎新する必芁がある堎合は、ENVの日付を倉曎するだけです。 Dockerはキャッシュをフラッシュし、むメヌゞ内のパッケヌゞバヌゞョンが最埌になりたす。



Dockerfileの手順


他のDockerfileの指瀺を芋おみたしょう。 完党なリストはここにありたす 。



CMD


CMD呜什は、コンテナの実行䞭に実行するコマンドを瀺したす。 RUNコマンドずは異なり、指定されたコマンドはむメヌゞのビルド䞭ではなく、コンテナヌの起動䞭に実行されたす。

 CMD ["/bin/bash", "-l"]
      
      





この堎合、bashを実行し、配列ずしおパラメヌタヌを枡したす。 配列の圢匏ではないコマンドを指定した堎合-/ bin / sh -cで実行されたす。 docker runを䜿甚しおCMDコマンドをオヌバヌロヌドできるこずに泚意しおください。



゚ントリヌポむント


倚くの堎合、CMDコマンドはENTRYPOINTず混同されたす。 違いは、コンテナの起動時にENTRYPOINTをオヌバヌロヌドできないこずです。

 ENTRYPOINT ["/usr/sbin/nginx"]
      
      





コンテナが起動するず、パラメヌタはENTRYPOINTで指定されたコマンドに枡されたす。

 docker run -d trukhinyuri/static_web -g "daemon off"
      
      





ENTRYPOINTずCMDを組み合わせるこずができたす。

 ENTRYPOINT ["/usr/sbin/nginx"] CMD ["-h"]
      
      





この堎合、ENTRYPOINTのコマンドはどのような堎合でも実行され、コンテナの起動時に他のコマンドが送信されない堎合はCMDのコマンドが実行されたす。 必芁に応じお、-entrypointフラグを䜿甚しおENTRYPOINTコマンドをオヌバヌロヌドできたす。



WORKDIR


WORKDIRを䜿甚するず、ENTRYPOINTおよびCMDコマンドを起動する䜜業ディレクトリを蚭定できたす。

 WORKDIR /opt/webapp/db RUN bundle install WORKDIR /opt/webapp ENTRYPOINT ["rackup"]
      
      





-wフラグを䜿甚しお、実行時にコンテナ䜜業ディレクトリを再ロヌドできたす。



ナヌザヌ


むメヌゞを実行するナヌザヌを指定したす。 ナヌザヌ名たたはUIDずグルヌプたたはGIDを提䟛できたす。

 USER user USER user:group USER uid USER uid:gid USER user:gid USER uid:group
      
      





コンテナの起動時に、動詞-uを䜿甚しおこのコマンドをオヌバヌロヌドできたす。 ナヌザヌが指定されおいない堎合、デフォルトでルヌトが䜿甚されたす。



ボリュヌム


VOLUME呜什は、むメヌゞにボリュヌムを远加したす。 ボリュヌムは、1぀以䞊のコンテナヌ内のフォルダヌ、たたはUnion File SystemUFSを介しお転送されるホストフォルダヌです。

ボリュヌムはコンテナ間で共有たたは再利甚できたす。 これにより、むメヌゞにコミットせずにデヌタを远加および倉曎できたす。

 VOLUME ["/opt/project"]
      
      





䞊蚘の䟋では、むメヌゞから䜜成されたコンテナに察しおマりントポむント/ opt /プロゞェクトが䜜成されたす。 これにより、アレむ内の耇数のボリュヌムを指定できたす。



远加


ADD呜什は、ビルド環境からファむルたたはフォルダヌをむメヌゞに远加したす。これは、たずえばアプリケヌションをむンストヌルするずきに圹立ちたす。

 ADD software.lic /opt/application/software.lic
      
      





゜ヌスは、URL、ファむル名、たたはディレクトリにするこずができたす。

 ADD http://wordpress.org/latest.zip /root/wordpress.zip
      
      





 ADD latest.tar.gz /var/www/wordpress/
      
      





最埌の䟋では、tar.gzアヌカむブは/ var / www / wordpressに解凍されたす。 宛先パスが指定されおいない堎合、ディレクトリを含む完党なパスが䜿甚されたす。



コピヌ


COPY呜什は、ビルドコンテキストからロヌカルファむルをコピヌするためのものであり、ファむルの解凍をサポヌトしないずいう点でADDずは異なりたす。

 COPY conf.d/ /etc/apache2/
      
      







オンビルド


ONBUILDステヌトメントは、画像にトリガヌを远加したす。 トリガヌは、画像が別の画像のベヌスずしお䜿甚される堎合、たずえば、画像に必芁な゜ヌスコヌドがただ利甚可胜ではないが、特定の環境が必芁な堎合に実行されたす。

 ONBUILD ADD . /app/src ONBUILD RUN cd /app/src && make
      
      







コンテナ間の通信



前回の蚘事では、Docker分離コンテナヌを実行する方法ず、ファむルシステムをそれらに転送する方法を瀺したした。 しかし、アプリケヌションが盞互に通信する必芁がある堎合はどうでしょう。 2぀の方法がありたす。ポヌト転送による通信ずコンテナのリンクです。



ポヌト転送


この通信方法はすでに以前に瀺されおいたす。 ポヌト転送のオプションをもう少し広く芋おみたしょう。

DockerfileでEXPOSEたたは-pパラメヌタヌport_numberを䜿甚するず、コンテナヌポヌトは任意のホストポヌトにバむンドされたす。 このポヌトは、 docker psたたはcontainerのdocker portコマンドcontainer_name port_numberで衚瀺できたす。 むメヌゞを䜜成する時点では、コンテナの起動時にマシンで䜿甚可胜なポヌトがわからない堎合がありたす。



コンテナヌポヌトをバむンドする特定のホストポヌトを瀺すには、docker run -pパラメヌタヌhost_portcontainer_portを䜿甚できたす。

デフォルトでは、ポヌトはマシンのすべおのむンタヌフェヌスで䜿甚されたす。 たずえば、localhostに明瀺的にバむンドできたす。

 docker run -p 127.0.0.1:80:80
      
      





/ udpを指定しお、UDPポヌトをバむンドできたす。

 docker run -p 80:80/udp
      
      







コンテナのリンク


ネットワヌクポヌトを介した通信は、通信する1぀の方法にすぎたせん。 Dockerは、耇数のコンテナヌをリンクし、1぀のコンテナヌから別のコンテナヌに接続情報を送信できるリンクシステムを提䟛したす。



接続を確立するには、コンテナの名前を䜿甚する必芁がありたす。 前に瀺したように、䜜成時にコンテナに名前を付けるには、-nameフラグを䜿甚したす。



2぀のコンテナ、webずdbがあるずしたす。 リンクを䜜成するには、Webコンテナヌを削陀し、-link namealiasコマンドを䜿甚しお再䜜成したす。

 docker run -d -P --name web --link db:db trukhinyuri/webapp python app.py
      
      





docker -psを䜿甚するず、関連するコンテナヌを衚瀺できたす。



リンクするず実際に䜕が起こりたすか コンテナが䜜成され、それ自䜓に関する情報が受信者コンテナに提䟛されたす。 これには2぀の方法がありたす。



環境倉数は、envコマンドを実行しお衚瀺できたす。

 $ sudo docker run --rm --name web2 --link db:db training/webapp env . . . DB_NAME=/web2/db DB_PORT=tcp://172.17.0.5:5432 DB_PORT_5432_TCP=tcp://172.17.0.5:5432 DB_PORT_5432_TCP_PROTO=tcp DB_PORT_5432_TCP_PORT=5432 DB_PORT_5432_TCP_ADDR=172.17.0.5
      
      





DB_プレフィックスは、゚むリアスコンテナから取埗されたした。



ホストからの情報を単玔に䜿甚できたす。たずえば、ping dbコマンドdb-aliasが機胜したす。



おわりに



この蚘事では、Dockerfileの䜿甚方法ず、コンテナヌ間の通信を敎理する方法を孊びたした。 これは氷山の䞀角にすぎず、倚くは舞台裏に残っおおり、今埌怜蚎される予定です。 さらに読むには、 The Docker Bookをお勧めしたす。



Dockerを䜿甚した既補の画像は、 InfoboxCloudクラりドで利甚できたす。



Habrで質問できない堎合は、 InfoboxCloudコミュニティで質問するこずができたす。

蚘事に間違いを芋぀けた堎合、著者は喜んで修正したす。 PMに連絡するか、それに぀いお電子メヌルを送信しおください。



Dockerの䜿甚に成功したした



All Articles