パート2:コンテナ
Get Started, Part 2: Containers | Docker Documentation の内容をやります。
コンテンツ
- コンテナのイメージを新規作成する
- コンテナをフォアグラウンドで起動する
- コンテナをバックグラウンドで起動する
- コンテナを Dokcer Hub にpush する
1. コンテナのイメージを新規作成する
チュートリアルにあるものを利用します。
Dockerfile + アプリ = イメージ
です。
イメージを実行状態にしたものがコンテナです。
Dockerfile を新規作成する
空のディレクトリを作成し、その直下に下記のファイルを作成します。Python で書いた Webアプリですね。
Dockerfile
# FROM :ベースとなる既存のdockerイメージをベースに新たにイメージを作成します。イメージは DockerHubから取得されます。 FROM python:2.7-slim # コンテナの内部の作業ディレクトリを /app に設定します。 WORKDIR /app # カレントディレクトリの内容をコンテナの内部の /app にコピーします。 ADD . /app # 必要なライブラリをインストールするコマンドを実行します。 RUN pip install --trusted-host pypi.python.org -r requirements.txt # コンテナの80番ポートをコンテナ外部に公開します。 EXPOSE 80 # コンテナ内部の環境変数を設定します。 ENV NAME World # コンテナ起動時に app.py を実行します。 CMD ["python", "app.py"]
アプリを作成する。
Dockerfile と同じディレクトリに、Pyhton のアプリを作成します。必要なライブラリを requirements.txt
に記述します。あくまでイメージで必要になるライブラリを定義するために記述しているだけなので、pip install
でローカルにインストールする必要はありません。
requirements.txt
Flask Redis
app.py
from flask import Flask from redis import Redis, RedisError import os import socket # Connect to Redis redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2) app = Flask(__name__) @app.route("/") def hello(): try: visits = redis.incr("counter") except RedisError: visits = "<i>cannot connect to Redis, counter disabled</i>" html = "<h3>Hello {name}!</h3>" \ "<b>Hostname:</b> {hostname}<br/>" \ "<b>Visits:</b> {visits}" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) if __name__ == "__main__": app.run(host='0.0.0.0', port=80)
Dockerfile + アプリ = イメージ
現在、当該ディレクトリは下記のような状態になっていると思います。
$ ls Dockerfile app.py requirements.txt
ここで下記のコマンドを実行することで、イメージが新規作成されます。-t
はイメージに付加するタグネームです。
docker build -t friendlyhello .
イメージが作成されたかどうか下記のコマンドで確認できます。ここでは friendlyhello
があればイメージ作成成功です。
$ docker image ls REPOSITORY TAG IMAGE ID friendlyhello latest 326387cea398
2.コンテナをフォアグラウンドで起動する
作成したイメージをコンテナとして稼働させてみます。
$docker run { REPOSITORY or CONTAINER ID }
でイメージからコンテナを作成します。
~/H/docker ❯❯❯ docker run -p 4000:80 friendlyhello * Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:80/ (Press CTRL+C to quit) ~/H/docker ❯❯❯ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ea0dcd8542e0 friendlyhello "python app.py" 5 seconds ago Up 11 seconds 0.0.0.0:4000->80/tcp festive_aryabhata ~/H/docker ❯❯❯
0.0.0.0:4000 でWebアプリが立ち上がってる状態。
Ctrl+C で doker run のプロセスを止める
~/H/docker ❯❯❯ docker run -p 4000:80 friendlyhello * Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:80/ (Press CTRL+C to quit) 172.17.0.1 - - [07/Jun/2018 06:07:44] "GET / HTTP/1.1" 200 - 172.17.0.1 - - [07/Jun/2018 06:07:44] "GET /favicon.ico HTTP/1.1" 404 - 172.17.0.1 - - [07/Jun/2018 06:14:10] "GET / HTTP/1.1" 200 - ^C% ~/H/docker ❯❯❯ ~/H/docker ❯❯❯ docker ps #プロセスも消えてる CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ~/H/docker ❯❯❯ # localhost:4000 を取得しようしても止まってるのでエラー。 ~ ❯❯❯ curl http://localhost:4000 curl: (7) Failed to connect to localhost port 4000: Connection refused
3.コンテナをバックグラウンドで起動する
今度は同じコンテナをバックグラウンドで起動してみる。
#コンテナをバックグラウンド -d で実行 ~/H/docker ❯❯❯ docker run -d -p 4000:80 friendlyhello ba8ca7d291674ff232cb40da3da63a56a998f852e90b088a45ae1e4471943476 ~/H/docker ❯❯❯ #プロセス一覧に復活 ~/H/docker ❯❯❯ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ba8ca7d29167 friendlyhello "python app.py" About a minute ago Up About a minute 0.0.0.0:4000->80/tcp nostalgic_torvalds ~/H/docker ❯❯❯ #取得OK ~ ❯❯❯ curl http://localhost:4000 ⏎ <h3>Hello World!</h3><b>Hostname:</b> ba8ca7d29167<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>% ~ ❯❯❯
バックグラウンドでコンテナが起動している場合、コンテナIDを指定して停止させる。
~/H/docker ❯❯❯ docker container stop ba8ca7d29167 ba8ca7d29167 ~/H/docker ❯❯❯
4. コンテナを Dokcer Hub にpush する
Docker アカウントは作成してある状態です。
~/H/docker ❯❯❯ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: me Password: Login Succeeded ~/H/docker ❯❯❯ docker tag friendlyhello me/get-started:part2 ~/H/docker ❯❯❯ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE friendlyhello latest 4490a5b791bd About an hour ago 132MB me/get-started part2 4490a5b791bd About an hour ago 132MB python 2.7-slim d0d1b97dd328 27 hours ago 120MB registry.heroku.com/hoge-docker-cr/web latest 6f491d46a039 8 months ago 59.1MB alpine latest 7328f6f8b418 11 months ago 3.97MB atlassianlabs/localstack latest 5bf4f14dfdb7 13 months ago 1.05GB bash latest a0a73a853323 14 months ago 12.2MB redis latest 45c3ea2cecac 16 months ago 183MB hello-world latest 48b5124b2768 16 months ago 1.84kB kitematic/hello-world-nginx latest 03b4557ad7b9 2 years ago 7.91MB ~/H/docker ❯❯❯ docker push me/get-started:part2 ⏎ The push refers to repository [docker.io/me/get-started] 7b24058df639: Pushed b7b6739a7222: Pushed c6592c269152: Pushed 20f93bdcee9c: Mounted from library/python 21b24882d499: Mounted from library/python db9dabc5cfee: Mounted from library/python d626a8ad97a1: Mounted from library/python part2: digest: sha256:38d9d86ea90c99880b0456eb05e1bf009e5e4a7fea72aecd7daeb2d28a590d69 size: 1787
docker hub にプッシュされました。