にわとりプログラマーの備忘録

覚えたことをすぐ忘れてしまう、自分のための備忘録ブログです。

Dockerで簡単なウェブアプリケーションを実行してみた

Docker for Mac が正式にリリースされたので、簡単に触ってみようと思い、公式リファレンスにあるRun a simplle applicationを試してみました。

Doker for Macをインストール

https://docs.docker.com/docker-for-mac/からStable版のインストーラーをダウンロードして実行します。
表示される実行手順に沿って、dockerをインストールします。

インストールの確認

dockerをインストールしたら、dockerを起動します。
右上にdockerアイコン(クジラのマーク)が表示されていれば、起動は完了しています。
ターミナルを起動して、docker run hello-worldと入力してみます。
無事インストールされていれば、下記のように表示されます。

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
535020c3e8ad: Pull complete
af340544ed62: Pull complete
Digest: sha256:a68868bfe696c00866942e8f5ca39e3e31b79c1e50feaee4ce5e28df2f051d5c
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker Engine CLI client contacted the Docker Engine daemon.
2. The Docker Engine daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker Engine daemon created a new container from that image which runs the
   executable that produces the output you are currently reading.
4. The Docker Engine daemon streamed that output to the Docker Engine CLI client, which sent it
   to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com

For more examples and ideas, visit:
https://docs.docker.com/userguide/

docker ps -aと入力することで、システム上で動作中の全てのコンテナを確認できます。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
b1f484d71bee        hello-world         "/hello"                 16 seconds ago      Exited (0) 15 seconds ago                       high_pasteur
610780e466ba        hello-world         "/hello"                 9 minutes ago       Exited (0) 9 minutes ago                        elated_newton
33dbe3b0329c        nginx               "nginx -g 'daemon off"   37 minutes ago      Exited (0) 13 minutes ago                       nostalgic_bohr
5436f43d1c8a        hello-world         "/hello"                 38 minutes ago      Exited (0) 38 minutes ago                       suspicious_wright

簡単なアプリケーションを実行してみる

実際にRun a simplle applicationを試していきます。
以下の記述は、ほぼ上記ページの和訳になります。

練習用のwebアプリケーションを実行

docker runコマンドを利用して、PythonのFlask applicationを実行してみます。

$ docker run -d -P training/webapp python app.py

-dオプションは、Dockerコンテナをバックグラウンドで実行することを指定します。 -Pオプションは、ホストのネットワークのポートとコンテナ内のポートをマッピングするオプションです。

実行したDockerコンテナを確認する

docker psコマンドを利用することで、起動中のコンテナを確認することができます。

$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
5ad9fed174e9        training/webapp     "python app.py"     5 seconds ago       Up 5 seconds        0.0.0.0:32770->5000/tcp   silly_almeida

-lオプションを指定することで、コンテナの詳細情報を表示することができます。

ブラウザ上で確認してみる

PORTS
0.0.0.0:32770->5000/tcp

上記のネットワークポートのカラムを見てみると、ホストのポート32770番がコンテナ内の5000番ポートにマッピングされていることが、分かります。

htpp://localhost:32700にアクセスすることで、実行中のwebアプリケーションにアクセスすることができます。

f:id:t-yng:20160822232134p:plain

マッピングされているポートの確認

docker portコマンドを利用することで、コンテナ内の特定のポート番号にマッピングされているホストのポートを調べることができます。

$ docker port silly_almeida 5000
0.0.0.0:32770

ログを確認

docker logsコマンドで、コンテナのログを表示することができます。

$ docker logs -f silly_almeida
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
172.17.0.1 - - [22/Aug/2016 13:41:28] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [22/Aug/2016 13:41:28] "GET /favicon.ico HTTP/1.1" 404 -

-fオプションは、ログをリアルタイムで表示します。

コンテナ上で実行されているプロセスを確認

docker topコマンドを利用します。

$ docker top silly_almeida
PID                 USER                TIME                COMMAND
2918                root                0:00                python app.py

上記の実行結果では、コンテナ上でpyton app.pyプロセスのみが実行中であることが確認できます。

コンテナの詳細情報を表示

docker inspectを利用します。 上記コマンドはJSON形式でコンテナの詳細設定等の情報を返してくれます。

$ docker inspect silly_almeida
[
    {
        "Id": "5ad9fed174e9005f4da948bc3d2d6f60761a0dd5f0b2772ef3ccd6abq3224d633",
        "Created": "2016-08-22T13:38:46.052823893Z",
        "Path": "python",
        "Args": [
            "app.py"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2918,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2016-08-22T13:38:46.621722368Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
        "ResolvConfPath": "/var/lib/docker/containers/5ad9fed174e9005f4da948bc3d2d6f60761a0dd5f0b2772ef3ccd6ab3224d633/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/5ad9fed174e9005f4da948bc3d2d6f60761a0dd5f0b2772ef3ccd6ab3224d633/hostname",
...

コンテナを停止

docker stopコマンドを利用することで、コンテナを停止させます。

$ docker stop silly_almeida
silly_almeida

docker ps -lでコンテナの状態を確認してみます。

$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
5ad9fed174e9        training/webapp     "python app.py"     26 minutes ago      Exited (137) 20 seconds ago                       silly_almeida

停止しています。

コンテナを再起動させる

docker startでコンテナを再起動できます。

$ docker start silly_almeida
silly_almeida

コンテナを削除

最後に、今回のコンテナは特に必要ないので削除します。 コンテナの削除にはdocker rmを使います。

$ docker rm silly_almeida
Error response from daemon: You cannot remove a running container 5ad9fed174e9005f4da948bc3d2d6f60761a0dd5f0b2772ef3ccd6ab3224d633. Stop the container before attempting removal or use -f

削除に失敗しました。 Dockerでは起動中のコンテナは削除できないので、削除したい場合は一度コンテナを停止させる必要があります。

$ docker stop silly_almeida
silly_almeida

$ docker rm silly_almeida
silly_almeida

まとめ

dockerの簡単なコンテナの操作をやってみました。 次はもう少し複雑なことをやってみたいです。