20210419のdockerに関する記事は8件です。

初心者でもDockerでWordPressの環境構築ができた!

はじめに この記事はDockerを軽く勉強しただけの駆け出しエンジニアが、 Docker、WordPressの勉強のために環境構築をする過程・反省を記した備忘録です。 よって、詳しい説明や深い考察などはなく、ただこの経験を忘れたくないなと思い記録に残したものです。 業界でいうと未経験者なので、さほど難しい言葉もないと思います。同じく初学者である方々への励みにもなればなと思います。(Docker用語?は登場します。) ちなみにローカルで勉強用にWordPressを使うだけなら環境構築は Local by Flywheel と検索するとやり方が出てくると思いますが、ソフトウェアをインストールして軽く設定をしてもらうだけですぐにできます。 あくまで私はDockerの勉強も兼ねてやってみようと思った次第です。 経緯 新たにWordPressを学び始めるにあたって、Dockerも絶賛勉強中だったため せっかくならと得た知識をアウトプットする意味でも環境構築をDockerでやってみようと考えました。 ちなみに、何をもとにDockerを学んでいるかというと、 Udemyの「ゼロからはじめる Dockerによるアプリケーション実行環境構築」というコースです。これを現在40%ほど終わらせたところです。(決してステマなどではありません。) 一応リンクも貼っておきます。(ステマではありません。) まずは自力で頑張ってみる(失敗例) まずは作業用のディレクトリを作る(名前はなんでもよい) $ mkdir WordPress/WordPress-lecture 次に、nginxでサーバーを立ち上げるレッスンで使った、バインドマウントを設定してWordPressイメージのコンテナを立ち上げるコードを実行しようとした(macの場合のコード) WordPress-lecture $ docker run --name wordpress-lecture:ver1 \ -v /Users/(PCのユーザー名)/WordPress/WordPress-lecture:/usr/share/wordpress/html:ro -d -p 8081:80 wordpress Dockerコンテナのタグの指定はここではできないためエラー。:ver1の部分を消して再度実行 するとエラーは起きずコンテナは立ち上がったが肝心のサーバーがないため、もちろんブラウザで localhost:8081 にアクセスしてもページは表示されず。。。 コンテナにnginxのイメージを追加すればいいのか?それともnginxのサーバーを立ち上げてそこにWordPressのイメージを追加したほうがいいのか?Apacheじゃなきゃダメなのか?と考えて参考になるものがないかネットを漁ってみたが、学んだことをもう一度調べ直すのにもここまでそれなりの時間を要していたため、早くWordPressの勉強に取り掛かりたかったので結局最後は先輩方の知恵をお借りすることに。。。 完成されたコードを使いWordPressの環境を整える Qiitaで探すと何人かの方々が既に試していらっしゃったのでそのコードを拝借することに 参考にさせていただいた記事 ① https://qiita.com/qpSHiNqp/items/48815ed90bd474064708 ② https://qiita.com/t20190127/items/3abb7c17acdc8543c8ad ③ https://qiita.com/engineer_ikuzou/items/07ff7bd7c9eabf0b3d6b ・①の記事のdocker-compose.ymlの内容を丸パクリさせてもらい、自身のWordPress-lectureディレクトリ内にdocker-compose.ymlファイルを作成 ・自身の現在のディレクトリをコンテナにバインドマウントするための記述 -.:/app をvolumes欄に追加 ・ポート番号8080は別のレッスンで使用していたので8081に変更 最終的なファイルの内容がこちら docker-compose.yml version: '3.1' services: wordpress: image: wordpress restart: always ports: - 8081:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb volumes: - .:/app - wordpress:/var/www/html - ./wp-content/themes:/var/www/html/wp-content/themes - ./wp-content/plugins:/var/www/html/wp-content/plugins db: image: mysql:5.7 restart: always environment: MYSQL_DATABASE: exampledb MYSQL_USER: exampleuser MYSQL_PASSWORD: examplepass MYSQL_RANDOM_ROOT_PASSWORD: '1' volumes: - db:/var/lib/mysql volumes: wordpress: db: 今まで丸パクリしたコードでも度々エラーが起きていた経験から、無事に成功するかドキドキしながらも、 docker-compose.ymlファイルを置いているWordPress-lectureディレクトリからコマンドを実行 WordPress-lecture $ docker-compose up -d (-dオプションはバックグラウンドで処理を実行させるためのもの) doneの文字が表示され無事に成功 localhost:8081にアクセスするとWordPressのデフォルト画面が表示された! ここに来るまでにかなりの時間がかかり苦労したため、無事に成功して感動。 エンジニアにとって苦労することが大事と言うけど、本当にその通りで苦労して手に入れた技術とか知識は身体に染み付くと思うし、うまくいった時に感動があるのでますます勉強が好きになるし意欲も高まっていきますね。 ※もし間違い等あれば指摘・訂正していただければと思います。 ということで以上です 終
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Flaskを使用したFacebook ログイン 連携用API作成 メモ

