20211009のdockerに関する記事は11件です。

【備忘録】Docker + Rails6 + React + TypeScript で環境構築する

自分のアウトプット用のメモです。 Docker 上に Rails プロジェクトを作成する(MySQLは5.7) $ mkdir -p ~/project/myapp $ cd ~/project/myapp $ mkdir -p containers/nginx $ mkdir environments Gemfile作成 $ cd ~/project/myapp $ touch Gemfile.lock $ vim Gemfile # Gemfile source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } gem "rails" Dockerfile作成 $ vim Dockerfile FROM ruby:2.7.2 RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && apt-get update \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list RUN apt-get update -qq && apt-get install -y build-essential \ libpq-dev \ nodejs \ yarn RUN mkdir /myapp ENV APP_ROOT /myapp WORKDIR $APP_ROOT ADD ./Gemfile $APP_ROOT/Gemfile ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock RUN bundle install ADD . $APP_ROOT docker-composeファイル作成 $ cd ~/project/myapp $ vim docker-compose.yml version: "3" services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: demo-db ports: - "3306:3306" volumes: - demo-db:/var/lib/mysql web: build: . command: rails s -p 3001 -b '0.0.0.0' volumes: - .:/myapp ports: - "3001:3001" links: - db volumes: demo-db: docker-compose run コマンドで Rails プロジェクトの作成。 $ cd ~/project/myapp $ docker-compose run web rails new . --force --no-deps --database=mysql Rails プロジェクトを作成できたら、build する。 $ docker-compose build データベースの作成 config/database.yml を編集する。 $ vim config/database.yml config/database.yml ## 編集した箇所のみ抜粋 default: &default password: password # docker-compose.yml の MYSQL_ROOT_PASSWORD: で設定したパスワード host: db # localhost → db に変更 データベースを作成する。 $ docker-compose run web rake db:create Docker の起動 $ docker-compose up http://0.0.0.0:3001 にアクセスすると、Rails の初期画面が表示される。 この時 shell に以下のようなエラーが出るときは、 shell Cannot render console from 172.20.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 config/environments/development.rb に config/environments/development.rb Rails.application.configure do config.web_console.permissions = '0.0.0.0/0' end を追加すればエラーログが消える。 React の導入 react-rail を使って react を rails プロジェクトに導入する。 Gemfile gem 'react-rails' 再度 build を実行する。 shell $ docker-compose run web rails webpacker:install # OR (on rails version < 5.0) rake webpacker:install $ docker-compose run web rails webpacker:install:react # OR (on rails version < 5.0) rake webpacker:install:react $ docker-compose run web rails generate react:install 実際に React が導入されているか確認する。 controller の作成。 shell $ docker-compose run web rails g controller sample index 以下のファイルが作成されていれば OK。 app/controllers/sample_controller.rb class SampleController < ApplicationController def index end end react コンポーネントファイルの作成。 shell $ docker-compose run web rails g react:component Sample app/javascript/components/Sample.tsx が作成されるので、以下のように修正する。 app/javascript/components/Sample.jsx import React from "react"; const Sample = () => { return <>this is react sample.</>; }; export default Sample; view の作成。 app/views/sample/index.html.erb を作成し react コンポーネントを読み込む。 app/views/sample/index.html.erb <%= react_component 'Sample' %> ルーティングを追加する。 config/routes.rb Rails.application.routes.draw do get "sample", to: "sample#index" end Docker を起動し、http://0.0.0.0:3001/sample にアクセスする。「this is react sample.」の文字が表示されていれば OK。 TypeScript の導入 React が導入できたので、以下コマンドで TypeScript 導入する。 shell $ docker-compose run web bundle exec rails webpacker:install:typescript $ docker-compose run web yarn add @types/react @types/react-dom 無事インスールが終えたら sample.jsx の拡張子を sample.tsx に修正する。 app/javascript/components/Sample.tsx import React from "react"; const Sample: React.FC = () => { return <>this is typescript sample.</>; }; export default Sample; ここまで修正したら再度 http://0.0.0.0:3001/sample にアクセスし、「this is typescript sample.」の文字が表示されていることを確認する。 JS の修正時にホットリロードさせる Docker の場合は $ bin/webpack-dev-server のコマンドを直接叩くとエラーがでるっぽいので docker-compose.yml を修正した。 docker-compose.yml version: "3" services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: rails-front-demo-db ports: - "3306:3306" volumes: - rails-db:/var/lib/mysql web: &web build: . command: rails s -p 3001 -b '0.0.0.0' environment: WEBPACKER_DEV_SERVER_HOST: webpacker volumes: - .:/app_name ports: - "3001:3001" links: - db webpacker: <<: *web command: bundle exec bin/webpack-dev-server depends_on: [] environment: WEBPACKER_DEV_SERVER_HMR: "true" WEBPACKER_DEV_SERVER_HOST: 0.0.0.0 ports: - "3035:3035" volumes: rails-db: webpacker の service を追加。それに伴い web の service も修正。 $ docker-compose up で Docker を起動し、http://0.0.0.0:3001/sample にアクセスする。app/javascript/components/Sample.tsx のファイルを適当に書き換えて保存するとホットリロードすることがわかる。 以上です! こちらの方の記事をほとんどそのまま移させていただきました! 大変わかりやすかったです!!ありがとうございますm(_ _)m
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

既存アプリ(Rails)にdocker導入

