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アプリケーションにアクセスすることができます。
マッピングされているポートの確認
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の簡単なコンテナの操作をやってみました。 次はもう少し複雑なことをやってみたいです。