Flask を使用してFacebookログイン連携するためのAPI作成方法についてメモする。 Google連携用APIを試した時と同様に、Docker起動できる形で過去に作成したFacebook検証コードを部分的にAPI化した。 作成するAPI 認可リクエスト作成API Facebookへの認可エンドポイントへアクセスするためのURLをパラメータをつけて生成・返却する。 stateはAPI呼び出し時に生成し、レスポンスとして返却する。 client_idなど固定の属性値は環境変数から取得する。 リクエスト例 POST /api/facebook/auth_request/create HTTP/1.1 Host: localhost:5000 レスポンス例 { "authorization_request_url": "https://www.facebook.com/v10.0/dialog/oauth?client_id=AAABBBBCCC&scope=email&redirect_uri=http%3A%2F%2Flocalhost%3A5000%2Fcallback&state=ABCDE12345&response_type=code", "state": "ABCDE12345" } トークンリクエスト+ユーザー情報取得API 認可レスポンスとして受け取った認可コード(code)を指定して、トークンリクエスト+ユーザー情報取得を行う。 今回は簡略化のため認可リクエストパラメータのDB保存まで実装しておらず、検証処理は行っていないが、stateパラメータの検証は必ず行うこと。 リクエスト POST /api/facebook/auth_request/complete HTTP/1.1 Host: localhost:5000 Content-Type: application/json Content-Length: 363 { "code":"XXX" } レスポンス例 { "id": "1234567890", "name": "山田太郎" } プロジェクト構成 facebook_oidc └─ docker-compose.yml └─ facebook.env │ └─ be └─ Dockerfile └─ requirements.txt │ └─app └─ app.py │ └─ api └─ __init__.py │ └─views └─ facebook.py 実装 docker-compose.yml ※起動時に環境変数ファイルfacebook.envを読み込む。 version: "3" services: be: container_name: be build: ./be env_file: facebook.env volumes: - ./be/app:/app ports: - "5000:5000" command: flask run --host 0.0.0.0 --port 5000 tty: true facebook.env 環境変数ファイル。アプリケーション登録時に発行・設定した値を指定する。 FACEBOOK_CLIENT_ID=YOUR_CLIENT_ID FACEBOOK_CLIENT_SECRET=YOUR_CLIENT_SECRET FACEBOOK_SCOPE_LIST=YOUR_SCOPE_LIST FACEBOOK_REDIRECT_URI=YOUR_REDIRECT_URI FACEBOOK_AUTHORIZATION_ENDPOINT=https://www.facebook.com/v10.0/dialog/oauth FACEBOOK_TOKEN_ENDPOINT=https://graph.facebook.com/v10.0/oauth/access_token FACEBOOK_APP_TOKEN_ENDPOINT=https://graph.facebook.com/oauth/access_token FACEBOOK_TOKEN_VALIDATION_ENDPOINT=https://graph.facebook.com/debug_token FACEBOOK_USER_INFO_ENDPOINT=https://graph.facebook.com/v10.0/ be/requirements.txt Pythonライブラリ一式 Flask Flask-Cors be/Dockerfile FROM python:3.8 RUN mkdir /app ADD requirements.txt /app ENV PYTHONUNBUFFERED 1 EXPOSE 5000 WORKDIR /app RUN pip3 install -r requirements.txt be/app/app.py from api import app if __name__ == '__main__': app.run() be/api/__init__.py from flask import Flask from .views.facebook import facebook_router from flask_cors import CORS def create_app(): app = Flask(__name__) CORS(app, supports_credentials=True) app.register_blueprint(facebook_router, url_prefix='/api') return app app = create_app() be/api/views/facebook.py コントローラー ※エラーハンドリング皆無 import hashlib from flask import Flask, Blueprint, request import urllib.parse as parse import urllib.request as req import urllib.error as error import json import os from pprint import pprint # Routing Settings facebook_router = Blueprint('facebook_router', __name__) # Client Param client_id = os.getenv('FACEBOOK_CLIENT_ID') client_secret = os.getenv('FACEBOOK_CLIENT_SECRET') redirect_uri = os.getenv('FACEBOOK_REDIRECT_URI') scope_list = os.getenv('FACEBOOK_SCOPE_LIST') # Facebook Endpoint authorization_endpoint = os.getenv('FACEBOOK_AUTHORIZATION_ENDPOINT') token_endpoint = os.getenv('FACEBOOK_TOKEN_ENDPOINT') app_token_endpoint = os.getenv('FACEBOOK_APP_TOKEN_ENDPOINT') token_validation_endpoint = os.getenv('FACEBOOK_TOKEN_VALIDATION_ENDPOINT') user_info_endpoint = os.getenv('FACEBOOK_USER_INFO_ENDPOINT') app = Flask(__name__) # Create Authorization Request Endpoint @facebook_router.route("/facebook/auth_request/create", methods=['POST']) def create(): # Generate state state = hashlib.sha256(os.urandom(32)).hexdigest() # Create Authz Request URL auth_request_url = authorization_endpoint+'?{}'.format(parse.urlencode({ 'client_id': client_id, 'scope': scope_list, 'redirect_uri': redirect_uri, 'state': state, 'response_type': 'code' })) res_body = { "authorization_request_url": auth_request_url, "state": state } return json.loads(json.dumps(res_body)) # Token Request And Get User Info Endpoint @facebook_router.route("/facebook/auth_request/complete", methods=['POST']) def complete(): # Parse Req Body jsonData = json.dumps(request.json) req_body = json.loads(jsonData) # Exchange Authorization code for Access Token token_req_url = token_endpoint+'?{}'.format(parse.urlencode({ 'client_id': client_id, 'client_secret': client_secret, 'redirect_uri': redirect_uri, 'code': req_body["code"] })) try: token_req = req.Request(token_req_url, method='GET') with req.urlopen(token_req) as token_res: token_res_body = token_res.read() except error.HTTPError as err: err_str = str(err.code) + ':' + err.reason + ':' + str(err.read()) pprint(err_str) except error.URLError as err: err_str = err.reason pprint(err_str) access_token = json.loads(token_res_body)['access_token'] # Generate App Access Token # https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens app_token_req_url = app_token_endpoint+'?{}'.format(parse.urlencode({ 'client_id': client_id, 'client_secret': client_secret, 'grant_type': 'client_credentials' })) try: app_token_req = req.Request(app_token_req_url, method='GET') with req.urlopen(app_token_req) as app_token_res: app_token_res_body = app_token_res.read() except error.HTTPError as err: err_str = str(err.code) + ':' + err.reason + ':' + str(err.read()) except error.URLError as err: err_str = err.reason app_token = json.loads(app_token_res_body)['access_token'] # Validate Access Token token_validation_req_url = token_validation_endpoint+'?{}'.format(parse.urlencode({ 'input_token': access_token, 'access_token': app_token })) try: token_validation_req = req.Request( token_validation_req_url, method='GET') with req.urlopen(token_validation_req) as token_validation_res: token_validation_res_body = token_validation_res.read() except error.HTTPError as err: err_str = str(err.code) + ':' + err.reason + ':' + str(err.read()) pprint(err_str) except error.URLError as err: err_str = err.reason pprint(err_str) # Get User Info # https://developers.facebook.com/docs/graph-api/reference/user user_request_url = user_info_endpoint+'/' + \ json.loads(token_validation_res_body)['data']['user_id']+'/' headers = { 'Authorization': 'Bearer ' + access_token } user_req = req.Request(user_request_url, headers=headers, method='GET') with req.urlopen(user_req) as user_res: user_res_body = user_res.read() return json.loads(user_res_body) 起動 docker-compose up -d 参考情報 ログインフローを手動で構築する アクセストークン
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerとコンテナの概要