はじめに 最近オリジナルアプリにDocker開発環境を導入したので、導入までに学習した所をこの記事にまとめたいと思います。 Dockerとは コンテナ技術を使ったアプリケーションの実行環境の構築や運用ができるオープンソースソフトウェアのこと。 コンテナ技術により、コンテナ上の環境は個別のサーバーのように扱うことができる。そのためホスト上とは別の環境を作ることができる。ホストOSとリソースを共有しているため、高速かつ軽量な仮想化を実現している。 Dockerの利点 インフラ環境をコードに落とし込み、そのコードをもとに開発環境を作れる。そのため、簡単に環境構築を行うことができる。さらにそのコードを共有すれば他の開発者と同じ環境を作れる。開発環境と同じ本番環境を作ることもできるので、開発環境と本番環境の違いによる不具合をなくすこともできる。 DockerではDockerfileと呼ばれるファイルに、インフラの構成情報を記述していく。 Dockerfileとは アプリの開発環境やインフラの構成情報をコードとして記述したもの。Dockerfileにかかれたコードをもとにイメージを作成し、コンテナを起動する。コンテナ内がDockerfileをもとに作られた環境になっている。このコンテナ内で開発を行っていく。 イメージがコンテナの設計図でコンテナがイメージからできた実体(インスタンス)のようなイメージ。 イメージはDocker Hub上でたくさん公開されている。 今回Dockerを開発環境に導入する理由 現在、オリジナルアプリケーションでGitHub Actionsを使いCI/CDを導入しています。 CI(継続的インテグレーション)は自動テストでコードの品質を担保してくれますが、開発環境とテスト環境が現状だと異なってしまっています。その部分を同じ環境にしてコードの信頼性を上げたかったので、Dockerを導入します。 Docker導入 実行環境 ・ macOS ・ Docker 20.10.7 ・ docker-compose 1.29.2 ①Dockerfile作成 Dockerfileはベースイメージからコマンドを重ねるように環境を構築していく。 Dockerfile # ベースイメージ FROM ruby:2.6.7 # Railsを使うために必要なコンポーネントを環境内にインストールする RUN apt-get update -qq \ && apt-get install -y nodejs yarn postgresql-client # myappディレクトリを作成し、移動する WORKDIR /myapp # gemfileとgemfile.lockをコピーして既存アプリと同じgemをインストールする COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install # 既存アプリのコードをコンテナ内のmyappディレクトリ以下にコピーする COPY . /myapp # docker run時にserver.pidファイルを削除する設定 COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] # コンテナ起動時に公開することを想定されているポートを記述、あったほうが親切 EXPOSE 3000 # docker run時にrailsサーバーを起動 CMD ["rails", "server", "-b", "0.0.0.0"] 以下がserver.pidを削除するシェルスクリプトです。 entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@" ②docker-compose.ymlファイルを作成 DBはPostgreSQLを使用する。 Docker Containerは1コンテナでは1プロセスを動かす設計となっているため、DBはアプリケーションサーバとは別のコンテナとして作成し管理する必要がある。 そのため、複数のコンテナをまとめて管理できるdocker-compose.ymlファイルを作成していく。 docker-compose.yml # composeファイルのバージョン version: "3.9" # servicesの下に使うコンテナを記述 services: db: image: postgres # volumesにより(ホスト:コンテナ)のデータを同期する # コンテナを消してもホスト上にデータが同期されるからDBのデータは残る volumes: - ./tmp/db:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: password web: # カレントディレクトリにあるDockerfileをwebコンテナのイメージに使用 build: . # docker-compose コマンドで発動。server.pidファイル削除し、railsサーバー起動。 command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" # カレントディレクトリのファイルとコンテナ内のファイルを同期している # コードを変更すればコンテナ内のコードも変更される volumes: - .:/myapp # "ホストのポート番号:コンテナ内のポート番号" # コンテナの3000番ポートでrailsサーバが起動しているので、        # ローカルの3000番ポートと繋ぎローカルでも確認できるようにする。 ports: - "3000:3000" # コンテナの起動順序と依存関係を記述する。 # この場合、コンテナの起動順はdb→web、しかし完全にdbが起動してからwebを起動するのではない depends_on: - db ③Dockerfileイメージを作成 docker-compose.ymlファイルのbuild: .からカレントディレクトリのDockerfileを探しwebコンテナのもとになるイメージを作成する。 % docker-compose build ④database.ymlファイル変更 dbコンテナと通信できるようにdatabase.ymlを変更。 database.yml default: &default adapter: postgresql encoding: unicode # docker-compose.ymlでdepends_onにdbを記述しているのでhost:dbとすればdbコンテナに繋げられる host: db username: postgres password: password pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 development: <<: *default database: myapp_development test: <<: *default database: myapp_test ⑤docker-compose upでコンテナを起動 Dockerfileから作成したイメージとDocker Hubから取得してきたpostgresイメージをもとにコンテナを起動。 % docker-compose up この状態で、localhost:3000にアクセスするとdbがないエラーが出てくるためコンテナに入りDB作成。続けてテーブルも作成。 % docker-compose run web rails db:create % docker-compose run web rails db:migrate ここまででlocalhost:3000にアクセスしてアプリが正常に動いていれば導入完了 参考 既存のRailsアプリにDockerを導入する手順 既存のRails6アプリをDocker化しつつCircleCIでシステムスペックも実行できる環境を作る Quickstart: Compose and Rails
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

既存アプリ(Rails6)にDocker導入

