Dockerfileとは何かを詳しく説明する前に、小さな実験をしてみましょう。前のセクションで取得したPythonイメージを覚えていますか?まず、docker run -itコマンドを使用してコンテナに入りましょう。-itパラメータの役割を思い出してください。コンテナに疑似TTYを割り当て、ユーザーが対話できるようにします。コンテナ内に入ったら、現在のディレクトリにあるすべてのファイルを一覧表示してみましょう:
[root@novita ~]# docker run -it python:3.7 /bin/bash
root@692f87774bf7:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@692f87774bf7:/#
次に、hello.pyというファイルを作成し、再度すべてのファイルを一覧表示してみましょう:
root@692f87774bf7:/# touch hello.py
root@692f87774bf7:/# ls
bin boot dev etc hello.py home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
hello.pyが作成されたことがわかります。次に、コンテナを終了し、同じdocker run -it python:3.7 /bin/bashコマンドを使用してコンテナの対話モードに再び入り、すべてのファイルを一覧表示してみましょう:
root@692f87774bf7:/# exit
exit
[root@novita ~]# docker run -it python:3.7 /bin/bash
root@65c767655e8a:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@65c767655e8a:/#
おそらくもう問題に気づいたでしょう。不思議なことに、先ほど作成したファイルが消えています。これは、コンテナ内で実行された操作はイメージを変更しないためです。コンテナはイメージの上に書き込み可能なレイヤーを追加するだけであり、まるで書道のテンプレートの上にトレーシングペーパーを置くようなものです。トレーシングペーパーに何を書いても、下の層には影響しません。この機能はVMスナップショットにいくぶん似ています。しかし、ここで問題があります。コンテナ内の操作がイメージを変更しないのであれば、コードをデプロイするたびに特定の操作を繰り返すことなく、迅速なデプロイを実現するにはどうすればよいでしょうか?それは非常に非効率的です。あなたがソーシャルメディアプラットフォームのテックリードだとします。突然バイラルイベントが発生し、膨大なユーザートラフィックを処理するために数百台のクラウドサーバーを迅速にスケールアップする必要があります。あなたのチームはアプリケーションのデプロイにDockerを選択しています。上記の方法でデプロイしようとすると、ユーザーは失望するかもしれません。サービスが復旧する頃には、ユーザーはすでに去ってしまっているかもしれません。
ここでDockerfileの登場です。Dockerの公式紹介によると:DockerはDockerfileの指示を読み取ることで自動的にイメージを構築できます。Dockerfileは、ユーザーがコマンドラインで呼び出してイメージを組み立てるためのすべてのコマンドを含むテキストドキュメントです。docker buildを使用すると、ユーザーは複数のコマンドライン命令を連続して実行する自動ビルドを作成できます。簡単に言えば、Dockerfileはコマンドラインからイメージを構築するために必要なすべてのコマンドを含むテキストドキュメントです。ブロックセットを所望のイメージに組み立てるための取扱説明書のようなものです。
実際のシナリオからDockerfileの構築方法を見ていきましょう。Pythonイメージを例にします。私のローカルマシン(コンテナ外)には、Optimal_Hotel_Matching.pyという名前のPythonスクリプトがあります。これはWebスクレイピングプログラムです。コンテナ内で実行してみましょう:予想通り、requests HTTPライブラリ(サードパーティモジュール)がPythonイメージにインストールされていないため、エラーが発生します。これは依存環境をセットアップする必要がある典型的なシナリオです。Dockerfileを使ってこの問題を解決してみましょう。
最初のDockerfileを作成する前に、いくつかの一般的なDockerfile命令を確認しておきましょう:
FROM: ビルドのベースイメージを指定します。MAINTAINER: イメージの作成者を名前とメールアドレスで記述します。RUN: Dockerfileで最も重要なコマンドの一つです。コンテナ内でコマンドを実行し、結果をコミットします。CMD: コンテナ起動時に実行するコマンドを指定します。COPY: ホストからコンテナのファイルシステムにファイルをコピーします。WORKDIR: Dockerfile内で後続のRUN、CMD、ENTRYPOINTコマンドの作業ディレクトリを設定します。
それでは、最初のDockerfileを作成して、requestsライブラリのインストールとスクリプトの実行というニーズに対応しましょう。考えられる解決策は次のとおりです:
FROM python:3.7 # ベースイメージをpython:3.7に指定
MAINTAINER ultra "tech@novita.ai" # イメージ作成者の名前とメールアドレス
RUN pip install requests # requestsライブラリをインストール
WORKDIR /dockerfileTest # 作業ディレクトリを設定
COPY . . # 現在のディレクトリの内容をコンテナにコピー
CMD ["python", "Optimal_Hotel_Matching.py"] # スクリプトを実行するコマンド
上記の内容をプロジェクトディレクトリ内のDockerfileという名前のファイルに保存します。次に、docker buildコマンドを使用してイメージをビルドし、識別しやすいようにタグを付けましょう:
[root@novita dockerfileTest]# docker build --tag python:requests .
Sending build context to Docker daemon 5.12 kB
...
ビルドが完了したら、docker imagesコマンドで確認します:
[root@novita dockerfileTest]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python requests 04f20acdc288 2 hours ago 926 MB
...
ローカルにrequestsというタグの新しいPythonイメージが生成されたことがわかります。このイメージを実行して、No module named 'requests'エラーが解消され、プログラムが期待通りに動作するか確認してみましょう。
[root@novita dockerfileTest]# docker run python:requests
Computing distance between 116.368816,39.866464 and 116.438946,39.921624
Computing distance between 116.370910,39.869603 and 116.438946,39.921624
...
成功しました!コンテナがコードを実行して終了しました。これで終わりでしょうか?この記事では、Dockerfileのシンプルな適用例を紹介しました。実際の企業の本番環境では、Dockerfileはより複雑になる傾向があります。
Novita AI は、あなたのAIの野望を実現するオールインワンのクラウドプラットフォームです。シームレスに統合されたAPI、サーバーレスコンピューティング、GPUアクセラレーションにより、AI駆動のビジネスを迅速に構築し拡張するための費用対効果の高いツールを提供します。インフラストラクチャの悩みを解消し、無料で始めましょう - Novita AIがあなたのAIの夢を現実にします。
おすすめの記事:
