20210731のdockerに関する記事は10件です。

AWS ECS モノリシックアプリケーションをマイクロサービスに分割するチュートリアルをやってみた

初めに 以下のチュートリアルをやってみました。初めはマイクロサービスについて勉強したかったのでこのチュートリアルをやってみたのですが、ALB についての勉強にもなりました。具体的には ALB のパスベースルーティングを初めて使い、非常に勉強になりました。 なお、このチュートリアルでは EC2 タイプを使っていますが、この記事では Fargate でチュートリアルを検証しています。また、チュートリアルでは CloudFormation を使っていますが、この記事では簡略化のため VPC などはデフォルトのリソースを使い、ALB は手動で作成しています。 マイクロサービスが重要な理由 マイクロサービスのメリットについて簡単に確認します。 モノリシックアーキテクチャ スケーリングが困難 アプリケーションのコードベースが拡大するにつれ、更新と維持が複雑化する 新しい機能、言語、フレームワーク、テクノロジーの導入が難しい マイクロサービス さまざまなフレームワークやプログラミング言語を使用して作成することができる マイクロサービスは、単一のサービスとして、またはサービスのグループとして個別にデプロイできる モノリスのコンテナ化 このチュートリアルに使用するリポジトリをクローンします。 git clone https://github.com/awslabs/amazon-ecs-nodejs-microservices ECR に api という名前のリポジトリを作成し、以下のようにモノリスアプリケーションの Dockerfile のあるディレクトリに移動し、ビルドします。 cd ~/amazon-ecs-nodejs-microservices/2-containerized/services/api docker build -t api . ECR にログインし、タグ付け・プッシュを行います。 $(aws ecr get-login --no-include-email --region ap-northeast-1) docker tag api:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/api:v1 docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/api:v1 モノリスのデプロイ 以下の手順に従い ALB と ターゲットグループを作成し、モノリスをデプロイします。 /api/users 、/api/threads、/api/posts にアクセスし、適切なレスポンスが返ってくることを確認します。 モノリスの分割 以下のように機能ごとにマイクロサービスに分割し、それぞれのイメージをビルド・プッシュします。~/amazon-ecs-nodejs-microservices/3-microservices/services にはすでに分割済みのソースコードや Dockerfile が用意されています。 cd ~/amazon-ecs-nodejs-microservices/3-microservices/services docker build -t posts ./posts docker build -t users ./users docker build -t threads ./threads docker tag users:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/users:v1 docker tag posts:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/posts:v1 docker tag threads:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/threads:v1 docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/users:v2 docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/posts:v2 docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/threads:v2 マイクロサービスのデプロイ users、threads、posts 用にタスク定義を作成します。 ELB はモノリスアプリケーションで使用したものを利用します。ターゲットグループごとにリスナールールを作成し、リクエスト URL のパスによってルーティングを行うことができます。 users、threads、posts 用に 3 つのターゲットグループを作成します。ターゲットタイプを「IP」にすることを除いて、デフォルトの設定で作成します。 以下のようにリスナールールを作成します。 サービスを作成します。作成後、以下のようにモノリスアプリケーションとマイクロサービスアプリケーションが両方デプロイされた状態ですが、上記のリスナールールにより、リクエストはすべてモノリスアプリケーションが処理するようになっています。これはモノリスアプリケーションからマイクロサービスアプリケーションに切り替える時のダウンタイムを 0 にするためです。 以下のようにトラフィックの切り替えを行います。これ以降、モノリスアプリケーションにリクエストが到達することはありません。 最後に api サービスのタスクの必要数を 0 にし、マイクロサービスアプリケーションに移行が完了します。 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerはSysFsを自動的に読み取り専用でマウントするらしい

背景 おうちDockerSwarmクラスタを立てようとしていたところ不思議に思ったことが出たので調べてみました。仕様書を見たというものではないですが、そういう挙動をするようだ、というメモです。(更に詳しい仕様をご存知の方は教えてくれると助かります) 注: 7/31から2ヶ月寝かせたままだった記事です、詳細はもう覚えていません... 疑問に思ったこと ここに、RPi-Exporterという、ホスト側の温度を取得してPrometheusのメトリクスExporterがあります。 これを Dockerコンテナ化したものに、 Docker-ARM-Exporterというものがあります。 そしてこの DockerArmExporterの実行例を見てみると、タイムゾーン、現在時刻、ノード名を読み取るだけで、肝心の 温度情報部分?をバインドしていませんでした。 このコンテナ、とりあえず試すだけなら、バインドしなくとも動く気がしたので、何もバインドせずに動かしてみました。 rpi_cpu_temperature_celsiusの項目が、リロードすると変動することからホスト温度が確かに読み取りできているようです。 何もバインドしなくて読み取れるってなんでだ?? これが今回の疑問点です。 どうやってホストの温度を読み出している? そこでソースコードを見たところ、ioutil.ReadFile("/sys/class/thermal/thermal_zone0/temp") との1文があり、これを読み出すことで温度が取得できているようでした。 Debian/Stretchコンテナで検証 なにか特殊な細工がされているわけではないことを確認するため、debian:stretchコンテナを起動して読み取れるか確認してみました。 これでも読み取りできました。デフォルトでマウントされている、ということで間違いなさそうです。 他に湧いた疑問 デフォルトでマウントされているので温度を読み取れるというのはわかった、けど他にも気になることがある。 そもそも/sys/classって何? /sys/classはデバイスへのシンボリックリンクが配置されるディレクトリとなっているようです。 https://www.wdic.org/w/TECH//sys/class 他には何がマウントされてるの? 他にも色々マウントされてるみたいです。 https://qiita.com/sato4557/items/b15f325bd735eb340da5 これって書き込めるの? 読み取り専用としてマウントされるようです。 https://forums.docker.com/t/unable-to-mount-sys-inside-the-container-with-rw-access-in-unprivileged-mode/97043 実際試しても書き込めませんでした。 セキュリティとかどうなの? 少しリスクはあるかもしれません https://container-security.dev/security/sensitive-file-mount.html 結論 Dockerコンテナは何もボリュームをマウントしていなくてもシステムの一部が読み取れる状態で稼働している。書き込みはできないが、なにか攻撃のヒントが出てくる可能性も無くもないので用心に越したことはない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Qiitaエンジニアフェスタ_ブラウザ選手権

Qiitaエンジニアフェスタ_ブラウザ選手権 https://qiita.com/official-events/be8c5ab5a9ddf90055cd 参加記事です。 過去の事故記事と、最近書いたり、つぶやいたものを集め、 自分の中での選手権を初めてみます。 できれば、1週に2項目書いて、8/25までには10項目の順位をつけたいかなって思っています。 1. play with docker で python 最近は、Pythonといえばdockerで利用している。 あなたもdocker, 私もdocker https://qiita.com/kaizen_nagoya/items/8f2746f10f30b575d0a8 dockerがうまく導入できていない方には、 ウェブでの利用をお勧めしている。 65歳からのプログラミング入門。docker(126)転職(16) https://qiita.com/kaizen_nagoya/items/1561f910c275b22d7c9f play with docker www.play-with-docker.com Docker hubのIDとパスワードを入れる。 「ADD new instance」をクリックする。 文字列をコピペする docker run -it ubuntu /bin/bash apt update apt -y upgrade apt -y install python3-dev python3 最初のpython1行プログラムをインタプリタで入力する。文字列のコピペ LangPro100-2015-00 >>> print("stressed"[::-1]) desserts みごとに逆順になった。 「>>>」 の行が入力、その次の行が出力。 文字を逆順にするのがこんなに簡単。 ここまで1時間で来れれば大丈夫。 自分では、下記のように、ありとあらゆるエラーにみまわれ、ここまで来るのに2時間、 この資料をまとめるのに1時間かかっている。泣) 参考資料(reference) 第11回 TOPPERS活用アイデア・アプリケーション開発コンテスト https://qiita.com/kaizen_nagoya/items/91162a9b258a2a06f5e0 TOPPERSに関連する操作なら、この部門への投稿の表題を変えて、TOPPERS活用アイデア・アプリケーション開発コンテストに応募するのも手かも。 あなたもdocker, 私もdocker https://qiita.com/kaizen_nagoya/items/8f2746f10f30b575d0a8 今まで書いてよかった技術書を紹介しよう! https://qiita.com/kaizen_nagoya/items/d31b7c158541d345a7ef 開発環境を豊かにする開発事例 過去・現在・未来 https://qiita.com/kaizen_nagoya/items/d9bf0c2c671fe7f1c749 Microsoftとの歴史 Cコンパイラを中心に https://qiita.com/kaizen_nagoya/items/d7c0cc257e99de0573cf TOPPERS ソースを積み上げよう https://qiita.com/kaizen_nagoya/items/65c15aed086f2da0928d
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker + Keycloak + FastAPIを用いたローカル OAuth2.0 Authorization Code Grant 検証環境構築 メモ