はじめに 最近オリジナルアプリにDocker開発環境を導入したので、導入までに学習した所をこの記事にまとめたいと思います。 Dockerとは コンテナ技術を使ったアプリケーションの実行環境の構築や運用ができるオープンソースソフトウェアのこと。 コンテナ技術により、コンテナ上の環境は個別のサーバーのように扱うことができる。そのためホスト上とは別の環境を作ることができる。ホストOSとリソースを共有しているため、高速かつ軽量な仮想化を実現している。 Dockerの利点 インフラ環境をコードに落とし込み、そのコードをもとに開発環境を作れる。そのため、簡単に環境構築を行うことができる。さらにそのコードを共有すれば他の開発者と同じ環境を作れる。開発環境と同じ本番環境を作ることもできるので、開発環境と本番環境の違いによる不具合をなくすこともできる。 DockerではDockerfileと呼ばれるファイルに、インフラの構成情報を記述していく。 Dockerfileとは アプリの開発環境やインフラの構成情報をコードとして記述したもの。Dockerfileにかかれたコードをもとにイメージを作成し、コンテナを起動する。コンテナ内がDockerfileをもとに作られた環境になっている。このコンテナ内で開発を行っていく。 イメージがコンテナの設計図でコンテナがイメージからできた実体(インスタンス)のようなイメージ。 イメージはDocker Hub上でたくさん公開されている。 今回Dockerを開発環境に導入する理由 現在、オリジナルアプリケーションでGitHub Actionsを使いCI/CDを導入しています。 CI(継続的インテグレーション)は自動テストでコードの品質を担保してくれますが、開発環境とテストを実行するステージング環境が現状だと異なってしまっています。その部分を同じ環境にしてコードの信頼性を上げたかったので、Dockerを導入します。 Docker導入 実行環境 ・ macOS ・ Docker 20.10.7 ・ docker-compose 1.29.2 ・ Ruby 2.6.7 ・ Rails 6.1.4 ①Dockerfile作成 Dockerfileはベースイメージからコマンドを重ねるように環境を構築していく。 Dockerfile # ベースイメージ FROM ruby:2.6.7 # Railsを使うために必要なコンポーネントを環境内にインストールする RUN apt-get update -qq \ && apt-get install -y nodejs yarn postgresql-client # myappディレクトリを作成し、移動する WORKDIR /myapp # gemfileとgemfile.lockをコピーして既存アプリと同じgemをインストールする COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install # 既存アプリのコードをコンテナ内のmyappディレクトリ以下にコピーする COPY . /myapp # docker run時にserver.pidファイルを削除する設定 COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] # コンテナ起動時に公開することを想定されているポートを記述、あったほうが親切 EXPOSE 3000 # docker run時にrailsサーバーを起動 CMD ["rails", "server", "-b", "0.0.0.0"] 以下がserver.pidを削除するシェルスクリプト。 entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@" ②docker-compose.ymlファイルを作成 DBはPostgreSQLを使用する。 Docker Containerは1コンテナでは1プロセスを動かす設計となっているため、DBはアプリケーションサーバとは別のコンテナとして作成し管理する必要がある。 そのため、複数のコンテナをまとめて管理できるdocker-compose.ymlファイルを作成していく。 docker-compose.yml # composeファイルのバージョン version: "3.9" # servicesの下に使うコンテナを記述 services: db: image: postgres # volumesにより(ホスト:コンテナ)のデータを同期する # コンテナを消してもホスト上にデータが同期されるからDBのデータは残る volumes: - ./tmp/db:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: password web: # カレントディレクトリにあるDockerfileをwebコンテナのイメージに使用 build: . # docker-compose コマンドで発動。server.pidファイル削除し、railsサーバー起動。 command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" # カレントディレクトリのファイルとコンテナ内のファイルを同期している # コードを変更すればコンテナ内のコードも変更される volumes: - .:/myapp # "ホストのポート番号:コンテナ内のポート番号" # コンテナの3000番ポートでrailsサーバが起動しているので、        # ローカルの3000番ポートと繋ぎローカルでも確認できるようにする。 ports: - "3000:3000" # コンテナの起動順序と依存関係を記述する。 # この場合、コンテナの起動順はdb→web、しかし完全にdbが起動してからwebを起動するのではない depends_on: - db ③Dockerfileイメージを作成 docker-compose.ymlファイルのbuild: .からカレントディレクトリのDockerfileを探しwebコンテナのもとになるイメージを作成する。 % docker-compose build ④database.ymlファイル変更 dbコンテナと通信できるようにdatabase.ymlを変更。 database.yml default: &default adapter: postgresql encoding: unicode # docker-compose.ymlでdepends_onにdbを記述しているのでhost:dbとすればdbコンテナに繋げられる host: db username: postgres password: password pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 development: <<: *default database: myapp_development test: <<: *default database: myapp_test ⑤docker-compose upでコンテナを起動 Dockerfileから作成したイメージとDocker Hubから取得してきたpostgresイメージをもとにコンテナを起動。 % docker-compose up この状態で、localhost:3000にアクセスするとdbがないエラーが出てくるためコンテナに入りDB作成。続けてテーブルも作成。 % docker-compose run web rails db:create % docker-compose run web rails db:migrate ここまででlocalhost:3000にアクセスしてアプリが正常に動いていれば導入完了 参考 既存のRailsアプリにDockerを導入する手順 既存のRails6アプリをDocker化しつつCircleCIでシステムスペックも実行できる環境を作る Quickstart: Compose and Rails
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vue.js + Keycloak(Docker) ローカル環境構築方法メモ