本記事について 本記事は題名の通り、Dockerとコンテナに概要を記載したものです。 自分用メモですがDocker初心者がイメージしやすい…と思うレベルで記載したのでどなたかの参考になれば幸いです。 Dockerとは Dockerはデータやソフトウェアを隔離できる仕組みを持ちます。 通常、パソコンやサーバでは複数のソフトウェアが同時に動いています。 私のパソコンで例を挙げるとサーバにApacheを、DBにMySQLを、プログラミングにEclipseを使用している状態ですね。 このように複数のソフトウェアやデータをそれぞれ独立した環境に隔離できるのがDockerです。Dockerで隔離するのはソフトウェアやデータだけではなく、OS(ようなもの)ごと出来るのです。 コンテナとは 簡単な例としてパソコンやサーバ上の環境をタンスのように細かい収納空間に分けている…と考えれば身近に思える(かな?) 独立した収納空間ごとにMySQLやEclipseと言ったデータやソフトウェアが入っています。 この収納空間のことをコンテナ(container)と言い、コンテナが使える仕組みを備えているのがDockerです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker compose up で謎のエラーが起きた話

発生した事象 docker-compoes up を実行すると文字化けとインデントが崩れまくったエラーが発生。 コンテナとイメージを削除した後再度 docker compose up を実行したところ、一度はうまくいったものの、その後実装に大き目の変更をしたところ再び同様のエラーが発生した。 環境など - Windows 10 Pro バージョン 1909 - docker for windows 3.2 エラー全文は長いので最後の方に出します 対応 最終的にDocker を「プログラムの追加と削除」からアンインストール→最新版のDockerをインストールしたところ、 WSL2のインストールが完了していないからLinuxカーネルをインストールしてくださいと言われ、その指示に従った結果なおりました。 上記に至るまでに - FileSharing の設定をクリア→再設定 - PC本体再起動 - docker prune - dockerを最新版にアップデート などなど試みました。 発生したのは社用PCだったのですが、そちらは以前WSL2を設定しようとして、権限等の関係で途中でやめたという経緯があります。 おそらくその時の作業が中途半端に終わったせいで発生したためにかなりまれな例だと思われます。 ググっても同様の例にたどり着かなかったので絶望しました。 Creating webcrew_nginx_1 ... Creating webcrew_python_1 ... Creating webcrew_nginx_1 ... error Creating webcrew_python_1 ... error ERROR: for webcrew_nginx_1 Cannot create container for service nginx: status code not OK but 500: ☺ \ufffd\ufffd\ufffd\ufffd☺ ♀☻ FDocker.Core, Version=3.3.0.62907, Culture=neutral, PublicKeyToken=null♣☺ ocker.Core.DockerException♀ ClassNameMessage♦DWatsonBuckets☺☺♥♥☺☺☺ ☺ ☺▲System.Collections.IDictionary►System.Excepti☻☻ ♠♥ ex☼ExceptionMethodHResult♠Source ocker.Core.DockerException♠♦ ▲Filesharing has been cancelled ♠♣ \ufffd¶ �ꏊ Docker.ApiServices.Mounting.FileSharing.<DoShareAsync>d__7.MoveNext() �ꏊ C:\workspaces\PR-15595\src\github.com\docke r\pinata\win\src\Docker.ApiServices\Mounting\FileSharing.cs:�s 0 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ Docker.ApiServices.Mounting.FileSharing.<ShareAsync>d__5.MoveNext() �ꏊ C:\workspaces\PR-15595\src\github.com\docker\pinata\win\s rc\Docker.ApiServices\Mounting\FileSharing.cs:�s 53 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ Docker.HttpApi.Controllers.FilesharingController.<ShareDirectory>d__2.MoveNext() �ꏊ C:\workspaces\PR-15595\src\github.com\docker \pinata\win\src\Docker.HttpApi\Controllers\FilesharingController.cs:�s 21 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__1`1.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext() ♠♠ \ufffd☺8 MoveNext Docker.ApiServices, Version=3.3.0.62907, Culture=neutral, PublicKeyToken=null Docker.ApiServices.Mounting.FileSharing+<DoShareAsync>d__7 Void MoveNext() §‼\ufffd♠ ↕Docker.ApiServices ERROR: for webcrew_python_1 Cannot create container for service python: status code not OK but 500: ☺ \ufffd\ufffd\ufffd\ufffd☺ ♀☻ FDocker.Core, Version=3.3.0.62907, Culture=neutral, PublicKeyToken=null♣☺ ocker.Core.DockerException♀ ClassNameMessage♦DWatsonBuckets☺☺♥♥☺☺☺ ☺ ☺▲System.Collections.IDictionary►System.Excepti☻☻ ♠♥ ex☼ExceptionMethodHResult♠Source ocker.Core.DockerException♠♦ ▲Filesharing has been cancelled ♠♣ \ufffd¶ �ꏊ Docker.ApiServices.Mounting.FileSharing.<DoShareAsync>d__7.MoveNext() �ꏊ C:\workspaces\PR-15595\src\github.com\docke r\pinata\win\src\Docker.ApiServices\Mounting\FileSharing.cs:�s 0 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ Docker.ApiServices.Mounting.FileSharing.<ShareAsync>d__5.MoveNext() �ꏊ C:\workspaces\PR-15595\src\github.com\docker\pinata\win\s rc\Docker.ApiServices\Mounting\FileSharing.cs:�s 53 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ Docker.HttpApi.Controllers.FilesharingController.<ShareDirectory>d__2.MoveNext() �ꏊ C:\workspaces\PR-15595\src\github.com\docker \pinata\win\src\Docker.HttpApi\Controllers\FilesharingController.cs:�s 21 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__1`1.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext() ♠♠ \ufffd☺8 MoveNext Docker.ApiServices, Version=3.3.0.62907, Culture=neutral, PublicKeyToken=null Docker.ApiServices.Mounting.FileSharing+<DoShareAsync>d__7 Void MoveNext() §‼\ufffd♠ ↕Docker.ApiServices ERROR: for nginx Cannot create container for service nginx: status code not OK but 500: ☺ \ufffd\ufffd\ufffd\ufffd☺ ♀☻ FDocker.Core, Version=3.3.0.62907, Culture=neutral, PublicKeyToken=null♣☺ ocker.Core.DockerException♀ ClassNameMessage♦Data♫InnerExceptiWatsonBuckets☺☺♥♥☺☺☺ ☺ ☺▲System.Collections.IDictionary►System.Excepti☻☻ ♠♥ odHResult♠Source ocker.Core.DockerException♠♦ ▲Filesharing has been cancelled ♠♣ \ufffd¶ �ꏊ Docker.ApiServices.Mounting.FileSharing.<DoShareAsync>d__7.MoveNext() �ꏊ C:\workspaces\PR-15595\src\github.com\docke r\pinata\win\src\Docker.ApiServices\Mounting\FileSharing.cs:�s 0 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ Docker.ApiServices.Mounting.FileSharing.<ShareAsync>d__5.MoveNext() �ꏊ C:\workspaces\PR-15595\src\github.com\docker\pinata\win\s rc\Docker.ApiServices\Mounting\FileSharing.cs:�s 53 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ Docker.HttpApi.Controllers.FilesharingController.<ShareDirectory>d__2.MoveNext() �ꏊ C:\workspa\pinata\win\src\Docker.HttpApi\Con trollers\FilesharingController.cs:�s 21 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__1`1.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext() ♠♠ \ufffd☺8 MoveNext Docker.ApiServices, Version=3.3.0.62907, Culture=neutral, PublicKeyToken=null Docker.ApiServices.Mounting.FileSharing+<DoShareAsync>d__7 Void MoveNext() §‼\ufffd♠ ↕Docker.ApiServices ERROR: for python Cannot create container for service python: status code not OK but 500: ☺ \ufffd\ufffd\ufffd\ufffd☺ ♀☻ FDocker.Core, Version=3.3.0.62907, Culture=neutral, PublicKeyToken=null♣☺ ocker.Core.DockerException♀ ClassNameMessage♦Data♫InnerExceptiWatsonBuckets☺☺♥♥☺☺☺ ☺ ☺▲System.Collections.IDictionary►System.Excepti☻☻ ♠♥ odHResult♠Source ocker.Core.DockerException♠♦ ▲Filesharing has been cancelled ♠♣ \ufffd¶ �ꏊ Docker.ApiServices.Mounting.FileSharing.<DoShareAsync>d__7.MoveNext() �ꏊ C:\workspaces\PR-15595\src\github.com\docke r\pinata\win\src\Docker.ApiServices\Mounting\FileSharing.cs:�s 0 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ Docker.ApiServices.Mounting.FileSharing.<ShareAsync>d__5.MoveNext() �ꏊ C:\workspaces\PR-15595\src\github.com\docker\pinata\win\s rc\Docker.ApiServices\Mounting\FileSharing.cs:�s 53 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ Docker.HttpApi.Controllers.FilesharingController.<ShareDirectory>d__2.MoveNext() �ꏊ C:\workspaces\PR-15595\src\github.com\docker \pinata\win\src\Docker.HttpApi\Controllers\FilesharingController.cs:�s 21 --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__1`1.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext() --- ���O�ɗ�O���X���[���ꂽ�ꏊ����̃X�^�b�N �g���[�X�̏I��� --- �ꏊ System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() �ꏊ System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) �ꏊ System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext() ♠♠ \ufffd☺8 MoveNext Docker.ApiServices, Version=3.3.0.62907, Culture=neutral, PublicKeyToken=null Docker.ApiServices.Mounting.FileSharing+<DoShareAsync>d__7 Void MoveNext() §‼\ufffd♠ ↕Docker.ApiServices Encountered errors while bringing up the project.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

M1 Macでも快適なVSCode Remote Container用イメージ作成を試す

M1 Macでも環境を汚さずにVSCodeで開発したいが… Apple M1チップに対応した「Docker Desktop」が一般リリースされました。 Visual Studio Codeの「Remote - Containers」拡張機能を試してみようと、まずは3ステップ(?)で簡単に試せる「Quick start」通りの方法で、「Node.js & TypeScript」環境を選択して動かしてみると… 正直なところ、私の M1 Mac mini(メモリ8GB)環境では、動作がもっさりとしています。 よく見ると、Dockerイメージが x86-64 向けなのですね。 arm64 向けイメージをパッとは探せず、Intel Macもまだまだ使っているので、ここはマルチプラットフォームのイメージ作成を試してみるいい機会だと思い立ちました。 試作したイメージ DockerHub: https://hub.docker.com/u/earth422 「Node.js & TypeScript」用イメージの使い方 /.devcontainer/Dockerfile FROM earth422/vscode-dev-container-typescript-node:14 # [Optional] Uncomment this section to install additional OS packages. # RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ # && apt-get -y install --no-install-recommends <your-package-list-here> # [Optional] Uncomment if you want to install an additional version of node using nvm # ARG EXTRA_NODE_VERSION=10 # RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" # [Optional] Uncomment if you want to install more global node packages # RUN su node -c "npm install -g <your-package-list -here>" /.devcontainer/devcontainer.json { "name": "Node.js & TypeScript", "build": { "dockerfile": "Dockerfile" }, // Set *default* container specific settings.json values on container create. "settings": { "terminal.integrated.shell.linux": "/bin/bash" }, // Add the IDs of extensions you want installed when the container is created. "extensions": [ "dbaeumer.vscode-eslint" ], // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. // "postCreateCommand": "yarn install", // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. "remoteUser": "node" } ワークスペースに上の2つのファイルを作成する docker-composeを使うこともできます。 コマンドパレット(F1キー)から、「Remote-Containers: Open Folder in Container...」を選択 私の環境では、もっさり感はなくなりました。 イメージ作成方法 Dockerの「マルチCPUアーキテクチャ」に対応したイメージをビルドする方法は、公式サイトのほか、こちらのサイトを参考にさせていただきました。 Dockerの「マルチCPUアーキテクチャ」に対応したイメージをビルドする 0. 「buildx」コマンドを使う準備をする $ docker buildx create --name mybuilder $ docker buildx use mybuilder これだけでOKでした。 1. 公式イメージのルーツを調べる 詳しい方は一発で作成できるDockerfileを書けるのかもしれませんが、できるだけ労力をかけないで(ほとんど書き換えないで)やってみたいところ。 公式の「Node.js & TypeScript」用イメージは、「Node.js & JavaScript」用イメージから、その元はNode.js公式のbusterイメージから来ているようです。Node.js公式イメージはマルチプラットフォーム対応しているので、ここからスタートしてみました。 2. 「buildx」コマンドでビルドする まずビルド環境と異なるプラットフォームのDockerイメージは出力することができないので、ビルドしたDockerイメージをローカルに保持することなく「Docker Hub」へ直接出力するために、Docker Hubへのログインを行います。 次に、とりあえず自分が必要なNode14用のDockerfileと必要なスクリプト(docker-entrypoint.sh)をローカルに落とします。(後で、この部分は必要なかったと気づきましたが、buildxコマンド自体初めての体験だったこともあり、実際の作業を記録しておきます。) この状態でビルドを実行します。 $ docker login $ docker buildx build --platform linux/amd64,linux/arm64 -t earth422/node:14 --push . 元々マルチプラットフォーム対応しているので当然ですが、うまくビルドできたようです。 3. 公式を元にDockerfileを書き換えてビルドする 公式の「Node.js & TypeScript」用イメージのソースを見たところ、CPUアーキテクチャに依存するようなところはなさそうです。 本当は公式のDockerfileのままでマルチプラットフォーム対応版の「Node.js & JavaScript」用イメージを作成できるはずですが、私の場合は先ほどビルドしたイメージを元に作成しました。 直したのは、もちろん最初だけです。 /vscode-dev-container-node/Dockerfile FROM earth422/node:14 先ほどと同様にビルドを実行します。 $ docker buildx build --platform linux/amd64,linux/arm64 -t earth422/vscode-dev-container-node:14 --push . 今度もうまくビルドできたようです。このイメージを元に、更にマルチプラットフォーム対応版の「Node.js & TypeScript」用イメージを作成します。 今度も修正するのは頭だけでした。 /vscode-dev-container-typescript-node/Dockerfile FROM earth422/vscode-dev-container-node:14 $ docker buildx build --platform linux/amd64,linux/arm64 -t earth422/vscode-dev-container-typescript-node:14 --push . すんなり成功しました。 特に目新しいこともありませんが、ご自分で作成されるのが面倒な方は自己責任で使ってください。 公式もマルチプラットフォームに対応するといいなぁ。 参考文献等 Docker Buildx Dockerの「マルチCPUアーキテクチャ」に対応したイメージをビルドする Developing inside a Container using Visual Studio Code Remote Development VS Code Remote / GitHub Codespaces Container Definitions docker-node / 14 / buster 最後に 読んでくださった方、ありがとうございました。 初めてのQiita投稿です。お手柔らかにお願いいたします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

M1 Macに対応したDocker[Apple Silicon]がリリースされたので早速動作確認した

待ちに待ったApple Silicon対応Docker 4月15日に公式ブログが更新されていました。 Released: Docker Desktop for Mac [Apple Silicon] - Docker Blog After the M1 machines were publicly available, those of you on our developer preview program tested some very early builds. And then as we moved into public tech previews and release candidates, many more of you joined in with testing your enormous variety of use cases, and reporting bugs. In total we have had 45,000 downloads of the various preview builds, and 140 tickets raised on our public bug tracker, not to mention countless messages on our community Slack. M1 Mac公開後、Slackでのコミュニケーションはもちろんバグトラッカーでは140チケットが作成されたとのこと。 Githubのarea/m1ラベルが付与されているIssueの量からコミュニティの熱量が伺えます。 Issues · docker/for-mac · GitHub インストール 早速やっていきます。 インストールは↓から Install Docker Desktop on Mac | Docker Documentation Mac with Apple chip うおおおおおおお うおおおおおおおおおお うおおおおおおおおおお!! うおおおお・・? Docker Desktop needs privileged access. そういえばアクセス権を求められるんでした。 しばらくDockerをインストールすることがなかったので忘れてました。 警告メッセージのOKを押下してパスワードを入力、再度起動します。 うおおおおおおおおおお!念願のダッシュボード! と言うことはメニューバーにも・・? うおおおおおおおお!!! 動作確認 いつの間にかDockerダッシュボードがチュートリアルを始めようとしているのでそのまま進めていきます。 水色のボックスにチュートリアルコマンドが記載されています。 押下すると自動でコマンドを実行してくれます。 どうやらalpineのコンテナを起動したのちコンテナ内で何かしらのリポジトリをクローンしてます。 更にコンテナ内にあるクローンしたリポジトリをローカルにコピーしてますね。 クローンしたリポジトリにあるDockerfileを使ってイメージをビルドします。 ビルドしたイメージを起動します。 コマンドから察するにWebサーバ機能を持ったイメージをポート指定して起動していそうです。 Save and share your image on Docker Hub to enable other users to easily download and run the image on any destination machine. イメージをDockerHubに保存して共有できるよとのこと。 特に必要ないのでSkipします。 見事最初のコンテナイメージを起動できたらしいです! リンク遷移ボタンを押すと先ほど起動したコンテナが持っているWebページを見ることができます。 こんな感じの ついにM1 MacでDockerを使うことに成功しました!!うおー! お掃除 というわけでお掃除の時間です。(賢者タイム) ダッシュボードを見ると今回使用した2つのリポジトリを確認できるのでゴミ箱ボタンを押して削除しちゃいましょう。 問答無用でRemoveしちゃいます。 ※クローンしたリポジトリも必要ないので消しちゃってもいいです。 終わりに 正直人柱気分で購入したMac Miniでしたが、これで本格的に開発機として使用できるようになりました。 Docker使えないならまだいいかなあ・・と思っていた人もこれでM1への第一歩を踏み出せますね!! (早くデュアルモニターに対応したMacBookPro発売されないかなあ・・・)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【とりあえずハンズオン】Dockerfileでコンテナを作ろう

はじめに この記事では AWS Cloud Tech を通して Docker を学習して実践していく記事です。 主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど) 誤りなどがあれば書き直していく予定です。 動作環境 Windows10 Pro Docker for Windows v20.10.5 M1 CPU 搭載型 MacBook Docker for Mac v20.10.3 Dockerfile Dockerfile を書くとは コンテナ技術において Dockerfile を書くということは アプリケーションの動作環境をコードにして起こすことを指す。 Dockerfile を書くことのメリット Docker ファイルを書くことで アプリケーションの動作環境をコードにして起こすことが可能になる為 動作環境ドキュメントとしても利用できる。 具体的にはそのアプリケーションに必要なパッケージやコンフィグファイルを イメージという単位で 1 箇所にまとめて管理することで 動作環境の構成をクリーンに保つことができる。 ひとつ書いて実行してみるその前に 今回ハンズオンで利用するコード Dockerfile に書く命令 CloudTech の Docker 講座で閲覧できる Dockerfile の構成 CloudTech では Python の Web フレームワークである Django を例に コンテナ作成を紹介しています。 # Test stage FROM alpine AS test LABEL application=todobackend # Install basic utilities RUN apk add --no-cache bash git # Install build dependencies RUN apk add --no-cache gcc python3-dev py3-pip libffi-dev musl-dev linux-headers mariadb-dev RUN pip3 install wheel -U # Copy requirements COPY /src/requirements* /build/ WORKDIR /build # Build and install requirements RUN pip3 wheel -r requirements_test.txt --no-cache-dir --no-input RUN pip3 install -r requirements_test.txt -f /build --no-index --no-cache-dir # Copy source code COPY /src /app WORKDIR /app # Test entrypoint CMD ["python3", "manage.py", "test", "--noinput", "--settings=todobackend.settings_test"] FROM いろんなテキスト、記事を読むと以下のような説明が書いてある。 コンテナのベースとなるベースイメージを指定する。 つまりは、どういうことかというと コンテナ上で動作する OS を指定するという意味に近い。 今回は alpine Linux と呼ばれる LinuxOS をベースイメージとしている。 LABEL イメージ情報にコメントや作成者情報を入れる。 COPY ホスト OS(Docker を動かす OS)のファイルを イメージ内にコピーで取り込む このときホスト OS 上で参照できるファイルは Docker を起動したパス(ビルドコンテキスト)に限る。 WORKDIR Dockerfile に定義された命令をどのディレクトリで実行するかを決める。 いわゆる、cd コマンド RUN イメージを生成するときに実行するコマンドを指定する。 CMD RUN はイメージを生成するときに利用するコマンドであるのに対して CMD はイメージをもとに生成したコンテナ上で実行するコマンドを指定する。 実際に動かしてみよう イメージを作成 イメージからコンテナを作成 コンテナに bash で入る コンテナを実行 コンテナを削除 イメージを削除 # 現在のDocker イメージを確認 $ docker images # まずは不要なイメージをすべて削除 $ docker rmi -f $(docker images -q) # 現在参照しているDockerfileをmyimage1というタグをつけてビルド $ docker build -t myimage1 . # コンテナに入ってみる。コンテナnameはtest $ docker run -it --name test --rm myimage1 /bin/bash # 入れることがわかったのでexit bash-5.1 $ exit exit # Django を実行 コンテナnameはtest $ docker run -it --name test --rm myimage1 nosetests --verbosity=2 --nologcapture --with-coverage --cover-package=todo --with-spec --spec-color --with-xunit --xunit-file=./unittests.xml --cover-xml --cover-xml-file=./coverage.xml Creating test database for alias 'default'... ---------------------------------------------------------------------- XML: /app/unittests.xml Name Stmts Miss Cover ----------------------------------------------------- todo/__init__.py 0 0 100% todo/admin.py 1 1 0% todo/migrations/0001_initial.py 8 3 62% todo/migrations/__init__.py 0 0 100% todo/models.py 6 6 0% ----------------------------------------------------- TOTAL 15 10 33% ---------------------------------------------------------------------- Ran 0 tests in 0.000s OK Destroying test database for alias 'default'... 補足 PowerShell の場合のイメージ一括削除は # まずは不要なイメージをすべて削除 $ docker rmi -f $(docker images -q) となるが、MacBook および Linux では以下のコマンドがイメージの一括削除となる。 # まずは不要なイメージをすべて削除 $ docker rmi -f `docker images -q` まとめ 今回は Django でコンテナを作成してテストコマンドをコンテナ上で実行しました。 今回のポイント Dockerfile を利用することでアプリケーションの動作環境をコードできる。 動作環境をコードにすることで Dockerfile 自体が動作環境ドキュメントとして利用できる。 コンテナ内にファイルを取り込むときはホスト OS 上のビルドコンテキストを意識する。 おわり
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ExpressとMongoDBで即席RestAPI

