こうりんのブログ

主に勉強した事を書いていくつもり

GCEインスタンスにコンテナをデプロイしてサーバを動かしてみる

昨日の続き.
コンテナイメージをDocker Hubに公開し, GCEインスタンスを作成した際に自動でコンテナイメージを取得・展開するところまでやりました.

今日はインスタンス上にコンテナが展開された時に, アプリケーションが動作しているのを確認します.
簡単なWebサーバプログラムをリポジトリに用意し, コンテナ展開時にpullして起動するようにしてみます.

プログラムの作成とDockerfileへの追加

Dockerfileと同じ階層にWebサーバのコードと表示させるHTMLを配置し, gitにpushする.
(ソースコードは別のリポジトリでも構わない, 今回は一緒のリポジトリにした)

simpleserver.py
import http.server

server_address = ("", 8080)
handler_class = http.server.SimpleHTTPRequestHandler
simple_server = http.server.HTTPServer(server_address, handler_class)
simple_server.serve_forever()
index.html
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Test</title>
  </head>
  <body>
    <p>This is Test Page</p>
  </body>
</html>

次にDockerfileを編集する.
CMDはデプロイされて実際にコンテナが起動する時に実行するコマンドを指定する.
今回はgit pullしてサーバを起動させる.

Dockerfile
FROM coreos/apache
RUN \
    apt-get update && \
    apt-get install -y wget curl git && \
    # C/C++
    apt-get install -y build-essential make && \
    # Python3.6
    apt-get install -y zlib1g-dev libssl-dev \
        libreadline-dev libsqlite3-dev libbz2-dev \
        libncurses5-dev libgdbm-dev liblzma-dev \
        tk-dev zlibc && \
    cd /usr/local/src && \
    wget --no-check-certificate https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz && \
    tar zxvf Python-3.6.3.tgz && \
    cd Python-3.6.3 && \
    ./configure && \
    make && \
    make altinstall && \
    cd ~ && \
    curl -kL https://bootstrap.pypa.io/get-pip.py | python3.6 && \
    #WebServer
    cd /home && \
    git clone (リポジトリのアドレス)
WORKDIR /home/(リポジトリ名)
EXPOSE 8080
CMD \
    git pull && \
    python3.6 /home/(リポジトリ名)/simpleserver.py

ローカル環境で動作を確認してみる.
buildしてrunをする.
runの-dオプションを使うと, バックグラウンドでコンテナを実行する.
-pはポートフォワーディングの設定で, (ホストのポート):(コンテナのポート)で指定する.
ホストのIPアドレスと指定したポートで接続すると, 自動でコンテナの指定のポートに繋げてくれる.

docker build ./ -t (アカウント名)/(イメージ名)
docker run -d -p 8080:8080 -t (アカウント名)/(イメージ名)

macからWebサーバが起動しているか確認する.
(ホストのIP):8080で繋がるが, 今回コンテナはdocker-machine上で動作しているため, docker-machineのIPを指定する.
docker-machineのIPは以下のコマンドで確認できる.

docker-machine ip default

curlを叩いて, HTMLが吐けば正常に動作している.

curl (docker-machineのIP):8080

終了する場合は, docker psでコンテナIDを確認して, docker rmで終了.

GCEインスタンスに展開

前回同様, コンテナイメージの所で, Docker Hubのリポジトリのアドレスを指定してGCEのインスタンスを作成する.
VMインスタンスのリストから ssh を押すとブラウザ上でターミナルが開く.
docker ps でコンテナが立ち上がってるのを確認して, ローカル同様にcurlを叩く.
ifconfigをして docker0 となってるインターフェースのIPがdockerのコンテナへ繋ぐIPアドレスである.
コンテナが起動していれば, 正常にHTMLが取得できる.

ただ, ここまではGCEインスタンス内での通信なので, 最後に外部から接続できるようにする.
コンソールからネットワーキング >> ファイアウォールルールを選択し, ファイアウォールルールの作成を押す.
以下の設定は, 全ての送信元から8080ポートを使用したTCPトラフィックを受信する設定なので注意.

  • ターゲットを ネットワーク上のすべてのインスタンス にする
  • ソースフィルタを IP範囲 にする
  • ソースIPの範囲を 0.0.0.0/0 にする
  • プロトコルとポートを 指定したプロトコルとポート にし, 設定を tcp:8080 にする.

設定し, GCEのインスタンスの外部IPと8080ポートを指定してブラウザでアクセスするとページが表示される.

参考

みんなのPython Webアプリ編 - PythonでWebサーバを作る | TRIVIAL TECHNOLOGIES 4 @ats のイクメン日記

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

run — Docker-docs-ja 17.06.Beta ドキュメント