検証用にVue.jsアプリとDocker起動しているKeycloakを接続してみたため、手順をメモしておく。 構成 keycloak_test - docker-compose.yml - fe - app-vue Keycloakコンテナ作成 docker-compose.ymlの準備 docker-compose.yml Keycloak起動用 version: "3" volumes: mysql_data: driver: local services: mysql: image: mysql:5.7 volumes: - mysql_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: keycloak MYSQL_USER: keycloak MYSQL_PASSWORD: password keycloak: image: quay.io/keycloak/keycloak:latest container_name: "keycloak" environment: DB_VENDOR: MYSQL DB_ADDR: mysql DB_DATABASE: keycloak DB_USER: keycloak DB_PASSWORD: password KEYCLOAK_USER: admin KEYCLOAK_PASSWORD: P@ssw0rd ports: - 8080:8080 depends_on: - mysql コンテナ起動 docker-compose up Keycloak設定 http://localhost8080からAdmin Consoleにアクセスする。認証情報は、docker-compose.ymlを参照のこと。 こちらの手順(「Create a realm」から...)に従い、Keycloak設定を行う。 Vue.js フロント部分作成 プロジェクト作成 cd fe vue init webpack-simple app-vue ※すべてデフォルトを選択する。 依存ライブラリインストール npm i keycloak-js --save npm i vuejs-logger --save コード修正 こちらを参考にmain.js,App.vueを修正する。 main.js initOptionsに対して、以下の修正を行っている。 realm:自環境に合わせて修正 CheckLoginiframe:追加 import Vue from 'vue' import App from './App.vue' import VueLogger from 'vuejs-logger'; import * as Keycloak from 'keycloak-js'; Vue.use(VueLogger); let initOptions = { url: 'http://127.0.0.1:8080/auth', realm: 'myrealm', clientId: 'app-vue', onLoad: 'login-required',CheckLoginiframe:false } let keycloak = Keycloak(initOptions); keycloak.init({ onLoad: initOptions.onLoad, checkLoginIframe:initOptions.CheckLoginiframe }).then((auth) => { if (!auth) { window.location.reload(); } else { Vue.$log.info("Authenticated"); new Vue({ el: '#app', render: h => h(App, { props: { keycloak: keycloak } }) }) } //Token Refresh setInterval(() => { keycloak.updateToken(70).then((refreshed) => { if (refreshed) { Vue.$log.info('Token refreshed' + refreshed); } else { Vue.$log.warn('Token not refreshed, valid for ' + Math.round(keycloak.tokenParsed.exp + keycloak.timeSkew - new Date().getTime() / 1000) + ' seconds'); } }).catch(() => { Vue.$log.error('Failed to refresh token'); }); }, 6000) }).catch(() => { Vue.$log.error("Authenticated Failed"); }); App.vue <template> <div id="app"> <img src="./assets/logo.png" /> <h1>{{ msg }}</h1> <h2>User: {{ keycloak.idTokenParsed.preferred_username }}</h2> <div> <button class="btn" @click="keycloak.logout()">Logout</button> </div> <div id="wrapper"> <div class="jwt-token"> <h3 style="color: black">JWT Token</h3> {{ keycloak.idToken }} </div> <div class="jwt-token"> <h3 style="color: black">Info</h3> <ul> <li>clientId: {{ keycloak.clientId }}</li> <li>Auth Server Url: {{ keycloak.authServerUrl }}</li> </ul> </div> </div> <h2>Essential Links</h2> <ul> <li><a href="https://keycloak.org" target="_blank">Keycloak</a></li> <li> <a href="https://github.com/keycloak/keycloak-quickstarts" target="_blank" >Code Repo</a > </li> <li> <a href="https://twitter.com/keycloak" target="_blank">Twitter</a> </li> </ul> </div> </template> <script> export default { name: "app", props: ["keycloak"], data() { return { msg: "Welcome to Your Secured Vue.js App with Keycloak", }; }, }; </script> <style> #app { font-family: "Avenir", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } h1, h2 { font-weight: normal; } ul { list-style-type: none; padding: 0; } li { display: block; margin: 0 10px; color: #333; font-size: 20px; } a { color: #42b983; } #wrapper { display: flex; margin-top: 100px; } .jwt-token { width: 50%; display: block; padding: 20px; margin: 10 0 10px; font-size: 13px; line-height: 1.42857143; color: #333; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 4px; color: #d63aff; font-weight: bolder; } .btn { color: #fff; background-color: #0088ce; border-color: #00659c; padding: 6px 10px; font-size: 14px; line-height: 1.3333333; border-radius: 1px; } </style> 動作確認 起動 npm run dev -- --port 3000 http://localhost:3000にアクセスする。 (Keycloakエンドポイントにリダイレクトされるので、)ユーザー認証情報を入力する※上記「Keycloak設定」で登録した値。 以下の画面が表示される。 参考情報 Secure a Vue.js single-page application with Keycloak Keycloak Quickstarts 2.2.1. セッション・ステータスiframe
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[heroku]Exec format errorというエラーの解決方法

はじめに 本記事では、herokuへDockerコンテナをリリース後、 データベースを更新するようなコマンドを入力したところ、 Exec format errorというエラーが発生したので、解決方法を記述します。 ターミナルにて rails-docker-mkatoはアプリ名です。 % heroku container:release web -a rails-docker-mkato Releasing images web to rails-docker-mkato... done % heroku run bundle exec rake db:migrate RAILS_ENV=production -a rails-docker-mkato Running bundle exec rake db:migrate RAILS_ENV=production on ⬢ rails-docker-mkato... up, run.3205 (Free) Error: Exec format error ログを確認 2021-10-08T10:19:30.373656+00:00 heroku[web.1]: Starting process with command `sh /start.sh` 2021-10-08T10:19:31.572087+00:00 app[web.1]: Error: Exec format error 2021-10-08T10:19:31.715922+00:00 heroku[web.1]: Process exited with status 126 2021-10-08T10:19:31.785102+00:00 heroku[web.1]: State changed from starting to crashed 2021-10-08T10:19:31.912808+00:00 heroku[web.1]: State changed from crashed to starting 2021-10-08T10:19:50.024750+00:00 heroku[web.1]: Starting process with command `sh /start.sh` 2021-10-08T10:19:50.982798+00:00 app[web.1]: Error: Exec format error 2021-10-08T10:19:51.102356+00:00 heroku[web.1]: Process exited with status 126 2021-10-08T10:19:52.245987+00:00 heroku[web.1]: State changed from starting to crashed 結論 以下のサイトに倣って、コマンドを入力しましたところ解決しました。 M1 MacでHeroku containerにデプロイしたら Exec format error と出て困った話 M1 Macでx86向けのDocker Imageをビルドする ということが必要みたいです。 コマンド入力 ユーザ名は自身が使用するusernameです。 buildしてpushするのでまあまあ時間がかかりました。 $ docker buildx build . --platform linux/amd64 -t username/example:latest $ docker tag username/example registry.heroku.com/example/web $ docker push registry.heroku.com/example/web $ heroku container:release web -a example 再度コマンド入力 % heroku run bundle exec rails db:migrate RAILS_ENV=production -a rails-docker-mkato Running bundle exec rails db:migrate RAILS_ENV=production on ⬢ rails-docker-mkato... up, run.1740 (Free) 特にエラーは起きませんでした。 以上です。 終わりに herokuへデプロイする流れとかもしっかり理解しないといけないなと反省もしました。 以下参考サイトです。 M1 MacでHeroku containerにデプロイしたら Exec format error と出て困った話 Docker Buildx 明日も頑張ります!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macにTanzu Community Editionを入れてみよう