学習目的でKeycloakを使ったAuthorization Code Grantを検証するための環境を構築したので、メモとして残しておく。 アクセストークンを取得するところまで。 構成 Dockerを用いた以下の構成で検証環境を構築する。 keycloak ___ docker-compose.yml |__ app.env |__ app ___ Dockerfile |__ requirements.txt |__ api _ main.py docker-compose.yml FastAPI - Keycloak - MySQLコンテナ定義 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 app: container_name: "app" env_file: app.env build: ./app volumes: - ./app/api:/usr/src/server ports: - "8000:8000" app.env 環境変数設定 一度Keycloakコンテナを起動して、登録したクライアント情報を設定する。 APP_BASE_URL=http://localhost:8000/ KEYCLOAK_BASE_URL_LOCALHOST=http://localhost:8080/ KEYCLOAK_BASE_URL_CONTAINER_NAME=http://keycloak:8080/ CLIENT_ID=YOUR_CLIENT_ID CLIENT_SECRET=YOUR_CLIENT_SECRET REDIRECT_URI=http://localhost:8000/auth/callback requirements.txt Python依存ライブラリ fastapi requests uvicorn Dockerfile 依存ライブラリインストールとFastAPI起動オプションを指定。 FROM python:3.7 WORKDIR /usr/src/server ADD requirements.txt . RUN pip install -r requirements.txt # uvicornのオプションに--reloadを付与し、 # main.pyの編集と同時に変更内容を反映させる。 CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8000"] main.py 以下を行う。 Keycloak Authorization Endpointへのリダイレクト(login) Keycloak Authorization Responseの受信+トークンリクエスト(auth) import ast import urllib.parse as parse import os import requests import uvicorn from fastapi import FastAPI from starlette.requests import Request from starlette.responses import RedirectResponse import hashlib # 環境変数取得 # FastAPI アプリ用 APP_BASE_URL = os.getenv("APP_BASE_URL") APP_CLIENT_ID = os.getenv("CLIENT_ID") APP_CLIENT_SECRET = os.getenv('CLIENT_SECRET') APP_REDIRECT_URI = os.getenv('REDIRECT_URI') # Keycloak用 # Authorization Endpoint KEYCLOAK_BASE_URL_LOCALHOST = os.getenv("KEYCLOAK_BASE_URL_LOCALHOST") # "Master"は自身の環境のレルム名を指定する。 AUTH_BASE_URL = ( f"{KEYCLOAK_BASE_URL_LOCALHOST}auth/realms/Master" "/protocol/openid-connect/auth" ) # Token Endpoint # コンテナ間通信するため、localhostではなくコンテナ名を指定 # "Master"は自身の環境のレルム名を指定する。 KEYCLOAK_BASE_URL_CONTAINER_NAME = os.getenv( "KEYCLOAK_BASE_URL_CONTAINER_NAME") TOKEN_URL = ( f"{KEYCLOAK_BASE_URL_CONTAINER_NAME}auth/realms/master" "/protocol/openid-connect/token" ) app = FastAPI() # Keycloak Authorization Endpointへのリダイレクト @app.get("/auth/login") async def login() -> RedirectResponse: # ステート生成 state = hashlib.sha256(os.urandom(32)).hexdigest() # Authorization Endpointへリダイレクト AUTH_URL = AUTH_BASE_URL + '?{}'.format(parse.urlencode({ 'client_id': APP_CLIENT_ID, 'redirect_uri': APP_REDIRECT_URI, 'state': state, 'response_type': 'code' })) response = RedirectResponse(AUTH_URL) # ステート保存 response.set_cookie(key="AUTH_STATE", value=state) return response # Token Request def get_token(code): params = { 'client_id': APP_CLIENT_ID, 'client_secret': APP_CLIENT_SECRET, 'grant_type': 'authorization_code', 'redirect_uri': APP_REDIRECT_URI, 'code': code } x = requests.post(TOKEN_URL, params, verify=False).content.decode('utf-8') return ast.literal_eval(x) # Redirection Endpoint # ステートと認可コードを受け取る。 # ステート検証後、トークンリクエストを実行する。 @app.get("/auth/callback") async def auth(request: Request, code: str, state: str) -> RedirectResponse: # State検証 if state != request.cookies.get("AUTH_STATE"): return {"error": "state_verification_failed"} return get_token(code) if __name__ == "__main__": uvicorn.run(app, port=8000, loop="asyncio") 動作確認 コンテナを起動する docker-compose up Keycloak Admin コンソールにアクセスする。 http://localhost:8080 ※ログイン情報はdocker-composeに記載 クライアント(Clients)を登録する。 ※各種登録情報は、Keycloak: Authorization Code Grant Exampleを参考にする。 テストユーザー(Users)を登録する。 コンテナを再起動する。 docker-compose down docker-compose build docker-compose up Keycloak Authorization Endpointリダイレクト用エンドポイントにアクセスする。 http://localhost:8000/auth/login ユーザー認証を行う。 FastAPI側のリダイレクトURIにリダイレクトされ、ブラウザに以下のようなトークンレスポンスJSONが表示される。 { "access_token": "...", "expires_in": 60, "refresh_expires_in": 1800, "refresh_token": "...", "token_type": "Bearer", "not-before-policy": 0, "session_state": "...", "scope": "profile email" } 参考情報 Keycloak: Authorization Code Grant Example fastapi-keycloak-oidc-auth
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ライブラリ追加によるdockerイメージの作成(Python, tensorflow, sklearn)

