dockerのWebサーバー(Apache)にiPhoneからHTTPSでアクセスする

環境

  • macOS Catalina バージョン10.15.7 (19H2)
  • Docker version 20.10.6, build 370c289
  • docker-compose version 1.29.1, build c34c88b2

ディレクトリ構成

./
  html/
    index.html
  docker.compose.yml

html/index.htmlファイルを作成する。

httpでアクセスできるように

docker-compose.ymlを以下のように編集する。

version: '3'

services:
  web:
    image: php:8.0-apache
    ports:
      - '80:80'
    volumes:
      - ./html:/var/www/html

コンテナを起動する。

$ docker-compose up -d

http:/localhost/にアクセスすると、html/index.htmlが表示される。

確認できたらコンテナを終了する。

$ docker-compose down

httpsでアクセスできるようにする

docker-compose.ymlを以下のように編集する。

version: '3'

services:
  web:
    image: php:8.0-apache
    # ports:
    #   - '80:80'
    volumes:
      - ./html:/var/www/html

  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '443:443'
    links:
      - web
    restart: always
    environment:
      DOMAINS: 'localhost -> http://web:80'
      STAGE: 'local'

コンテナを起動する。

$ docker-compose up -d

https:/localhost/ にアクセスできることを確認する。
※ 関連:macOSのGoogle ChromeでNET::ERR_CERT_INVALIDが出たときの対処法

確認ができたらコンテナを終了する。

$ docker-compose down

https://local.test/ でアクセスできるようにする

docker-compose.ymlを以下のように編集する。

version: '3'

services:
  web:
    image: php:8.0-apache
    # ports:
    #   - '80:80'
    volumes:
      - ./html:/var/www/html

  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '443:443'
    links:
      - web
    restart: always
    environment:
      # DOMAINS: 'localhost -> http://web:80'
      DOMAINS: 'local.test -> http://web:80'
      STAGE: 'local'

/etc/hostsファイルを編集し、以下の行を追加する。

127.0.0.1   local.test

コンテナを起動する。

$ docker-compose up -d

https://local.test/ にアクセスできることを確認する。

確認ができたらコンテナを終了する。

$ docker-compose down

iPhoneから https://local.test/ にアクセスできるようにする

macにDNSをインストールする。

$ brew install squid

DNSを起動する。

$ brew services start squid

iPhoneの設定アプリを起動し、「Wi-Fi」→「ⓘ」→「プロキシを構成」を選択する。

「手動」を選択して、「サーバー」にmacのIPアドレスを、「ポート」に「3128」を入力する。

iPhoneのsafariを起動し、https://local.test/にアクセスできることを確認する。

以上。

VagrantのCentOSの日時を変更する

プログラムの動作検証を行うため、Vagrantで使用しているcentOS7の日時を変更したい。

日時を変更するには

日時を変更するには、dateコマンドにsオプションを指定する。

日付を変更する 

date -s "2021-04-01"

時刻を変更する

date -s "10:01:02"

日時を変更する

date -s "2021-04-01 10:01:02"

日時の変更が反映されない問題

dateコマンドを実行すると日時が変更されるが、すぐに変更前の日時に戻ってしまう。

調べたところ、VirtualBoxのGuest AdditionsがゲストOSの日時をホストOSと同期しているそうだ。

日時の動機を止めてから、日時を変更すると、変更が反映された。

日時の同期を止める

service vboxadd-service stop

日時を変更する

date -s "2021-04-01 10:01:02"

動作検証が終わったら、同期を再開する。

service vboxadd-service start

LaravelでEloquentを使ってデータを更新しようとしたら”Column ‘updated_at’ in field list is ambiguous”

Laravel5.5でEloquentを使ってデータベースを更新しようとしたら”Column ‘updated_at’ in field list is ambiguous”エラーが発生した。

User::query()
    ->join('contacts', 'users.id', '=', 'contacts.user_id')
    ->update([...]);

Integrity constraint violation: 1052 Column ‘updated_at’ in field list is ambiguous

usersテーブルとcontactsテーブルの両方にupdated_atフィールドが存在するため、
どちらのテーブルのupdated_atフィールドを更新していいかわからず、エラーになっている。

対策としては、\Illuminate\Database\Eloquent\Builderのupdate()ではなく、
\Illuminate\Database\Query\Builderのupdate()を使用すれば良い。

具体的には、\Illuminate\Database\Eloquent\BuilderのgetQuery()で
\Illuminate\Database\Query\Builderを取得してからupdate()を実行する。

注意点としては、\Illuminate\Database\Query\Builderのupdate()を使用すると、
updated_atフィールドが更新されないので、明示的に更新する必要がある。

User::query()
    ->join('contacts', 'users.id', '=', 'contacts.user_id')
    ->getQuery()
    ->update([..., 'users.updated_at' => Carbon::now()]);

macOSのGoogle ChromeでNET::ERR_CERT_INVALIDが出たときの対処法

macOSのGoogle ChromeでNET::ERR_CERT_INVALIDが出たときの対処法。

自己証明書を使用した開発サーバーにmacOSのGoogle Chromeでアクセスすると、”NET::ERR_CERT_INVALID”エラーが表示された。

エラーを無視してページを表示するには、エラーページ上で以下のコマンドを入力する。

thisisunsafe

入力中は画面に何も表示されないが、入力が終わるとページが表示される。

参考