Dockerは、コンテナを利用してアプリケーションの作成、デプロイ、実行を容易にする技術です。
本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。
Dockerとは?
Dockerは、コンテナを利用してアプリケーションの作成、デプロイ、実行を容易にする技術です。コンテナを使うことで、開発者はアプリケーションに必要なすべてのコンポーネントをパッケージ化し、後からパッケージとして出荷することができます。また、同じサーバー上でより多くのアプリケーションを稼働させることも可能になります。
Dockerを使えば、コンテナ上で動作しているアプリケーションは互いに隔離されているため、より高いレベルのセキュリティを確保することができます。さらに、Dockerは各コンテナが独自のリソースを持っていることを保証するので、アプリケーションは割り当てられたリソースのみを使用することになります。
前提条件
このガイドを開始する前に、以下のものが必要です。
- Alibaba Cloud ECS Linuxインスタンス。まだLinuxインスタンスをセットアップしていない場合は、この記事で様々なセットアップ方法を紹介します。
- Docker
- Python 2.7
Dockerのインストール
ssh コマンドを使ってサーバにログインします。
$ ssh root@47.88.220.88
Ubuntuのパッケージを更新します。
$ sudo apt-get update
以下のコマンドで最新版のDockerをインストールします。
$ sudo apt-get install docker
Dockerが正しくインストールされていることを確認するには、以下のコマンドを実行します。
$ sudo docker run hello-world
正しく実行すれば、上記のコマンドでインスタンスがテストイメージをダウンロードしてコンテナ内で実行できるようになるはずです。
Dockerでのコンテナとイメージ
Alibaba Cloud ECSインスタンスでは、イメージを使用して同じ構成のECSクラスタを作成することができます。同様に、Dockerコンテナにもイメージがあります。概念的には、両者は非常に似ています。Dockerの公式ドキュメントに基づいています。
コンテナイメージは、軽量でスタンドアロンの実行可能なソフトウェアのパッケージであり、それを実行するために必要なすべてのものが含まれています: コード、ランタイム、システムツール、システムライブラリ、設定。
実行中のコンテナは、$ sudo docker ps
を実行することで見ることができます。
一方、イメージとは、コンテナのスナップショットのような不活性で不変なファイルのことです。イメージは build コマンドで作成され、run コマンドで起動するとコンテナを生成します。
イメージは $ sudo docker images
を実行することで見ることができます。
Djangoアプリケーションを構築する
まずはDjangoをインストールしてDjangoアプリケーションを作成してみましょう。
$ sudo pip install django==1.9
$ django-admin startproject djangoapp
要件ファイル
djangoapp ディレクトリ内に要件ファイルを作成し、アプリケーションが必要とする依存関係を定義します。
$ cd djangoapp
$ nano requirements.txt
以下の依存関係を追加します。
#requirements.txt
Django==1.9
gunicorn==19.6.0
Dockerファイルの作成
Dockerには、Dockerファイルから命令を読み込んで自動的にイメージを構築する機能があります。Dockerファイルには、Dockerがイメージを構築するために使用するすべてのコマンドと命令が含まれています。
Dockerfileで使用される基本的なコマンドをいくつか定義してみましょう。
- FROM - 新しいビルドステージを初期化し、その後の命令のためのベースイメージを設定します。そのため、有効なDockerfileはFROM命令で始まらなければなりません。
- RUN - 指定されたコマンドを実行します。
- ADD - コンテナにファイルをコピーします。
- EXPOSE - 実行時にコンテナが指定されたネットワークポートをリッスンしていることをDockerに通知します。
- CMD - 実行中のコンテナにデフォルトを提供します。 では、Dockerfileというファイルを作成してみましょう。
$ nano Dockerfile
まずはDockerfileに必要なプロパティをすべて定義してみましょう。ベースイメージとメンテナ名を定義します。
# base image
FROM python:2.7
# File Author / Maintainer
MAINTAINER Esther
次に、コンテナ内のアプリケーションフォルダをコピーし、CMDが実行されるディレクトリを定義します。
# Copy the application folder inside the container
ADD . /usr/src/app
# set the default directory where CMD will execute
WORKDIR /usr/src/app
最後にデフォルトのコマンドを設定して実行します。
CMD exec gunicorn djangoapp.wsgi:application --bind 0.0.0.0:8000 --workers 3
最終的なDockerfileは以下のようになるはずです。
# set the base image
FROM python:2.7
# File Author / Maintainer
MAINTAINER Esther
#add project files to the usr/src/app folder
ADD . /usr/src/app
#set directoty where CMD will execute
WORKDIR /usr/src/app
COPY requirements.txt ./
# Get pip to download and install requirements:
RUN pip install --no-cache-dir -r requirements.txt
# Expose ports
EXPOSE 8000
# default command to execute
CMD exec gunicorn djangoapp.wsgi:application --bind 0.0.0.0:8000 --workers 3
Dockerイメージの構築
以下のコマンドを実行して、dockerイメージを構築します。
$ sudo docker build -t django_application_image .
Sending build context to Docker daemon 12.8kB
Step 1/7 : FROM python:2.7
---> 2863c80c418c
Step 2/7 : ADD . /usr/src/app
---> 09b03ff8466e
Step 3/7 : WORKDIR /usr/src/app
Removing intermediate container a71a3bf6af90
---> 3186c92adc85
Step 4/7 : COPY requirements.txt ./
---> 701c0be5e039
Step 5/7 : RUN pip install --no-cache-dir -r requirements.txt
---> Running in ed034f98db74
Collecting Django==1.9 (from -r requirements.txt (line 1))
Downloading Django-1.9-py2.py3-none-any.whl (6.6MB)
Collecting gunicorn==19.6.0 (from -r requirements.txt (line 2))
Downloading gunicorn-19.6.0-py2.py3-none-any.whl (114kB)
Installing collected packages: Django, gunicorn
Successfully installed Django-1.9 gunicorn-19.6.0
Removing intermediate container ed034f98db74
---> 1ffd08204a07
Step 6/7 : EXPOSE 8000
---> Running in 987b48e1a4ef
Removing intermediate container 987b48e1a4ef
---> ef889d6e8fcb
Step 7/7 : CMD exec gunicorn djangoapp.wsgi:application --bind 0.0.0.0:8000 --workers 3
---> Running in 4d929e361d0f
Removing intermediate container 4d929e361d0f
---> c6baca437c64
Successfully built c6baca437c64
Successfully tagged django_application_image:latest
構築されたイメージは、マシンのローカルのDockerイメージレジストリにあります。イメージを確認するには、$ sudo docker images
を実行します。
REPOSITORY TAG IMAGE ID CREATED SIZE
django_application_image latest c6baca437c64 34 minutes ago 702MB
アプリを実行する
$ sudo docker run -p 8000:8000 -i -t django_application_image
[2018-03-25 12:29:08 +0000] [1] [INFO] Starting gunicorn 19.6.0
[2018-03-25 12:29:08 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000
[2018-03-25 12:29:08 +0000] [1] [INFO] Using worker: sync
[2018-03-25 12:29:08 +0000] [8] [INFO] Booting worker with pid: 8
[2018-03-25 12:29:08 +0000] [9] [INFO] Booting worker with pid: 9
[2018-03-25 12:29:08 +0000] [10] [INFO] Booting worker with pid: 10
gunicorn がアプリにサービスを提供しているというメッセージがhttp://0.0.0.0:8000に表示されます。 サーバーの IP (ip_address:8000) に移動し、Django のウェルカムページが表示されるはずです。
実行中のコンテナを見るには
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
100695b41a0a django_application_image "/bin/sh -c 'exec gu…" 13 seconds ago Exited (0) 4 seconds ago hopeful_easley
結論
Dockerを使っていると、時としていくつかの問題に直面することがあります。エラーが発生したときに最初にすべきことは、Dockerのログファイルをチェックすることです。
Dockerやその他のコンテナは、アプリケーション開発のための従来の仮想マシンの強力な代替手段です。Alibaba Cloud上でコンテナを実行する方法の詳細については、コンテナサービスのページをご覧ください。
アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