目的 前回の記事でdockerをインストールしてベーシックな機械学習環境を構築することまで行いましたが、拾ってきたdockerイメージには必要なライブラリが入っていませんでした。そこで拾ってきたdockerイメージにライブラリを追加して新しいdockerイメージを作成することを行います。 実施内容概要 元となるdockerイメージ:tensorflow/tensorflow 追加するライブラリ:ScikitLearn、Pandas、imbalanced-learn 作成するdockerイメージ:my_ml 実施環境 MacBookAir  early 2020, RAM 8GB, CPU intel core i5 (非M1) OS: macOS Big Sur Ver. 11.4 実施内容 dockerの起動 docker desktopのインストールとtensorflowのdockerイメージのダウンロードが完了していれば、以下のコマンドをterminalに入力するだけでdockerを起動できます。 -d を追加して、バックグラウンドで動作してもらうことにしました。 --name TF を追加して、コンテナの名前をTFと固定しました。 % docker run -d -it --name TF -p 8081:8888 tensorflow/tensorflow:latest-jupyter 注意 2回目以降、上記コマンドではTFはすでにあるとのエラーが出ます。この時はdocker desktopの再生ボタンを押せば良いみたいです。 CLIの起動 docker desktopのCLIと書いてあるボタンをクリックするとコマンドラインが起動します。どうやらここがdockerコンテナ上のterminal相当の場所の様です。例えば、このコマンドライン上で「Python3」と入力するとPythonが起動します。(今は起動しません) pipによるライブラリのインストール 起動したコマンドライン上で以下のコマンドを実行してライブラリをインストールします。 $ pip install scikit-learn $ pip install pandas $ pip install imbalanced-learn インストールの確認 インストール完了後、起動しているコマンドライン上で以下を入力し、Python3を起動させます。 $ Python3 その後、起動したPython3にて以下を実行してエラーが出ないことを確かめます。 >>> import pandas >>> import sklearn >>> import imbalanced-learn その後一旦起動したCLIを終了させます。(terminalを左上のバッテンマークで消しておきます。) terminalの再起動とdockerイメージ化 terminalを再度起動して、以下のコマンドを入力します。これで新たなdockerイメージの作成が完了しました!! $ docker commit TF my_ml commitの後の第一引数で起動中のコンテナを指定(今はTF) 第二引数で作成するイメージの名前をつける(今回はmy_ml) イメージの名前には大文字は使えない様です。 $ docker images と入力すれば、my_mlと記載されたイメージが追加されていることが確認できるはずです。 結果 例えば、以下のコマンドをterminal上で実行すれば、 my_mlというdockerイメージから、 MLという名前のdockerコンテナを作成できます。 そしてこれにはすでに元にしたtensorflowはもちろん、pandas、Scikit-Learnとimbalanced-learnも含まれています! $ docker run -d -it --name ML -p 8088:8888 my_ml
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macにおけるdocker構築。Pythonと機械学習に向けて。

