ヒトリ歩き

愚痴とかいろいろ書きます

Dockerを初めて試してみた

Dockerが何者なのか何となく知っているけど、実際に使ったことがないので今回、少し試してみました。

Dockerって何

Dockerはコンテナ型の仮想環境を提供するプラットフォームです。
仮想化はホストOSでゲストOSを稼働させるイメージがあります(KVMとか、VirtualBox)が、Dockerは、プロセス単体を別のOSで稼働しているようにすることができます。

準備

Dockerをインストールする環境は次の通りです。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.6
BuildVersion:   17G65

Dockerを使うにはDockerをインストールする必要があります。
私のマシンはMacなので、次のページを参考にインストールしました。

qiita.com

チュートリアル Part1をやってみた

Dockerの公式ページにあるチュートリアル Part1をやってみました。 helloworldを実行するだけなので、簡単です。

docs.docker.com

Dockerのバージョンを確認

$ docker --version
Docker version 18.06.0-ce, build 0ffa825

hellow-worldコンテナを作成、起動

$ Docker run hello-world

イメージ一覧を表示。

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              2cb0d9787c4d        6 weeks ago         1.85kB

イメージを削除する際は、docker rm <コンテナID> で削除できます。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
ad8e4a37f396        hello-world         "/hello"            15 minutes ago      Exited (0) 15 minutes ago                       jovial_engelbart
$ docker rm ad8e4a37f396
ad8e4a37f396
$  docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

チュートリアル Part2をやってみた

チュートリアル Part2は、Dockerfileを使用します。 内容としては、python2.7のイメージで必要なパケージをインストールを行い、Webアプリケーションを立ち上げます。 Dockerfileは、ファイルに記述した命令を読み込み、自動的にイメージを構築することができます。

空のディレクトリを作成し、以下の内容のDockerfileを作成します。

$ cat Dockerfile
# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py”]

Dockerfileに記述した命令の内容は次の通りです。

命令名 内容
FROM ベース・イメージを指定する
WORKDIR RUN、CMD、ENTRYPOINT、COPY、ADD命令実行時の作業ディレクトリを指定する
ADD <ソース>にある新しいファイルやディレクトリをコピー、あるいはリモートのURLからコピーする
RUN 既存イメージ上の新しいレイヤであらゆるコマンドを実行し、その結果をコミットする命令
EXPOSE 特定のネットワークポートをコンテナが実行時にListenすることをDockerに伝える
ENV 環境変数をセットする
CMD 命令を一度だけ指定できる

その他の命令や詳細な内容は、Dockerfileリファレンスを参照ください。

Dockerfile リファレンス — Docker-docs-ja 17.06.Beta ドキュメント

requirements.txt を作成します。requirements.txtは、Dockerfileに定義しているpip installで使用します。

$ cat requirements.txt 
Flask
Redis

app.pyを作成します。app.pyは、Webアプリケーションを実行するための処理を定義したファイルです。

$  cat 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)

Dockerイメージを作成します。-t オプションは、Dockerイメージのイメージ名を指定しています。

$ docker build -t friendlyhello .
・・・・・・・・
・・・・・・・・
Successfully built 994851aeeef9
Successfully tagged friendlyhello:latest
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
friendlyhello       latest              994851aeeef9        2 minutes ago       132MB
python              2.7-slim            40792d8a2d6d        3 weeks ago         120MB

コンテナの80ポートをDockerを動作させているマシンの4000ポートにマッピングしてアプリを起動します

$ 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)

4000ポートでアクセスは確認できたが、80ポートでのアクセスは確認できませんでした。 とりあえず、4000ポートでアクセスできたので良しとします。

動作しているコンテナを停止します。停止するには、docker container stop <コンテナID> を指定する。

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
05ab9b417a7a        friendlyhello       "python app.py"     16 seconds ago      Up 16 seconds       0.0.0.0:4000->80/tcp   zen_kilby
$ docker container stop 05ab9b417a7a
05ab9b417a7a
$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

まとめ

Vagrantに比べると、動かしたいミドルをサクッと動かせそうと感じた。 ・複数のイメージを連携させようとすると路頭に迷う気がしてならないので、私はまだVM派です。

それでは、本日はここまで。