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 のイクメン日記