ローカルの PHP+Postgres な docker 環境を Azure VM にデプロイする

インフラど素人のメモです。

手元に PHP と PostgreSQL(正確には PostGIS)の docker/docker-compose 環境があり、これをインターネットに公開したい(開発しているシステムを顧客にも試してもらいたい)。

Azure のクレジットが訳あって余ってるんで Azure VM を使います。

CoreOS という VMイメージ には最初から docker が入っているらしいので、 Azure の Virtual Machine から CoreOS を検索して stable なイメージを起動。ケチなのでスペックは 「Standard B1ms (1 vcpu 数、2 GB メモリ)」。 あと自動シャットダウンも付けといたほうが無難。とりあえず user/password でログインできるようにした。 あ、ポートも開けておこう。 HTTP/HTTPS/SSH くらい。Postgres に繋ぎたいなら 5432 も必要。

この VM には docker は入っているが docker-compose は入ってないので 次に、

にしたがって docker-compose をインストール。

さらに、このままだと docker-compose up をしたときに "Couldn't connect to Docker daemon at http+docker://localhost - is it running?" なんてエラーが出るので、

も実施。

次にローカルPCにある Dockerfiledocker-compose.yml やデータファイルを圧縮して VM に転送する。

にある通り、 scp ./docker.zip amay077@xx.xx.xxx.xxx:/home/amay077 のようなコマンドでアップロードできる。

今回使う docker-compose.yml はこんな感じ。

version: "3"

services:
  php:
    # image: php:5.6.31-apache
    build: ./php
    expose:
      - "80"
    ports:
      - "80:80"
    volumes:
      - ../php/html:/var/www/html
    command: php -S 0.0.0.0:80
    links:
      - db
  db:
    image: mdillon/postgis:9.5
    # build: ./db
    ports:
      - "5432:5432"
    volumes:
      - ../../share/sql:/var/sql
      - ../../share/postgresql/data:/var/lib/postgresql/data
    environment:
      - "POSTGRES_USER=postgres"
      - "POSTGRES_PASSWORD=xxxxxxxx"

相対パスの配置に気をつけて、ローカルと同じようなディレクトリ構成にする。

そして、 docker-compose up を実行! バックグラウンドで動かすなら docker-compose up -d 。 初回はイメージのダウンロードに時間がかかるが、以下のようなログが出て起動完了したっぽい(このログはローカルと同じだ)。

Creating network "docker_default" with the default driver
Creating docker_db_1 ... done
Creating docker_php_1 ... done
Attaching to docker_db_1, docker_php_1
db_1   | LOG:  database system was shut down at 2018-09-18 16:19:41 UTC
db_1   | LOG:  MultiXact member wraparound protections are now enabled
db_1   | LOG:  database system is ready to accept connections
db_1   | LOG:  autovacuum launcher started

外部からのルーティングとかよく分かってないけれど、とりあえず VM のグローバルIP で http アクセスしてみる。

…と、よく分からんが PHP のサイトが見られた。 docker-compose.yml の設定で 80 ポートは docker に流す、的な設定がしてあるんですかね。

とりあえず目的は果たせた。