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なので、次のページを参考にインストールしました。
チュートリアル Part1をやってみた
Dockerの公式ページにあるチュートリアル Part1をやってみました。 helloworldを実行するだけなので、簡単です。
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派です。
それでは、本日はここまで。