はじめに この記事ではMacにTanzu Community Editionをインストールする手順を紹介します 環境 macbook pro 2020 RAM: 64GB CPU: 2.4 GHz 8コアIntel Core i9 Docker Desktop 4.1.0 Tanzuとは VMware Tanzu は、コンテナ化されたアプリケーションのデプロイとスケーリングを自動化し、モダンアプリの開発や複数のクラウド環境での運用を実現するオープンソースプラットフォームの Kubernetes (k8s) フレームワークの実行と単一の制御ポイントからの管理を支援する製品群です。 引用 Tanzu Community Editionは無償で簡単にKubernetesと関連ソフトウェア環境をパブリッククラウドやローカルマシンに構築し、学習や評価、開発環境などに利用できます。Tanzu Community Editionは以下のソフトウェアが含まれています。 引用 Docker Desktopの設定 Tanzu Community Editionのリソース要件は 6 GB of RAM 4 CPUs となっているのでDocker Desktopもそれ以上に設定しておきましょう(リソース不足だとbootstrapperの設定でおかしいことになりそうなので) 導入手順 homebrew・kubectl・dockerが入っている状態で以下のコマンドを実行します $ brew tap vmware-tanzu/tanzu $ brew install tanzu-community-edition インストール完了後にconfigreスクリプトを実行します。 $ {HOMEBREW-INSTALL-LOCATION}/v0.9.1/libexec/configure-tce.sh 以下のコマンドでtanzuがインストールされているのを確認します。 $ which tanzu /usr/local/bin/tanzu $ tanzu version version: v0.2.1 buildDate: 2021-09-29 sha: ceaa474 $ tanzu plugin list NAME LATEST VERSION DESCRIPTION REPOSITORY VERSION STATUS builder Build Tanzu components v0.2.1 installed cluster v0.2.1 Kubernetes cluster operations core v0.2.1 installed conformance Run Sonobuoy conformance tests against clusters v0.9.1 installed diagnostics Cluster diagnostics v0.9.1 installed kubernetes-release v0.2.1 Kubernetes release operations core v0.2.1 installed login v0.2.1 Login to the platform core v0.2.1 installed management-cluster v0.2.1 Kubernetes management cluster operations core v0.2.1 installed package v0.2.1 Tanzu package management core v0.2.1 installed pinniped-auth v0.2.1 Pinniped authentication operations (usually not directly invoked) core v0.2.1 installed standalone-cluster Create clusters without a dedicated management cluster v0.9.1 installed Clusterを作成する Tanzu Community EditionはManaged ClustersとStandalone Clustersと2種類のClusterを払い出すことができます。Managed Clustersはmasterを1 nodeとworkerをN node払い出すことができます。今回はmacで構築するためStandalone ClusterでClusterを作成します。 Standalone clusters are highly-experimental and partially implemented! Functions such as scaling clusters are not implemented. If you follow this guide, you may need to clean-up resources created by these clusters manually! ※Standalone Clustersはスケーリング機能などが実装されていないため実運用では推奨されていません(2021/10/9時点) 下記のコマンドdocker imageをpullしてきます。 $ docker pull kindest/haproxy:v20210715-a6da3463 pull後に下記コマンドでStandalone Clusterを作成します $ tanzu standalone-cluster create -i docker standcluster Standalone cluster created!と出力されたら作成完了です。 kubectlでclusterが作成されているのを確認します。 $ kubectl config use-context standcluster-admin@standcluster Switched to context "standcluster-admin@standcluster". $ kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME standcluster-control-plane-pjsmh Ready control-plane,master 8m50s v1.21.2+vmware.1-360497810732255795 172.19.0.6 <none> Ubuntu 20.04 LTS 5.10.47-linuxkit containerd://1.3.3-14-g449e9269 standcluster-md-0-cccf7fc8f-r7d6v Ready <none> 8m21s v1.21.2+vmware.1-360497810732255795 172.19.0.7 <none> Ubuntu 20.04 LTS 5.10.47-linuxkit containerd://1.3.3-14-g449e9269 $ kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system antrea-agent-ckpgq 2/2 Running 2 7m59s kube-system antrea-agent-d4wdp 2/2 Running 0 7m59s kube-system antrea-controller-86f8988c5f-bkdpf 1/1 Running 0 7m59s kube-system coredns-8dcb5c56b-hwvmh 1/1 Running 0 8m45s kube-system coredns-8dcb5c56b-npgvg 1/1 Running 0 8m45s kube-system etcd-standcluster-control-plane-pjsmh 1/1 Running 0 8m54s kube-system kube-apiserver-standcluster-control-plane-pjsmh 1/1 Running 0 8m53s kube-system kube-controller-manager-standcluster-control-plane-pjsmh 1/1 Running 0 8m53s kube-system kube-proxy-9gtzq 1/1 Running 0 8m45s kube-system kube-proxy-vg7fg 1/1 Running 0 8m26s kube-system kube-scheduler-standcluster-control-plane-pjsmh 1/1 Running 0 8m53s tkg-system kapp-controller-6499b8866-6kr5w 1/1 Running 0 8m tkg-system tanzu-capabilities-controller-manager-6ff97656b8-7lcs6 1/1 Running 0 8m40s tkr-system tkr-controller-manager-6bc455b5d4-84f5x 1/1 Running 0 8m45s master 1 node、worker 1 nodeで作成されているのがわかります。 作成したClusterを削除する場合は以下のコマンドを使います $ tanzu standalone-cluster delete standcluster おわりに 今回はTanzu Community EditionをMacにインストールし、Standalone Clusterの作成を行いました。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker + Django-rest-fremework 構築メモ