記事の目的 Pythonによる機械学習環境として、以下の二つを実施できる環境をdocker上に構築しました。 ・データサイエンス100本ノックが実施できる環境 ・Tensorflowが使用できる環境 当方、本職はプログラマーではなく、pythonや機械学習は初学者です。本記事は他のページを参考にしまくっておりキュレーションサイトの様ですがご容赦ください。。。 実施環境 MacBookAir  early 2020, RAM 8GB, CPU intel core i5 (非M1) OS: macOS Big Sur Ver. 11.4 dockerについて dockerとは Wikiによると、「Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである」とのことです。 コンテナ仮想化などの難しいキーワードがありますが、現時点では以下の目的を達成するための手段としています。 「Dockerは、パソコン(私の場合はMac)でPythonを使用して機械学習を実行するための環境」 *Pythonによらず、色々な言語の開発環境を整えられる様ですが、詳しくは分かりません・・・。 *anacondaなどPythonを使用するための環境は他にもありますが、dockerのメリットは以下の様です。 dockerのメリット 機械学習のフレームワーク用の環境を簡単に作成して、使い分けができる 例えば、TensorflowとPytorchなど機械学習用のフレームワークを動作させる環境を、docker(正確にはdockerコンテナ)上に個別に作成できます。 初心者目線ではとりあえずTensorflowを使用できる環境を簡単に作れることがメリットですが、上級者目線ではフレームワークのバージョンも含めて個別に環境構築ができるので、論文の検証などにも便利な様です。 開発環境を即座に構築し、配布できる。グループで開発する時に有効 初心者目線では、グループでアプリを作るとき、グループ内の一番詳しい人が作成してくれた環境を共有できる、といったところでしょうか。パソコン引越しの時にも役に立つはずです。近々パソコン買い替えを検討している方にも良いかと。 dockerコンテナ上で開発したアプリケーションを別の場所に移動させる際、コンテナイメージに変換することで環境をそのまま移動させることができる。(移動先の環境原因のバグを減らせる) 上のメリットと似てますね。Macからwindows、その逆も簡単にできる様です 開発環境を除去することも簡単なので、PCに不要なファイルが残ったりしない 初心者目線からこのメリットを理解するのは少々難しいのですが、要らないファイルが残らないのでパソコンがスッキリするという感じですかね・・・。 この他にもメリットはたくさんあるようです。詳しくは割愛します。 dockerのインストール 初心者にdockなんて必要?と思われるかもしれませんが、何事も試してみたい派なので、とりあえずインストールしました。参考にしたのは、以下のサイトのMacの箇所です。 Docker hubにサインイン DockerHubのサイトでユーザー登録をしておきます。 Docker Desktop on Macをインストール 以下のサイトにアクセスし、「Mac with intel chip」をクリックしてダウンロードし、 ダウンロード完了後に「docker.dmg」をダブルクリックしてインストールしました。 詳細は以下のサイトに記載してあります。 初回起動とチュートリアル 初回起動時はチュートリアルに沿って進めました。以下の画面です。 青い箇所をクリックするだけで、クローン、ビルド、ラン、シェアの順に進められます。 シェアのところで、先ほど作成したDocker hubに登録したユーザ名とパスワードを入力します。 もしかして、この初回起動時のチュートリアルは実行不要かも とりあえずdocker自体のインストールはこれで完了の様なので、次にデータサイエンス100本ノックの環境構築を行いました。 データサイエンス100本ノックが実施できる環境の構築 ここから先は以下のサイトを参考にしました。 Dockerセットアップまでは完了しているので、「Docker上で動かす」以降を実施しました。 初回起動 docker desktopが起動している状態で、以下のコマンドをteriminal上で実行します。 $ git clone https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess $ cd 100knocks-preprocess $ docker-compose up -d --build 次に、safariなどのブラウザ上で以下にアクセスします。(terminalではありません!) http://localhost:8888 Jupyter Notebookが起動します。Jupyter notebook上からworkのフォルダにアクセスし、その中の「preprocess_knock_Python.ipynb」を起動すれば、データサイエンス100本ノックの環境構築完了でした! 再開 再開時は、docker desktopを起動して100knocks-preprocessをstartさせます。 そして、ブラウザから以下にアクセスすれば再開できました!簡単! http://localhost:8888 Tensorflowのライブラリが使用できる環境の構築 ここから先は以下のサイトを参考にしました。 Keras/Tensorflowのdockerイメージのダウンロード 以下のコマンドをMacのterminalに入力し、Jupyter付きの最新のtensorflowをダウンロードします。 $ docker pull tensorflow/tensorflow:latest-jupyter dockerとjupyter notebookの起動 次に以下のコマンドをterminalに入力してdockerを起動します。 $ docker run -it -p 8081:8888 tensorflow/tensorflow:latest-jupyter この時、tokenが発行されます。terminalの返答にtoken=xxxxxxxxxxxxxxxと長い文字と数字の列があると思いますので、コピーしておきます。 次に、ブラウザ上で以下にアクセスします。起動時にポート8001を指定してるので、100本ノックとは異なります。 http://localhost:8081/ ブラウザ上でtokenを聞かれますので、そして先ほどコピーしたtokenを入力してJypyter notebookが使用できるようになりました! Jypyter notebook上では右上の「New▼」をクリックしてPython3を選べば開始できました。 テスト Jypyter notebookで以下をテストで実行したところ、エラーは出なかったのでひとまず成功している様です! 入力 import tensorflow as tf print(tf.reduce_sum(tf.random.normal([1000, 1000]))) 出力 tf.Tensor(-138.44626, shape=(), dtype=float32) ライブラリ確認 普段使用しているライブラリに関して、この段階で使用可能か確認しました 入っている ・・・numpy、matplotlib 入っていない・・・Pandas、sklearn、imbalanced-learn 次のステップとしてdockerイメージにライブラリを追加していく方法を探してみます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-compose で GitHub Enterprise Cloud に接続するセルフホストランナーを簡単に立ち上げる

