はじまる

適当な事を適当に書く

docker やり直しメモ(2)

パート2:コンテナ

Get Started, Part 2: Containers | Docker Documentation の内容をやります。

コンテンツ

  1. コンテナのイメージを新規作成する
  2. コンテナをフォアグラウンドで起動する
  3. コンテナをバックグラウンドで起動する
  4. コンテナを 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アプリが立ち上がってる状態。

gyazo.com

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 にプッシュされました。

gyazo.com