前提 Docker, Docker Composeはインストールされている バージョン情報 Django 3.0 Djangorestfremework 3.12.4 Docker 20.10.8(build 3967d7d) Python 3.8 ホスト端末: Windows10 (64bit) 1.とりあえず環境作る 1.1 フォルダ構成とファイル内容 フォルダ構成 フォルダ:restapifw-sample F:..restapifw-sample │ docker-compose.yml │ Dockerfile │ requirements.txt └─workspace(フォルダ) ファイル内容 docker-compose.yml # Compose.ymlファイル書式のバージョン version: '3' services: # サービス名定義 django-restapi: # ComposeFileを実行しビルドされるときのルートパス # このフォルダにDockerファイルを置く build: . # Docker 起動 # command: python manage.py runserver 0.0.0.0:8000 # コンテナ名 container_name: 'django-sample.v1.0.0' # コンテナ内のワーキングディレクトリ # working_dir: '/workspace/tutorial' # コンテナを終了させたくない場合に設定 tty: true ports: - 8082:8000 # ローカルフォルダとコンテナ内のマウントディレクトリの関連づけ volumes: - ./workspace:/workspace Dockerfile. FROM python:3.8 USER root RUN apt-get update RUN apt-get -y install locales && \ localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 ENV LANG ja_JP.UTF-8 ENV LANGUAGE ja_JP:ja ENV LC_ALL ja_JP.UTF-8 ENV TZ JST-9 ENV TERM xterm # コンテナ側へコピー COPY requirements.txt requirements.txt # python ライブラリインストール RUN pip install -r ./requirements.txt #viインスト RUN apt-get install -y vim less requirements.txt setuptools pip django==3.0 djangorestframework==3.12.4 1.2 Docker起動 プロジェクトフォルダのカレントで実施 コマンド. docker-compose build docker-compose up -d #起動確認 docker-compose ps docker-compose ps Name Command State Ports --------------------------------------------------------------------------------- django-sample.v1.0.0 python3 Up 0.0.0.0:8082->8000/tcp,:::8082->8000/tcp 1.3 Docker内でDjango設定 Docker内に入る(そんなイメージで通じる?) マウントしているworkspaceフォルダ配下にDnagoプロジェクトを作ります コマンド. docker exec -it django-sample.v1.0.0 /bin/bash cd workspace ここからは、下記URLを参照に実施 https://www.django-rest-framework.org/tutorial/quickstart/ コマンド. # Create the project directory mkdir tutorial cd tutorial # Create a virtual environment to isolate our package dependencies locally # 既にDocker内にインストール済みなので不要 # python3 -m venv env # source env/bin/activate # On Windows use `env\Scripts\activate` # Install Django and Django REST framework into the virtual environment # 既にDocker内にインストール済みなので不要 #pip install django #pip install djangorestframework # Set up a new project with a single application # Note the trailing '.' character django-admin startproject tutorial . cd tutorial django-admin startapp quickstart cd .. #作成されたファイルを確認(やらなくてもOK) find . . ./manage.py ./tutorial ./tutorial/asgi.py ./tutorial/quickstart ./tutorial/quickstart/admin.py ./tutorial/quickstart/apps.py ./tutorial/quickstart/migrations ./tutorial/quickstart/migrations/__init__.py ./tutorial/quickstart/models.py ./tutorial/quickstart/tests.py ./tutorial/quickstart/views.py ./tutorial/quickstart/__init__.py ./tutorial/settings.py ./tutorial/urls.py ./tutorial/wsgi.py ./tutorial/__init__.py Django内部のSqliteのデータベース作成 コマンド. python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying sessions.0001_initial... OK Djangoプロジェクト内のスーパユーザ作成 パスワードは自由だけどここでは、admin にしちゃった (サイトでは、admin:password123かな) コマンド. python manage.py createsuperuser --email admin@example.com --username admin ここからは、サイト通りDjango内のソースや設定ファイルをいじる (Windowsからフォルダを参照して直接作成してもOK。コンテナ内で作業する必要なし。但し文字コードはUTF-8で保存) tutorial/quickstart/serializers.py from django.contrib.auth.models import User, Group from rest_framework import serializers class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ['url', 'username', 'email', 'groups'] class GroupSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Group fields = ['url', 'name'] tutorial/quickstart/views.py from django.contrib.auth.models import User, Group from rest_framework import viewsets from rest_framework import permissions from tutorial.quickstart.serializers import UserSerializer, GroupSerializer class UserViewSet(viewsets.ModelViewSet): """ API endpoint that allows users to be viewed or edited. """ queryset = User.objects.all().order_by('-date_joined') serializer_class = UserSerializer permission_classes = [permissions.IsAuthenticated] class GroupViewSet(viewsets.ModelViewSet): """ API endpoint that allows groups to be viewed or edited. """ queryset = Group.objects.all() serializer_class = GroupSerializer permission_classes = [permissions.IsAuthenticated] tutorial/urls.py from django.urls import include, path from rest_framework import routers from tutorial.quickstart import views router = routers.DefaultRouter() router.register(r'users', views.UserViewSet) router.register(r'groups', views.GroupViewSet) # Wire up our API using automatic URL routing. # Additionally, we include login URLs for the browsable API. urlpatterns = [ path('', include(router.urls)), path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) ] tutorial/settings.py 量が多いのでかいつまんで 28行目付近 ALLOWED_HOSTS = ['*'] 40行目付近 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', ←これ追加 ] 52行目あたりに追加 REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 10 } 1.4 Django手動起動 Dockerコンテナ内で実行 コマンド. cd /workspace/tutorial python manage.py runserver #うまく動作するとこんな感じ Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). October 09, 2021 - 02:08:21 Django version 3.0, using settings 'tutorial.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. 確認 もう一つコンソールを起動してDockerコンテナ内に入り稼働確認 パスワードは自分で作成したスーパユーザのパスワード (サイトでは、admin:password123かな) コマンド. cd ...作成したプロジェクトのrestapifw-sampleフォルダへ移動 docker exec -it django-sample.v1.0.0 /bin/bash curl -H 'Accept: application/json; indent=4' -u admin:admin http://127.0.0.1:8000/users/ こんなのが出たら起動している コマンド. { "count": 1, "next": null, "previous": null, "results": [ { "url": "http://127.0.0.1:8000/users/1/", "username": "admin", "email": "admin@example.com", "groups": [] } ] } 1.5 Django停止 CTRL + C で終わらせる 2.Docker自動起動 + ホストからのアクセス設定 環境が作成出来たのでコンテナを起動したらDjangoを自動起動するように設定する Docker停止(exit でコンテから抜けてから実行) コマンド. docker-compose down Docker-compose.ymlファイルのコメントを2つ外す(Docker起動と、コンテナ内のワーキングディレクトリ) ※Djangoの 0.0.0.0で起動するのが肝これをやらないと外からアクセスは出来ないらしい?本当はnginx立ててリバースプロキシ経由でやりたかったけど出来なかったのでこれで… Docker-compose.yml # Compose.ymlファイル書式のバージョン version: '3' services: # サービス名定義 django-restapi: # ComposeFileを実行しビルドされるときのルートパス # このフォルダにDockerファイルを置く build: . # Docker 起動 command: python manage.py runserver 0.0.0.0:8000 # コンテナ名 container_name: 'django-sample.v1.0.0' # コンテナ内のワーキングディレクトリ working_dir: '/workspace/tutorial' # コンテナを終了させたくない場合に設定 tty: true ports: - 8082:8000 # ローカルフォルダとコンテナ内のマウントディレクトリの関連づけ volumes: - ./workspace:/workspace 再ビルド # 再ビルド docker-compose build # 起動 docker-compose up -d # 起動確認 docker-compose ps Name Command State Ports -------------------------------------------------------------------------------------------------------- django-sample.v1.0.0 python manage.py runserver ... Up 0.0.0.0:8082->8000/tcp,:::8082->8000/tcp Windows10のコンソールから実行 結果が返って来る(レイアウトは少々悪いけど) curl -H 'Accept: application/json; indent=4' -u admin:admin http://127.0.0.1:8082/users/ curl: (6) Could not resolve host: application curl: (6) Could not resolve host: indent=4' {"count":1,"next":null,"previous":null,"results":[{"url":"http://127.0.0.1:8082/users/1/","username":"admin","email":"admin@example.com","groups":[]}]} ブラウザから確認 http://127.0.0.1:8082/users/ 下記画面が表示されればOK 右上のLoginから遷移した画面 最後に 以前AWSでRestapi作って見たけど本当に運用を考えると維持費が高い・・。 もっと安いクラウドサービスなどで簡単にRestApiアプリを作れる方法を検討してDjangoのRestfremeworkに辿り着いた。 またDjango付属のサーバは開発用簡易サーバなはずだから本番ではやはりNginx経由などで構築しないとダメなのかな。 参照リンク https://www.django-rest-framework.org/tutorial/quickstart/ https://tech.mokelab.com/infra/docker/tips/empty_reply_from_server.html リバースプロキシの仕組みとは?nginxを使った設定
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LocalStack 環境構築 メモ