背景 Docker を使ってセルフホストランナーを立ち上げた。 参考: https://qiita.com/Yoshihiro-Hirose/items/650863c3312eaee9770d 複数ランナーを立ち上げるのが手間だったりしたので効率化したい。 公開済みのコンテナイメージと docker-compose を使用する。 また、Github Enterprise Cloud を使っているので enterprise への設定例も載せていく。 実施環境 Linux Docker 使用するコンテナイメージ https://hub.docker.com/r/myoung34/github-runner 上記を参考に github で Personal Access Token を発行しておく 手順 docker-compose.yml ファイルを用意 項目についてはコメントを参照 docker-compose.yml version: '2.3' services: worker: image: myoung34/github-runner:latest environment: ACCESS_TOKEN: <発行した Personal Access Token> RUNNER_NAME_PREFIX: test-runner RUNNER_WORKDIR: /tmp/runner/work RUNNER_SCOPE: enterprise # enterprise に設定する場合指定 ENTERPRISE_NAME: <enterprise名> # 契約している enterprise 名 LABELS: linux,x64,test-runner # 必要に応じてラベルを追加 mem_limit: 2g # コンテナの最大メモリを指定 cpus: 2 # CPU の最大使用量を設定 volumes: - '/var/run/docker.sock:/var/run/docker.sock' - '/tmp/runner:/tmp/runner' docker-compose コマンドで立ち上げる docker-compose up -d --scale worker=4 woker に指定した数だけコンテナが立ち上がる 起動しているか確認 docker stats ログを確認 docker-compose logs -f --tail="5" ランナーの停止と起動したコンテナの削除 docker-compose down github 側の確認 以下 URL を確認 https://github.com/enterprises/<エンタープライズ名>/settings/actions/runners
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【独学・未経験】Ruby on Rails, AWS, Docker, CircleCIでポートフォリオを作成

