22
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

https-portalで簡単https対応!

Last updated at Posted at 2020-05-23

前提

【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオンを参考に設定したdocker-compose.ymlを使って、3層アーキテクチャの構築をしました。手元には以下3つのコンテナが作成されています。

  • ウェブサーバー(web)コンテナ
  • アプリケーションサーバー(app)コンテナ
  • データベースサーバー(db)コンテナ

また、VPSサーバーにこれらのファイルをアップロードし、任意のドメインでhttpの動作を確認しています。さて、https対応をするために、https-portalを使ってLet's encryptの更新を自動化したいと考えています。

作成しているdocker-compose.ymlは以下の通りです。

docker-compose.yml
version: "3"
services:
  app:
    build:
      context: ./docker/php
      args:
        - TZ=${TZ}
    volumes:
      - ./src:/work
      - ./logs:/var/log/php
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
    working_dir: /work
    environment:
      - DB_CONNECTION=mysql
      - DB_HOST=db
      - DB_DATABASE=${DB_NAME}
      - DB_USERNAME=${DB_USER}
      - DB_PASSWORD=${DB_PASS}
      - TZ=${TZ}
  web:
    image: nginx:1.17-alpine
    depends_on:
      - app
    ports:
      - 10080:80
    volumes:
      - ./src:/work
      - ./logs:/var/log/nginx
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    environment:
      - TZ=${TZ}
  db:
    image: mysql:8.0
    volumes:
      - db-store:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - TZ=${TZ}

volumes:
  db-store:

本記事の内容

https-portalを使用するために、docker-compose.ymldocker/nginx/default.confを修正します。

docker-compose.ymlの修正

docker-compose.ymlファイルを修正していきます。結論を述べると、https-portalコンテナを追加し、ウェブサーバー(web)コンテナのみ修正しました。

docker-compose.yml
version: "3"
services:
  app:
    build:
      context: ./docker/php
      args:
        - TZ=${TZ}
    volumes:
      - ./src:/work
      - ./logs:/var/log/php
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
    working_dir: /work
    environment:
      - DB_CONNECTION=mysql
      - DB_HOST=db
      - DB_DATABASE=${DB_NAME}
      - DB_USERNAME=${DB_USER}
      - DB_PASSWORD=${DB_PASS}
      - TZ=${TZ}
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    restart: always
    environment:
      DOMAINS: 'test.com(yourdomain) -> http://web:8000'
      # STAGE: 'production' # Don't use production until staging works
      # FORCE_RENEW: 'true'
  web:
    image: nginx:1.17-alpine
    ports:
    - 8000:8000
    depends_on:
      - app
    volumes:
      - ./src:/work
      - ./logs:/var/log/nginx
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    environment:
      - TZ=${TZ}
  db:
    image: mysql:8.0
    volumes:
      - db-store:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - TZ=${TZ}

volumes:
  db-store:

https-portalコンテナから見ていきましょう。restartまでは公式からそのまま持ってきています。

docker-compose.yml
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    restart: always
    environment:
      DOMAINS: 'test.com(yourdomain) -> http://web:8000'
      # STAGE: 'production' # Don't use production until staging works
      # FORCE_RENEW: 'true'

DOMAINSでは、左側でどのドメインを受けるか、右側でどのコンテナに転送するかを定義できます。左側にはhttpでアクセス可能なドメインを入力しましょう。また、今回はwebサーバーに転送するので、右側はこの例の通りに入力しましょう(ただし、port番号が被らなければ8000番以外でも可能です)。

docker-compose.yml
DOMAINS: 'test.com(yourdomain) -> http://web:8000'

また、本番環境の場合、STAGEのコメントを外しておきましょう。''内にはlocal or staging or productionを入れることができますが、localはLet's encryptが取得できません。

docker-compose.yml
# STAGE: 'production' # Don't use production until staging works

ウェブサーバー(web)コンテナでは、https-portalコンテナからの転送を受け取るためにポート番号を8000に変更しています。すでに述べたとおり、8000番以外を設定した場合は、その番号を設定します。

docker-compose.yml
  web:
    image: nginx:1.17-alpine
    ports:
      - 8000:8000
    depends_on:
      - app
    volumes:
      - ./src:/work
      - ./logs:/var/log/nginx
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    environment:
      - TZ=${TZ}

これでdocker-compose.ymlの修正は完了です。

docker/nginx/default.confの修正

default.confファイルを修正します。それぞれ環境が異なる可能性もありますので、どのファイルを修正するかはwebコンテナのvolumesを確認しましょう。

docker-compose.yml
   volumes:
      - ./src:/work
      - ./logs:/var/log/nginx
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf

それではdocker/nginx/default.confを編集します。以下が設定されているので、8000番に変更しましょう(番号はDOMAINSで変更したもの)。

default.conf
server {
    listern 80
...
default.conf
server {
    listern 8000
...

最後にdockerを再起動して数分待ち、httpsでページが表示されることを確認しましょう。

$ docker-compose down
$ docker-compose up -d

お疲れさまでした!

参考

22
30
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?