LocalStackとは? AWSのサービスを擬似的に利用できるフレームワーク 対応AWSサービスは、公式ページを参照のこと AWS CLIインストール・設定 インストール 筆者環境はWindowsのため、こちらからインストーラーをダウンロードし、実行する。 インストール結果確認 aws --version aws-cli/2.2.44 Python/3.8.8 Windows/10 exe/AMD64 prompt/off 設定 クレデンシャル設定 aws configure --profile localstack AWS Access Key ID [None]: dummy AWS Secret Access Key [None]: dummy Default region name [None]: ap-northeast-1 Default output format [None]: json 設定値確認 cat ~/.aws/credentials [localstack] aws_access_key_id = dummy aws_secret_access_key = dummy cat ~/.aws/config [profile localstack] region = ap-northeast-1 output = json Docker 環境構築 Gitからプロジェクトクローン git clone https://github.com/atlassian/localstack.git Cloning into 'localstack'... remote: Enumerating objects: 2199, done. remote: Counting objects: 100% (6/6), done. remote: Compressing objects: 100% (4/4), done. Receiving objects: 100% (2199/2199), 618.62 KiB | 2.07 MiB/s, done. Resolving deltas: 100% (1435/1435), done. Docker起動 cd localstack docker-compose up 動作確認 ダッシュボードアクセス(http://localhost:8080) S3 バケット作成 aws s3 mb s3://sample-bucket --endpoint-url=http://localhost:4572 --profile=localstack make_bucket: sample-bucket バケット確認 aws s3 ls --endpoint-url=http://localhost:4572 --profile=localstack 2006-02-04 01:45:09 sample-bucket ※作成時刻がおかしい...? 参考情報 LocalStack s3 — AWS CLI 1.20.58 Command Reference
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

.rbenv/shims/docker-sync: line 21: /usr/local/Cellar/rbenv/1.1.2/libexec/rbenv: No such file or directory