ポートフォリオ紹介 アプリ名: BookLike Github: https://github.com/tera487/book_like 概要 BookLikeは、本の気づきを共有、発見するSNSアプリです。 開発背景 大学生になってから、ビジネス本や自己啓発本を読むようになりました。本を読むことで、新しい発見やさまざまな考えを知ることができましたが、本を読んでもその本の知識を日常生活に生かしきれていませんでした。このことから、本の知識を自分の知識として吸収し、日常生活で活用することで読書をする意味があると思いました。 そこで本の内容をアウトプットすることで、「本の知識が定着し、日常生活に生かしやすいのでは?」と考えました。そして本の感想や気づきをアウトプットし、また他人の感想から新たな学びが生まれると思い、『BookLike』を開発しようと思いました。 使用技術 フロントエンド HTML/CSS JavaScript(jQuery) Bootstarp 5.0 バックエンド Ruby 2.6.6 Rails 6.1.4 Mysql 8.0.25 開発環境 Docker/Docker-compose MySQL 5.7 本番環境 AWS(VPC、EC2、RDS for MySQL、S3、ALB、 IAM、Route53) MySQL 5.7 CircleCI (CI/CD) その他 Rubocop(コード整形) Rspec(単体・統合テスト) レスポンシブ化 お名前.com(独自ドメインの取得) 実装機能 ユーザー関連 新規登録機能・登録情報編集機能(画像登録可能) ログイン機能 ゲストログイン機能 フォロー機能(非同期) 管理者関連 管理者情報編集機能 記事投稿・編集・削除 アカウント削除 投稿関連 新規投稿・編集・削除 いいね機能(非同期) 通報機能(非同期) 書籍関連 書籍検索機能(楽天APIの利用) 読んだ本一覧 ER図 インフラ構成図 工夫した点 UI/UX 本を読んでいる人にも読んでいない人に、手軽に使ってもらいたいと思い、簡単に使ってもらうにはどのように設計していけばいいか考えながら作成しました。 モダンな技術の使用 自動デプロイ 開発環境にDockerを使用 AWSにデプロイ CircleCIでCI/CDパイプラインの構築 今後の技術的課題 本番環境でのDockerコンテナの利用(ECS) Terraformでインフラをコード化 SPAでの開発(vue.js React) 反省点 ポートフォリオ作成 完璧に理解してからポートフォリオを作成しようと思い、技術書を購入し、繰り返し勉強をしていたため、ポートフォリオ作成が遅れてしまいました。ポートフォリオを作成することで、あいまいに覚えているところの復習や自分がわからないところがわかるようになると思います。なので、基本的な知識を身につけたらポートフォリオの情報収集・作成すべきだと思いました。 エラー対応 エラーをしてからの対応が良くなかったと思います。エラー内容を理解せずに、Googleにエラー文をコピーしてエラーを解決しようとしていました。そのため、余計に時間がかかることがありました。まず何がエラーをおこしているか確認し、エラーしている意味を理解してから、それに対しての対応を模索することがエラー解決の近道であると考えます。 最後に 最後までご覧いただき、ありがとうございました。 ポートフォリオを作成してみて、改めて自分はプログラミングが好きだと思いました。まだ実力不足ですが自分が考えたものが形になるのが面白いと思いました。今後は反省点を活かし、プログラミングに励んでいきたいと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dockerでnginxを動かす

docker run --rm -p 80:80 nginx
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

vscodeでdockerに接続してxdebugでphpデバッグ