やること Node.jsのMVCフレームワークExpressとNoSQLのMongoDBを使って、ユーザ情報の登録・変更・削除ができる簡単なRestAPIを作る。 リクエストやレスポンスはjsonで(NoSQLとの相性抜群)。 MongoDBはDockerコンテナ上で起動させる。 超適当ですが全体像はこんな感じ。 準備 HomebrewとNode.jsを入れておく。 Docker上でMongoDB起動 MongoDBをDockerコンテナ上で起動する。 直に入れてもいいが、せっかくなのでDocker使ってみる。 # Dockerインストール $ brew install docker --cask # MongoDBイメージ取得 $ docker pull mongo # コンテナを作成して起動 # ホストOS側は27018ポート、コンテナ側は27017ポート(MongoDBのデフォルト)を使用 $ docker run -p 27018:27017 --name mongo-test -d mongo Node.jsプロジェクト作成 ベースとなるプロジェクトを作って環境構築する。 Docker起動中かと思うので、別のターミナルを起動する。 # ディレクトリ作成 $ mkdir test-app # 初期化処理(問合せ無しでpackage.json作成) $ npm init -y # 必要nodeモジュール(expressとmongoDB操作用モジュール)をインストール $ npm install express mongoose Model作成 スキーマとなるUserModelを定義する。 # ディレクトリ作成 $ mkdir server $ cd server $ mkdir models # Model定義JavaScript作成 $ touch models/user.js user.jsをVSCodeとかで開いて編集する。 肝心のModelは今回、ユニークなID、名前、年齢の3つのフィールドを持たせる。 user.js const mongoose = require('mongoose'); const Schema = mongoose.Schema; const userSchema = new Schema({ id: { type: String, required: true, unique: true }, name: { type: String }, age: { type: Number} }); module.exports = mongoose.model('users', userSchema); Router&Controller作成 Modelを利用して実際にHTTPリクエストが来た際にどう振舞うかを定義するRouterと、全体を制御するControllerを定義する。 今回は小規模なので、分けずにまとめてserver.jsとする。 # ディレクトリ移動 $ cd .. # Router&Controller定義JavaScript作成 $ touch server.js server.jsをVSCodeとかで開いて編集する。 httpリクエストは3001番ポートで待ち受けるとする。 コードを少なくしたかったので、登録以外はエラー処理を端折ってます。 server.js const express = require('express'); const mongoose = require('mongoose'); const User = require('./models/user'); // DB接続 mongoose.connect('mongodb://localhost:27018/sampledb'); const app = express(); app.use(express.json({extended: true})); // ユーザ情報登録 app.post('/users', (req, res) => { const user = new User(req.body); user.save((err, addedUser) => { if (err) return res.status(400).json({ errorMessage: 'failed to add the user.' }); res.send(addedUser); }); }); // ユーザ情報取得(全件) app.get('/users', (req, res) => { User.find({}, (err, users) => { res.send(users); }); }); // ユーザ情報取得(ID指定) app.get('/users/:id', (req, res) => { const params = req.params.id; User.find({id: params}, (err, user) => { res.send(user); }); }); // ユーザ情報削除(全件) app.delete('/users', (req, res) => { User.remove({}, err => { res.send(true); }); }); // ユーザ情報削除(ID指定) app.delete('/users/:id', (req, res) => { const params = req.params.id; User.remove({id: params}, (err, deletedUser) => { res.send(deletedUser); }); }); // ポート3001番でlisten app.listen(3001, () => { console.log(`Server up on 3001`); }); サーバ起動 $ node server.js 動作確認(curlコマンド) curlコマンドでユーザ情報の登録・取得・削除をやってみる。 _idと__vはMongoDBが自動付与するフィールドで、それぞれオブジェクトID、バージョン管理用として使われる。 # Allen登録 $ curl -X POST -H 'Content-Type:application/json' -d '{"id":"001","name":"Allen","age":20}' http://localhost:3001/users # Allen登録結果 {"_id":"607bce198776e444bd55422b","id":"001","name":"Allen","age":20,"__v":0}% # Yuki登録 $ curl -X POST -H 'Content-Type:application/json' -d '{"id":"002","name":"Yuki","age":26}' http://localhost:3001/users # Yuki登録結果 {"_id":"607c3bf502ac68477a41ee10","id":"002","name":"Yuki","age":26,"__v":0}% # 全件取得 $ curl -X GET http://localhost:3001/users # 取得結果 [{"_id":"607bce198776e444bd55422b","id":"001","name":"Allen","age":20,"__v":0},{"_id":"607c3bf502ac68477a41ee10","id":"002","name":"Yuki","age":26,"__v":0}]% # IDを指定して取得 $ curl -X GET http://localhost:3001/users/001 # 取得結果 [{"_id":"607bce198776e444bd55422b","id":"001","name":"Allen","age":20,"__v":0}]% # IDを指定して削除 $ curl -X DELETE http://localhost:3001/users/001 # 削除結果 {"n":1,"ok":1,"deletedCount":1}% # 削除確認のため全件取得 $ curl -X GET http://localhost:3001/users # 残ってるのはYukiだけ [{"_id":"607c3bf502ac68477a41ee10","id":"002","name":"Yuki","age":26,"__v":0}]% # 全件削除 $ curl -X DELETE http://localhost:3001/users # 削除結果 true% # 削除確認のため全件取得 $ curl -X GET http://localhost:3001/users # 何も残っていない []% 動作確認(API Tester) curlコマンドだと視覚的に分かりづらいので、Chrome拡張のTalend API Testerを使って、視覚的に確認する。 こちらでは登録と全件取得だけ確認してみる。 まずは登録。 この後、同じ要領でYukiも登録したとして、次は全件取得。 こんな感じで確認できた。 もちろん、METHODを変えることでDELETEも可能。 これで一通り、DBを操作する簡単なRestAPIを作成できた。 応用としてやってみたいこと フロントエンドをReactとかで作りたい。 今回DockerはMongoDBでしか使わなかったが、Node.jsそのものからDocker上で環境構築したい。VSCodeでDockerコンテナ上のワークスペースも編集できるらしい(参考)。 TypeScriptで書けるようにしたい(参考)。 参考サイト 初級JavascriptフルスタックエンジニアのためのReactとExpressの同時開発チュートリアル MongoDB(Mongoose)上級者への道 curlコマンドを使った操作
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む