はじめに brew upgradeしたらdocker-sync だけ見つからなくなりました。 gemで入れたもの全部動かなくなった(全部は確認してないけど) 探しても対処法がぱっと見つからなかった(ちゃんと探してないだけ)のでメモがてら書きます。 結論(解決した方法) 以下を実行で解決した。 rbenv rehash rbenv rehash コマンドを実行すると、大まかには ~/.rbenv/versions/*/bin/ 以下のファイルを ~/.rbenv/shims/ 以下にコピーする。 なぜコピーする必要があるかというと、通常PATHが通っているのは ~/.rbenv/shims 以下となっているからで、ここにコピーしないと rspec とか rubocop といったGemが提供するコマンドを実行できないからである。 cf. https://mogulla3.tech/articles/2020-12-29-01 ということみたいです。 やったこと brewのupdate, upgradeがうまくいってない? brew update && brew upgrade 全て最新になってるっぽい。 brewで問題が起きている? brew doctor dockerのlinkができてないというのが出たので、link brew link docker でも、直らない。他に問題はなさそう。 rbenvの問題? brew reinstall rbenv まだ問題変わらず、、 ?? ----- ここから下を確認して実行すればOK ----- /usr/local/Cellar/rbenv/1.1.2/libexec/rbenv: No such file or director rbenv/1.1.2? rbenvのバージョン見てみる rbenv -v => rbenv 1.2.0 バージョンが違う、、 ll /usr/local/Cellar/rbenv total 0 drwxr-xr-x 10 kazmaw admin 320B 10 9 10:07 1.2.0 rbenv/1.1.2なんてないじゃないか。 brew ls --formula -lt | grep rbenv drwxr-xr-x 3 kazmaw admin 96 Oct 9 10:07 rbenv rbenvのバージョンが上がってしまったからか、、 gemも動かない事に気づいた gem uninstall docker-sync /(略)/.rbenv/shims/gem: line 21: /usr/local/Cellar/rbenv/1.1.2/libexec/rbenv: No such file or directory あー、rbenvのパス通すやつなんかあったな、、 rbenv rehash ❯ docker-sync -h [10:32:08] Commands: docker-sync --version, -v # Prints out the version of docker-sync and exits docker-sync clean # Stop and clean up all sync endpoints docker-sync help [COMMAND] # Describe available commands or one specific command docker-sync list # List all sync-points of the project configuration path docker-sync logs # Prints last 100 lines of daemon log. Only for use with docker-sync started in background. docker-sync restart # Restart docker-sync daemon docker-sync start # Start all sync configurations in this project docker-sync stop # Stop docker-sync daemon docker-sync sync # just sync - do not start a watcher though Options: -c, [--config=CONFIG] # Path of the docker_sync config -n, [--sync-name=SYNC_NAME] # If given, only this sync configuration will be references/started/synced -v, [--version], [--no-version] # prints out the version of docker-sync and exits いけたーー!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Next.jsでMaterialUIが使えない時の対策

Next.jsでMaterialUIが使えない時の対策です。 現象 MaterialUI公式の、ボタンを表示するソースコードをコピペしてもエラーが出る。 環境 ・Next.js ・Mac OS Big Sur ver11.6 ・Docker Desktop4.1.0 ・npm install @mui/material コマンドでインストール済み エラー内容: エラー内容:Module not found: Can't resolve '@emotion/react' @emotion/reactをインストールをしても、 今度は@emotion/styledのエラーが出ます。 エラー内容:Module not found: Can't resolve '@emotion/styled' ソースコード(テスト用) import Head from 'next/head' import Image from 'next/image' import styles from '../styles/Home.module.css' // add MaterialUI import * as React from 'react'; import ReactDOM from 'react-dom'; import Button from '@mui/material/Button'; export default function Home() { return ( <Button variant="contained">Hello World</Button> ) } 対策 @emotion/reactと@emotion/styledをインストールし、Dockerをbuild後、再起動します。 インストールコマンド yarn add @emotion/react @emotion/styled 参考 npm公式 https://www.npmjs.com/package/@emotion/styled Material UI公式 https://mui.com/getting-started/usage/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerにてWordPressを構築する(リバースプロキシの学習も)

やりたいこと DockerにてWordPressを構築し、ブラウザから80番ポートでアクセスしたい。 ただし、ホスト側でもApacheを使っているため、WordPressコンテナを80番ポートに紐づけるわけにはいかない。 ということで、WordPressコンテナは8080番ポートに紐づけます。 そしてWordPress用のサブドメインを切って、そこに来たアクセスをホスト側のApacheでlocalhostの8080番ポートにリバースプロキシするようにする。 経緯(自分用メモなので、読みたい人だけどうぞ) 経緯としては、 サーバにWordPressを導入したい Dockerで構築しようと、ネットで調べると、すぐ方法はでてくるが、どのサイトのサンプルもポート番号が8080とか。 80番でWordPressを起動したいが、ホスト側でもすでにApacheを使っていて、80番は使えない! そこでバーチャルホストを使おうとする。 WordPressコンテナ内のHTMLは永続化のため、ボリュームマウントしてあるから、そのディレクトリ/var/lib/docker/volumes/wordpress_v-wordpress-html/_dataをバーチャルホストで指定してみる。 うまくいかない WordPressコンテナ内のApacheで何か設定がしてあるっぽいから、これを飛ばして直接アクセスするのは微妙 じゃあホスト側のApacheをプロキシとして、localhostの8080番に飛ばせばいいのでは こんな感じになります。 前提 OS:CentOS8 Docker:20.10.7 docker-compose:1.27.4 Apache:2.4.37 この辺は既に入っている前提でやります。 WordPress まずはDockerコンテナ内でWordPressを構築します。 Docker-ComposeのファイルにWordPress, MySQL, phpMyAdminを記述します。 docker-compose.yml version: "3" services: db: image: mysql:5.7 volumes: - v-wordpress-db:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: root_pass_fB3uWvTS MYSQL_DATABASE: wordpress_db MYSQL_USER: wp_user MYSQL_PASSWORD: wp_user_pass wordpress: image: wordpress:latest volumes: - v-wordpress-html:/var/www/html - v-wordpress-php:/usr/local/etc/php/conf.d/php.ini restart: always depends_on: - db ports: - 8080:80 environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_NAME: wordpress_db WORDPRESS_DB_USER: wp_user WORDPRESS_DB_PASSWORD: wp_user_pass phpmyadmin: image: phpmyadmin/phpmyadmin:latest restart: always depends_on: - db ports: - 8888:80 volumes: v-wordpress-db: v-wordpress-html: v-wordpress-php: 下記コマンドでコンテナを起動します。 docker-compose up これでブラウザからhttp://mydomain:8080にアクセスすればWordPressが表示されるはずです! もしできない場合は、コンテナがうまく起動していないのか、ファイアウォールなどで8080へのアクセスを制限している可能性があります。 Apache(リバースプロキシ) 続いてApacheの設定を行います。 現状、mydomainへのアクセスはこうなっていると思います。 - http://mydomain -> もともとのサイト - http://mydomain:8080 -> WordPress それをサブドメインを使って、こうします。 - http://original.mydomain -> もともとのサイト - http://wp.mydomain -> WordPress Apacheの設定ファイルがあるディレクトリに移動します。 だいたい/etc/httpd/conf.dだと思います。 そこにファイルを2つ作ります。 original.mydomain(もともとのサイト) original.mydomain.conf <VirtualHost *:80> ServerName original.mydomain DocumentRoot "/var/www/html/original.mydomain" <Directory "/var/www/html/original.mydomain"> Options FollowSymLinks AllowOverride All Order deny,allow Allow from all </Directory> ErrorLog logs/original.mydomain-error_log CustomLog logs/original.mydomain-access_log combined </VirtualHost> もし/var/www/html/にもともとのサイトがある場合は、/var/www/html/original.mydomain/に移し替えましょう。 http://original.mydomainにアクセスしてみてください。 元のサイトが表示されていればOKです。 wp.mydomain(WordPress) wp.mydomain.conf <VirtualHost *:80> ServerName wp.mydomain ProxyPass / http://localhost:8080/ </VirtualHost> ProxyPassディレクティブでプロキシを設定します。 よくProxyPassと一緒にProxyPassReverseというのを見るかもしれませんが、これはプロキシ先がリダイレクトを発行するときに必要になってくるようなので、今回は不要です。 これで設定は終わりです。 http://wp.mydomainにアクセスしてみてください。 WordPressが表示されていれば成功です! 最後に Apacheのバーチャルホストやプロキシの勉強になってよかったです。 他にいい方法あれば教えてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む