概要 VSCodeからdockerコンテナに接続してxdebugでphpデバッグする方法。 できてみたら簡単だったんだけど道を間違えて大はまりしたので残しておきます。 対象環境 VSCode on Windows WSL2 + Docker Desktop、またはvagrant + docker 前提 dockerコンテナでphpプログラムが動いてること phpにxdebugが入ってること もしphpのコンテナにxdebugが入ってない場合は、Dockerfileに RUN pecl install xdebug && docker-php-ext-enable xdebug とか付け足せばいけると思います。 予防線 VSCode初心者なので変な事してるかもしれません。 手順 1. php.iniの設定 概要 xdebugの設定をします。 vscodeでコンテナに接続してのデバッグなので、client_hostは127.0.0.1です。 手順 コンテナ内のphp.iniの [xdebug] セクションを、以下のようにします。 php.ini [xdebug] xdebug.client_host=127.0.0.1 xdebug.client_port=9003 xdebug.log=/tmp/xdebug.log xdebug.log_level=7 xdebug.mode=debug xdebug.start_with_request=yes xdebug.start_upon_error=yes xdebug.trigger_value= この通りでないとだめなのは、 client_host , client_port , mode , start_with_request の4つです。 ほかは変えても大丈夫なはずです。 2. VSCodeを起動する 起動してください。 3. dockerを動かしている環境への接続(vagrantの場合のみ必要) 概要 vscodeを、dockerコンテナを検出できる状態にします。 具体的には、dockerの動いている環境に接続します。 不要な場合 WSL + Docker Desktop の場合は、VSCodeを起動した時点でコンテナを検出可能なので、ここは飛ばしてください。 手順 a. vagrantへ接続するためのssh設定 c:\users\[username]\.ssh\config に、vagrantにssh接続するための設定を書きます。 .ssh/config Host vagrant HostName 127.0.0.1 Port 2222 IdentityFile c:\users\kumanobori\.vagrant.d\insecure_private_key User vagrant 補足:ssh接続情報は、 vagrant ssh-config で見ることができます。 ssh-config c:\dev\vm\dev ssh-config Host default HostName 127.0.0.1 User vagrant Port 2222 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile C:/Users/kumanobori/.vagrant.d/insecure_private_key IdentitiesOnly yes LogLevel FATAL 補足:接続に失敗する場合はだいたい鍵絡みという印象でした。パスの書き方がおかしいとか、権限が自分以外にあるとか。VSCodeにログが出ているので丹念に調べましょう。。。 b. 拡張機能 Remote - SSH のインストール 拡張機能 Remote - SSH が入ってない場合は入れます。 c. vagrantへの接続 コマンドパレットで >remote-ssh: connect current window to host を実行します。 少し待つと、前項で作成した .ssh\config の設定名が選択肢に出てくるので、それをクリックします。 少し待つと、接続先のOSを聞かれるので、Linuxをクリックします。 初回接続の場合はfingerprintの確認が出るので、continueをクリックします。 接続が成功したら、VSCodeの画面の左下に接続先が表示されます。 エクスプローラの「フォルダーを開く」をクリックします。 Dockerfileまたはdocker-compose.ymlの格納されているディレクトリを入力し、開きます。 (補足:これをしておかないと、次工程の Attach to Running Container がうまくいきません) 4. コンテナへの接続 概要 vscodeを、コンテナに接続します。 手順 a. 拡張機能 Remote - Containers のインストール 拡張機能 Remote - Containers が入ってない場合は入れます。 b. コンテナへの接続 コマンドパレットで Remote-Containers: Attach to Running Container を実行します。 少し待つと、稼働中コンテナが選択肢に出てくるので、phpコンテナをクリックします。 コンテナが新しいウィンドウで開きます。前のウィンドウは消しても問題ないです。 エクスプローラの「フォルダーを追加」をクリックします。 コンテナ内の、プロジェクトルートとなるべきディレクトリを指定します。 ファイルが表示されます。 5. コンテナの設定 概要 コンテナ内でデバッグ実行のための設定をします。 a. コンテナの拡張機能設定 コンテナに拡張機能 PHP Debug が入っていない場合は入れます。 b. コンテナのデバッグ設定 デバッグウィンドウの、「launch.jsonファイルを作成します」をクリックします。 言語を聞かれます。「PHP」にします。 (補足:前工程でPHPデバッガを入れておかないと、ここでPHPが選択肢に出てきません。) launch.json が生成されます。 jsonの configurations 内に Listen for Xdebug, Launch currently open script, Launch Build-in web server の3つがあります。使うのは Listen for Xdebug だけなので、あとの2つは消します。 jsonにパスマッピング設定を追加します。${workspaceRoot} は、vscodeのエクスプローラーで開いているフォルダです。 Listen for Xdebug をクリックします。これでデバッグ開始です。 どこか適当なところにブレークポイントを置いてみて、止まれば成功です。 あとがき vagrant経由のやり方は、ほかのリモートサーバに接続する場合にも使えそうです。 入れるデバッガとlaunch.jsonのところを変えれば、他の言語もいけそうな気がしてます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む