20220114のdockerに関する記事は9件です。

Laravel Docker AWS EC2デプロイ⑥

今回は、AWSのサービスを使用してSSLを無料発行し、前回独自で用意したドメインをSSL化していきます! 前回 SSL証明書取得 下記の記事を参考に進めていきますが、現在のAWS画面とは少し異なるので、その部分に関してはこちらに画像を記載しますので参考にしてください。 ・Certificate Managerの開き方。 1.Certificate Managerで検索してサービスを選択。 2.証明書リクエストボタンから申請可能。 3.パブリック証明書リクエストを選択して次へ。 4.独自で用意したドメイン名を入力し、リクエスト。 5.証明書発行確認 リクエストをクリックすると、最初の画面に戻り、証明書が作成されています。 詳細に関しては、証明書IDを選択することで確認できます! 6.Route 53でレコード作成 証明書IDをクリックすると、詳細画面が開きます。 画面中央部のRoute 53でレコード作成をクリック。 7.レコード作成 内容を確認してレコード作成をクリック。 メッセージが表示されれば無事作成完了です。 一旦別画面に移動し、もう一度戻ってくると、下記のようにステータス欄が検証中→発行済みに変わっていることがわかります! これで証明書を取得できたことになりました! SSL証明書の設定 では、取得した証明書の設定をしていきます。 1.ロードバランサーの作成 EC2画面左側のメニューバーから、ロードバランサーを開き、作成をクリック。 2.タイプを選択 今回は、ALBを使用します! 3. 設定項目を入力 先ず、画面上部ではロードバランサー名を入力し、スキームやIPアドレスタイプはデフォルトのままでOKです。 下にスクロールします。 マッピングは、EC2インスタンスを設置したVPCと組み込みたいゾーンを二つ以上選択しましょう。 セキュリティグループはALB用に新規で作成します。 その際、インバウンドとアウトバウンドルールも設定します。 リスナーとルーティングはHTTPSを許可するように入力します。 セキュアリスナーでは、先ほど作成したSSL証明書を選択します。 リスナーのターゲットグループも新規で作成します。 ヘルスチェックパスにはドメインにアクセスした際のリダイレクト先を指定します。 こちらの仕組みに関しては下記記事がわかりやすく説明されているので参考にしてください。 最後に、何のロードバランサーか区別がつきやすくするようタグにNameを設定し、概要を確認して問題なければ作成ボタンを押して作成します。 無事作成できればロードバランサーの画面に表示されます! レコード設定 最後に、初めにRoute 53で作成したドメインのレコードを編集します。 EC2に関連付けさせたELPの箇所をALBのDNSに変更します。 エイリアスにチェック→ALBを選択→リージョン選択→DNS 動作確認 では、https通信でドメインからアクセス確認してみましょう! https://????.com 無事SSL化されたドメインでログイン画面が表示されました! 今回はここまでにします! 次は、Auto Scalingの設定を進めていきます!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初心者が初心者に伝える「Dockerってなんやねん」

この記事のターゲット プログラミングを勉強して数年数か月、あるとき話していると、ある人が 「前にDocker上でプログラミングしてたんですけど...」 私 : 「ど、ど、Docker ... ? なんやDockerて」 ってなった人むけです。 Dockerがうれしい物語 エピソード1:前は動いてたのに あなたは過去になにかしら自身のPCでプログラミングをしたことがある人です。 例えば Nodeってました Node以外でも構いません。 npm(Nodeのライブラリ管理ツール)を使っていろいろインストールした自分だけの開発環境のPCです。 過去にいくつか複数のファイルでできた作品っぽいものを作っています。 ある日 「なんかNodeで作業してたらよくわからんエラーでたぞ。ググったら『Node.js 14.3以前で実行してください』やて」 使おうとしているライブラリがNode.js の少し前のバージョンじゃないと正常に動かないみたいです。 ところが自分のPCにインストールされているNode.jsは16.1 「新しいNodeやと動かんのか。ググってバージョン変更するか」 そこであなたはネットの情報をかき集め、Node.jsを一度アンインストールしてから再度インストールしてバージョンを変更しました。 苦労した甲斐あって、使おうとしていたライブラリが動きました。 ある日 「この処理どうやって実装するんやっけな、前に書いたやつ動かして思い出そっと ... ... ... あれ、前は動いてたのに」 プロジェクトごとに求められるバージョンが異なる問題 エピソード2:こんなんインストールしたっけ 「僕のやりたいことを実現するには ... あ、これインストールすればいいのね」 「んー、思ってたのと違うなぁ、あ、違うやり方発見!ふむふむ XXX をインストールして ... 」 後日 「ダウンロード中にファイル整理しとこかな。Program filesの中身増えたなぁ、 ... なんか見覚えのないないようわからんファイルやたらあるけど、こんなんインストールしたっけ?」 いろんなプロジェクトでいろいろインストールした結果、ジャングル状態 エピソード3 : どういうことだってばよ 「もうわけがわからん、いったんいろいろインストールする前の状態にしよ」 「あれもこれも消して ... ... あれ、これ開発のためにインストールしたやつか・・・?」 「ものによってはパスは自分で消すのか ... これでいけたんやろうか・・・」 「あれ、一度消して再インストールしたはずなのに前の情報がちょこちょこ残ってる ... どういうことだってばよ」 アンインストールしてもたまにのこるカスファイルたち エピソード4 : 新しい開発環境に時間がかかる 「この前は自宅のPCの環境で痛い目あったからな~、今度は慎重にやろっと ...」 「 ... 」 「インストールするもん多くて面倒 ...」 環境の構築の仕方なんて覚えてないので再びQiita様とかZenn様とかの同じページを徘徊 _人人人人人人人人人人人人人人_ > それ、Dockerが解決します <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄ 解決するには エピソード1-3に関しては、 プロジェクトごとに新しいPCを用意する が一番わかりやすいし安全だろう(現実性はさておき)。 このPCはpython3.6で学校の授業用 このPCはPython3.8で趣味のプログラミング用 このPCはNode.js 14.2でまだなにするか決まってないけどNode触ってみる用 ... 要は 開発環境同士が干渉しあわなければいいのである。 これを実現するうえでもっと現実的な方法として、 PCの中にPCをつくる 方法がある。PC上でスマホだったり、エミュレーター(ゲーム機とか)を操作してる様子をみたことないだろうか。 windowの画面の中に(まるでリモートデスクトップのような)もう一つのwindowsの画面...とまではいかないが、 環境変数やルートパス等が完全に元のOS(ホストOS)から隔離されている。 これにより、「プロジェクトごとに新しいPCを用意する」を 1つのPCで実現が可能になる。 が、 新品のスマホやPCを買ってもすでに最初から容量がいくらか埋まっているように、OSを1つ存在させるだけでもそこそこの容量を食う。 また、OSが2つになれば安直に考えて計算量2倍、すなわちメモリ2倍必要になってくる。 結論、 たかが開発環境わけるだけのためなのに効率悪すぎ それ、Dockerが解決します dockerもまた、PCの中に異なる作業環境を作成するという点で上記と似ているが OSはホストOSのまま、環境変数とかルートパスは別なので効率良◎ プロジェクトごとに異なる作業環境を作成できる( => エピソード1,2 ) もしインストールに失敗してわけわからなくなっても、簡単に作業環境を破棄できる( => エピソード3 ) いろいろインストールする手順をスクリプト化し、同じ環境を少ないコマンドで実装する( => エピソード4 ) どうやって実現してるのか仕組みはちゃんとは知らないし、たぶんしっかりは知る必要もない。 とりあえずこの記事で知ってほしいのは、Dockerを使えば上みたいな問題を回避できるということ。 参考 Dockerの導入、実際に仕組みがどうなっているのかや使い方は下記ページを参考にしてください。 ↓↓↓ Docker概念 ↓↓↓ 「Docker」を全く知らない人のために「Docker」の魅力を伝えるための「Docker」入門 https://qiita.com/bremen/items/4604f530fe25786240db ↓↓↓ 導入 ↓↓↓ 公式ページ http://docs.docker.jp/engine/installation/ ↓↓↓ 仕組み・使い方 ↓↓↓ いまさらだけどDockerに入門したので分かりやすくまとめてみた https://qiita.com/gold-kou/items/44860fbda1a34a001fc1 Dockerを体系的に学べる公式チュートリアル和訳 https://qiita.com/Michinosuke/items/5778e0d9e9c04038903c
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Docker]/bin/sh: /go/bin/dlv: not found

記事を書いた経緯 タイトル通りGoAPIのdocker-compose上で/bin/sh: /go/bin/dlv: not foundというエラーが発生してしまったので その解決策をメモしておきたいと思います。 原因 mainブランチを更新した時にDockerfileに Dockerfile.dev RUN go install github.com/go-delve/delve/cmd/dlv@latest というのか追加されました。 しかし、いつも通り $ docker-compose down $ docker-compose up をしましたが、 Airが正常に動作しませんでした。 解決策 $ docker-compose build $ docker-compose up で解決しました。 Dockerfileが書きかわったら、一回ビルドしないと読み込まれないんですね笑
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ubuntu20.04にdocker20.10をインストールする

これは何? ubuntu20.04にdockerをインストールした時のメモ 環境 ubuntu20.04 LTS Docker Community Edition 20.10.10 やってみる docker公式に書いてあるのでなぞってみる https://docs.docker.com/engine/install/ubuntu/ 古いモジュールをアンインストール $ sudo apt-get remove docker docker-engine docker.io containerd runc Reading package lists... Done Building dependency tree Reading state information... Done E: Unable to locate package docker-engine $ sudo apt-get update $ sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release Reading package lists... Done Building dependency tree Reading state information... Done lsb-release is already the newest version (11.1.0ubuntu2). lsb-release set to manually installed. ca-certificates is already the newest version (20210119~20.04.2). ca-certificates set to manually installed. gnupg is already the newest version (2.2.19-3ubuntu2.1). gnupg set to manually installed. The following NEW packages will be installed: curl 0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded. Need to get 161 kB of archives. After this operation, 412 kB of additional disk space will be used. Do you want to continue? [Y/n] Y Get:1 http://jp.archive.ubuntu.com/ubuntu focal-updates/main amd64 curl amd64 7.68.0-1ubuntu2.7 [161 kB] Fetched 161 kB in 2s (104 kB/s) Selecting previously unselected package curl. (Reading database ... 183819 files and directories currently installed.) Preparing to unpack .../curl_7.68.0-1ubuntu2.7_amd64.deb ... Unpacking curl (7.68.0-1ubuntu2.7) ... Setting up curl (7.68.0-1ubuntu2.7) ... Processing triggers for man-db (2.9.1-1) ... docker公式のGPGKeyを登録 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 今回は特にこだわりはないのでstableを入れます $ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 本体をインストール $ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: docker-ce-rootless-extras docker-scan-plugin git git-man liberror-perl pigz slirp4netns Suggested packages: aufs-tools cgroupfs-mount | cgroup-lite git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn The following NEW packages will be installed: containerd.io docker-ce docker-ce-cli docker-ce-rootless-extras docker-scan-plugin git git-man liberror-perl pigz slirp4netns 0 upgraded, 10 newly installed, 0 to remove and 2 not upgraded. Need to get 101 MB of archives. After this operation, 441 MB of additional disk space will be used. Do you want to continue? [Y/n] Y ・・・Get:1 https://download.docker.com/linux/ubuntu focal/stable amd64 containerd.io amd64 1.4.11-1 [23.7 MB] Get:2 http://jp.archive.ubuntu.com/ubuntu focal/universe amd64 pigz amd64 2.4-1 [57.4 kB] Get:3 http://jp.archive.ubuntu.com/ubuntu focal/main amd64 liberror-perl all 0.17029-1 [26.5 kB] Get:4 http://jp.archive.ubuntu.com/ubuntu focal-updates/main amd64 git-man all 1:2.25.1-1ubuntu3.2 [884 kB] Get:5 http://jp.archive.ubuntu.com/ubuntu focal-updates/main amd64 git amd64 1:2.25.1-1ubuntu3.2 [4,554 kB] Get:6 https://download.docker.com/linux/ubuntu focal/stable amd64 docker-ce-cli amd64 5:20.10.10~3-0~ubuntu-focal [38.8 MB] Get:7 http://jp.archive.ubuntu.com/ubuntu focal/universe amd64 slirp4netns amd64 0.4.3-1 [74.3 kB] Get:8 https://download.docker.com/linux/ubuntu focal/stable amd64 docker-ce amd64 5:20.10.10~3-0~ubuntu-focal [21.2 MB] Get:9 https://download.docker.com/linux/ubuntu focal/stable amd64 docker-ce-rootless-extras amd64 5:20.10.10~3-0~ubuntu-focal [7,922 kB] Get:10 https://download.docker.com/linux/ubuntu focal/stable amd64 docker-scan-plugin amd64 0.9.0~ubuntu-focal [3,518 kB] Fetched 101 MB in 10s (9,689 kB/s) Selecting previously unselected package pigz. (Reading database ... 183826 files and directories currently installed.) Preparing to unpack .../0-pigz_2.4-1_amd64.deb ... Unpacking pigz (2.4-1) ... Selecting previously unselected package containerd.io. Preparing to unpack .../1-containerd.io_1.4.11-1_amd64.deb ... Unpacking containerd.io (1.4.11-1) ... Selecting previously unselected package docker-ce-cli. Preparing to unpack .../2-docker-ce-cli_5%3a20.10.10~3-0~ubuntu-focal_amd64.deb ... Unpacking docker-ce-cli (5:20.10.10~3-0~ubuntu-focal) ... Selecting previously unselected package docker-ce. Preparing to unpack .../3-docker-ce_5%3a20.10.10~3-0~ubuntu-focal_amd64.deb ... Unpacking docker-ce (5:20.10.10~3-0~ubuntu-focal) ... Selecting previously unselected package docker-ce-rootless-extras. Preparing to unpack .../4-docker-ce-rootless-extras_5%3a20.10.10~3-0~ubuntu-focal_amd64.deb ... Unpacking docker-ce-rootless-extras (5:20.10.10~3-0~ubuntu-focal) ... Selecting previously unselected package docker-scan-plugin. Preparing to unpack .../5-docker-scan-plugin_0.9.0~ubuntu-focal_amd64.deb ... Unpacking docker-scan-plugin (0.9.0~ubuntu-focal) ... Selecting previously unselected package liberror-perl. Preparing to unpack .../6-liberror-perl_0.17029-1_all.deb ... Unpacking liberror-perl (0.17029-1) ... Selecting previously unselected package git-man. Preparing to unpack .../7-git-man_1%3a2.25.1-1ubuntu3.2_all.deb ... Unpacking git-man (1:2.25.1-1ubuntu3.2) ... Selecting previously unselected package git. Preparing to unpack .../8-git_1%3a2.25.1-1ubuntu3.2_amd64.deb ... Unpacking git (1:2.25.1-1ubuntu3.2) ... Selecting previously unselected package slirp4netns. Preparing to unpack .../9-slirp4netns_0.4.3-1_amd64.deb ... Unpacking slirp4netns (0.4.3-1) ... Setting up slirp4netns (0.4.3-1) ... Setting up docker-scan-plugin (0.9.0~ubuntu-focal) ... Setting up liberror-perl (0.17029-1) ... Setting up containerd.io (1.4.11-1) ... Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /lib/systemd/system/containerd.service. Setting up docker-ce-cli (5:20.10.10~3-0~ubuntu-focal) ... Setting up pigz (2.4-1) ... Setting up git-man (1:2.25.1-1ubuntu3.2) ... Setting up docker-ce-rootless-extras (5:20.10.10~3-0~ubuntu-focal) ... Setting up docker-ce (5:20.10.10~3-0~ubuntu-focal) ... Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service. Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.socket. Setting up git (1:2.25.1-1ubuntu3.2) ... Processing triggers for man-db (2.9.1-1) ... Processing triggers for systemd (245.4-4ubuntu3.13) ... 動作確認 Hellow world $ sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:37a0b92b08d4919615c3ee023f7ddb068d12b8387475d64c622ac30f45c29c51 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ バージョン確認 $ sudo docker version Client: Docker Engine - Community Version: 20.10.10 API version: 1.41 Go version: go1.16.9 Git commit: b485636 Built: Mon Oct 25 07:42:59 2021 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.10 API version: 1.41 (minimum version 1.12) Go version: go1.16.9 Git commit: e2f740d Built: Mon Oct 25 07:41:08 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.11 GitCommit: 5b46e404f6b9f661a205e28d59c982d3634148f8 runc: Version: 1.0.2 GitCommit: v1.0.2-0-g52b36a2 docker-init: Version: 0.19.0 GitCommit: de40ad0
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker compose環境のrailsでDB関連のエラーが出たら確認することまとめ

環境 docker compose mysql rails6 rails初心者が色々迷走しているうちに様々なエラーに出会ったのでまとめてみます。 エラー データベースがない時に出るエラーです。 error.rb ActiveRecord::NoDatabaseError: Unknown database 対応 データベースがあるかを確認します。 checkdb.sh #execコマンドでrailsコンテナの中に入ります。 $ docker exec -it xxxxxxxxxx bash #railsコンテナの中からmysqlコンテナに接続しつつmysqlを立ち上げます。 root@xxxxxxxxxx:/app# mysql -u root -p -h db #ここでmysqlが立ち上がらない場合そもそもdockerコンテナ同士の通信がうまく行っていないので下の「dockerコンテナ間の通信を確認する」を見てください。 #mysqlが立ち上がった場合はshow databasesでデータベースがあるか確認します。データベース名はrailsアプリの/config/database.ymlでdatabase: rails_sample_dvなどと記載されています。 MySQL [(none)]> show databases; #データベースがなかった場合は作成します。 MySQL [(none)]>exit root@xxxxxxxxxx:/app# rails db:create root@xxxxxxxxxx:/app# rails db:migrate これでデータベースが作成されるので0.0.0.0:3000などでアクセスができるようになります。 dockerコンテナ同士がつながっていなそうな場合 docker-compose.ymlの設定を確認します。 以下db接続関連の項目のみを書き出してみます。 これらがない場合は書き足してみてdockerを再構築 (環境によってはimage、volumeを削除してdocker compose build --no-cacheなどとすると確実かもしれません。) してみて再度ウェブコンテナからmysqlに接続できるかを確認します。 docker-compose.yml version: "3" services: app: depends_on: - mysql mysql: volumes: - mysql-volume:/var/lib/mysql environment: - MYSQL_ALLOW_EMPTY_PASSWORD=yes ports: - "3306:3306" volumes: mysql-volume: railsのdatabase.ymlの記述が間違っていたときのエラー 自分の場合は以下のエラーがブラウザでアクセスした時に出ました。 error1.rb ActiveRecord::ConnectionNotEstablished No connection pool for 'ActiveRecord::Base' found. error2.rb Puma caught this error: Cannot load database configuration: そしてその状態でrails consoleを立ち上げようとして以下のエラーに遭遇 error3.sh webapp/config/database.yml:33:in `<main>': Cannot load database configuration: undefined method `[]' for nil:NilClass (NoMethodError) ちなみにその時のdatabase.ymlは以下 database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: 5 timeout: 3306 host: mysql development: <<: *default username: root host: mysql database: rails_sample_dv socket: /tmp/mysql.sock # test: # <<: *default # username: root # host: <%= ENV['DB_HOST'] %> # database: rails_sample_dv # socket: /tmp/mysql.sock # production: # <<: *default # username: <%= Rails.application.credentials.db[:user] %> # host: <%= Rails.application.credentials.db[:host] %> # password: <%= Rails.application.credentials.db[:password] %> # database: <%= Rails.application.credentials.db[:name] %> これはなぜかコメントアウトしている行が読み込まれているようで 以下のようにコメントアウトしている部分を削除したらとりあえずエラーは解消されました。 database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: 5 timeout: 3306 host: mysql development: <<: *default username: root host: mysql database: rails_sample_dv socket: /tmp/mysql.sock master.key、credentials.yml.encを作り直してみる railsアプリの/configディレクトリにmaster.key、credentials.yml.encというファイルがあります。 これらがなかったり、なんらかの影響で変更されたりした場合railsアプリが立ち上がらない場合があります。 そんな時は念の為2つのファイルをバックアップしてから 作成し直すことでアプリが立ち上がる場合もあります。 作成し直す際は前述同様docker execコマンドでrailsコンテナにログインしてから以下のコマンドで再生成します。 recreate.sh EDITOR=vim rails credentials:edit 場合によってはsudoをつけたほうが良いかもしれません。 そもそもmaster.key、credentials.yml.encとは? いわゆるサーバで設定する環境変数をrails内で設定できるという仕組みで master.key(秘密鍵)、credentials.yml.enc(公開鍵)といった具合に 1組の対になっています。 ですから何らかの拍子で一つが変わったりする場合エラーになります。 またmaster.keyは必ず.gitignoreなどに記載し、公開されないように デプロイツールに登録しなければなりません。 番外編|コンテナが立ち上がらない railsのWebサーバが立ち上がっていない状態です。 docker.sh $ docker compose up -d $ docker container ls cfxxxxxxa776 mysql:5.7 "docker-entrypoint.s…" 1 minutes ago Up 1 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp webapp-db-1 対応方法 /tmp/pids/server.pid というファイルを削除しコンテナを再度立ち上げると無事ウェブサーバが立ち上がりました。 これはrails特有のお作法でよくある原因とのことでした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker+.NET 6環境で動いているBlazor WebAssemblyアプリのログをファイル出力する

はじめに C#でログ出力する方法、Docker+.NETでアプリを動かす方法、Blazor WebAssemblyアプリの実装方法等、個々に的を絞ればそれらの情報は比較的簡単に手に入ります。 しかし、それらを組み合わせた情報は逆に入手しにくい印象です。 というわけで、今回は前回の内容からの続きですが、Docker+.NET 6環境で動いているBlazor WebAssemblyアプリからログをファイル出力する内容でお話します。 前回の内容はDocker+.NET 6環境でBlazor WebAssemblyアプリを動かしてみるを参照してください。 今回のファイル出力の対象ですが、Blazor WebAssemblyアプリのサーバ側の話です。 クライアント側はアプリがブラウザ上で動くため、ログをファイル出力することは考慮していません。 クライアント側のログはブラウザのコンソール等に出力します。 または運用例で考えると致命的なエラー発生時にエラー内容のログをエラー画面に表示させます。 クライアント利用者側にその内容を問い合わせてもらう程度でしょう。 話が長くなりましたが本題に入ります。 前提条件 前回の記事の内容の設定が済んでいる前提である。 追加の条件としてDocker Composeが導入済みである。 今後、複数のDockerコンテナを組み合わせて運用することを想定して、今回からはDocker Composeを利用する。 NLogの追加 今回はNLogを使用します。 NLog以外にもlog4netなど様々なライブラリがありますが、NLogはその中でも導入が比較的簡単です。 まずはコマンドプロンプトを起動してサーバ側のプロジェクトファイルにNLogを追加します。 コマンドプロンプトのカレントディレクトリを前回作成したHelloWorld.Server.csprojが置かれたフォルダへ移動させます。 dirコマンドを実行すると次のような一覧が表示されます。 そこで次のコマンドを実行します。 dotnet add package NLog.Extensions.Logging dotnet add package NLog.Web.AspNetCore HelloWorld.Server.csprojをテキストエディタなどで開きます。 HelloWorld.Server.csproj <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="6.0.1" /> <PackageReference Include="NLog.Extensions.Logging" Version="1.7.4" /> <PackageReference Include="NLog.Web.AspNetCore" Version="4.14.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\Client\HelloWorld.Client.csproj" /> <ProjectReference Include="..\Shared\HelloWorld.Shared.csproj" /> </ItemGroup> </Project> NLogの設定 appsettings.jsonにNLogの設定を記載します。 今回の設定内容はログの種別問わずファイルへ書き出す設定にしています。 appsettings.json { "Logging": { "LogLevel": { "Default": "Trace", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "NLog": { "internalLogLevel": "Info", "internalLogFile": "./log/internal-nlog.txt", "extensions": [ { "assembly": "NLog.Extensions.Logging" }, { "assembly": "NLog.Web.AspNetCore" } ], "targets": { "allfile": { "type": "File", "fileName": "./log/nlog-all-${shortdate}.log", "layout": "${longdate}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" } }, "rules": [ { "logger": "*", "minLevel": "Trace", "writeTo": "allfile" } ] } } ソースコードへロガーの設定を追記します。 まずServerフォルダ配下のProgram.csにNLogの設定を記載します。 今回はデフォルトで作成されたソースに追記します。 Program.cs // ↓追記 using NLog.Extensions.Logging; var builder = WebApplication.CreateBuilder(args); // NLogの設定情報が取れるようにappsetting.jsonを読み込む var config = new ConfigurationBuilder() .SetBasePath(System.IO.Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build(); // builderにNLogを追加する builder.Logging.AddNLog(new NLogLoggingConfiguration(config.GetSection("NLog"))); // Add services to the container. builder.Services.AddControllersWithViews(); builder.Services.AddRazorPages(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseWebAssemblyDebugging(); } else { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseBlazorFrameworkFiles(); app.UseStaticFiles(); app.UseRouting(); app.MapRazorPages(); app.MapControllers(); app.MapFallbackToFile("index.html"); app.Run(); 今回はプロジェクト作成時にデフォルトで作成されるWeatherForecastController.csにログを出力する処理を記載します。 WeatherForecastController.cs using Microsoft.AspNetCore.Mvc; using HelloWorld.Shared; namespace HelloWorld.Server.Controllers; [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; } [HttpGet] public IEnumerable<WeatherForecast> Get() { // ここでログ出力させる _logger.LogInformation("Get called"); return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateTime.Now.AddDays(index), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }) .ToArray(); } } 実際にBlazor WebAssemblyアプリを動してみます Blazor WebAssemblyアプリ側のログ出力の準備ができたので、次にDocker Composeを使ってアプリ動作環境を構築します。 今回はこのようなフォルダとファイル構成にます。二階層まで表示しています。 C:. │ docker-compose.yml └─HelloWorld │ Dockerfile │ HelloWorld.sln │ ├─Client ├─Server └─Shared docker-compose.ymlの内容は以下のように記載します。 docker-compose.yml version: '3' services: helloworld: build: context: ./HelloWorld container_name: helloworld volumes: - ./helloworld/log:/app/log ports: - "80:80" - ./helloworld/log:/app/log このように書くことでローカル上にもログファイルが残せるようにします。 それではDocker Composeを使ってビルドします。 コマンドプロンプトのカレントディレクトリをdocker-compose.ymlが置かれたフォルダへ移動します。 次のコマンドをコマンドプロンプトで実行してビルドします。 docker-compose build ビルドが完了したら起動するために次のコマンドプロンプトでコマンドを実行します。 docker-compose up -d 起動が完了するとプロジェクトフォルダにlogフォルダが増えます。 logフォルダ内にはログファイルが増えています。 中身を見ます。 次にログが更新されるか見ます。 Weather forecastをブラウザに表示すると。。。。 logフォルダを見ると。。。。 タイムスタンプが更新されています。では中身を見ます。 最終行にログが増えています。 コンテナを再起動しても。。。 前回の内容が残っており続きから追記されています。 以上がDocker+.NET 6環境で動いているBlazor WebAssemblyアプリのログをファイル出力してみるお話でした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Python: VSCodeからDocker内で動いているFastAPIにステップ実行デバッグを仕掛ける

試した環境 開発環境(端末) Macbook Air (M1) VSCode November 2021 (version 1.63) Python 3.9.9 (homebrewでインストールした) FastAPIサーバ(Docker) Docker Desktop for Mac 4.2.0 Docker version 20.10.12 docker-compose version 1.29.2 コンテナ python:3.11-rc linux/x86-64 pipでインストールしたライブラリ Package Version anyio 3.5.0 asgiref 3.4.1 click 8.0.3 fastapi 0.71.0 h11 0.12.0 idna 3.3 pip 21.2.4 pydantic 1.9.0 python-multipart 0.0.5 setuptools 57.5.0 six 1.16.0 sniffio 1.2.0 starlette 0.17.1 typing_extensions 4.0.1 uvicorn 0.16.0 wheel 0.37.0 VSCodeのプロジェクト構成 .vscode/ launch.json settings.json src/ ... debug-docker-compose.yml debug.Dockerfile debug.Dockerfile FROM --platform=linux/x86-64 python:3.11-rc RUN apt update -y RUN apt-get install build-essential RUN pip install fastapi uvicorn python-multipart RUN pip install debugpy COPY src /src WORKDIR /src EXPOSE 8000 CMD ["python3", "-m", "debugpy", "--listen", "0.0.0.0:5678", "-m", "uvicorn", "prog:app", "--reload", "--host", "0.0.0.0", "--port", "8000"] debug-docker-compose.yml version: '3.7' services: server: container_name: myfastapi build: context: . dockerfile: ./debug.Dockerfile restart: always volumes: - ./src:/src expose: - "8000" - "5678" ports: - 8000:8000 - 5678:5678 launch.json { // IntelliSense を使用して利用可能な属性を学べます。 // 既存の属性の説明をホバーして表示します。 // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "python", "request": "attach", "name": "FastAPI Remote Debug", "port": 5678, "host": "localhost", "pathMappings": [ { "localRoot": "${workspaceFolder}/src", "remoteRoot": "/src" } ] } ] } settings.json { "python.pythonPath": "/opt/homebrew/bin/python3", "files.watcherExclude": { "**/homebrew/**": true } } 手順 FastAPIコンテナのビルド設定 [debug.Dockerfile] debugpyインストールを含めておく RUN pip install debugpy [debug.Dockerfile] APIサーバの起動コマンドにdebugpyの待ち受けを入れ込む 通常はこんな感じだと思うが、 CMD ["uvicorn", "prog:app", "--reload", "--host", "0.0.0.0", "--port", "8000"] ↓こう変える。 CMD ["python3", "-m", "debugpy", "--listen", "0.0.0.0:5678", "-m", "uvicorn", "prog:app", "--reload", "--host", "0.0.0.0", "--port", "8000"] [debug-docker-compose.yml] debugpyの待ち受けポートをコンテナの外に解放するよう設定する expose: - "5678" ports: - 5678:5678 VSCodeの設定 [launch.json] debugpyに接続する構成を登録しておく { "type": "python", "request": "attach", "name": "FastAPI Remote Debug", "port": 5678, "host": "localhost", "pathMappings": [ { "localRoot": "${workspaceFolder}/src", "remoteRoot": "/src" } ] } FastAPIコンテナを起動する docker-compose -f debug-docker-compose.yml up --build VSCodeからdebugpyに接続する launch.jsonに登録した「FastAPI Remote Debug」構成を実行する 繋がると↓こうなる ソースコードにブレークポイントを設定してみる APIを実行してみる 普通にブラウザで開くでもおk 処理が一時停止してVSCodeのデバッグビューがアクティブになる その瞬間の変数の中身が見れたり、次のブレークポイントまで進んだり、一行ずつ進んだりしながらじっくり観察できる その時だけ変数を勝手に書き換えて処理を続行させたりもできる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker 便利コマンド集

コンテナに接続 docker run --name sample-container -it nginx bash コンテナに接続してコマンド実行してコンテナ削除 docker run --rm --name sample-container -it nginx ls -l
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

簡単!!WSL2とDockerでデータベース環境構築

開発環境を構築する中でデータベースは必ずと言ってもいいくらい必要になります。 WSL2のディストリビューションにDockerを入れると とても簡単に短時間で安定したデータベース利用環境を構築することができたので、 今回は以前投稿したWSL2を利用したLinux開発環境にDockerをインストールして データベースの環境を構築した際の手順をご紹介いたします。 構築するデータベースとしてはRDBの例としてMySQL、NoSQLの例としてRedisを構築していきます。 MySQL Redis 前提条件 以下の記事に従ってWSL2を利用したLinux開発環境の環境が構築されていること。 実施環境 OS:Windows 10 Home バージョン 21H1 ディストリビューション:Ubuntu 20.04 LTS (推奨)作業用ターミナルとしてはWindowsターミナルの使用をお勧めします。 Dockerのインストール Dockerのインストール手順についてはdocker docsに手順が記載されているので、 基本的にはdocsの手順に従いインストールを進めていきます。 Docker Engine インストール リポジトリのセットアップ 1. aptパッケージの更新 sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release 2. GPG 鍵の追加 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 3. 安定版(stable)リポジトリのセットアップ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null インストール 1. aptパッケージの更新 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io Linux インストール後の作業 Docker管理のユーザ追加 ログインユーザにdockerコマンドの実行権限を付与してsodo無しでコマンド実行できるようにします。 1. dockerグループの作成 sudo groupadd docker 2. グループへのユーザ追加 sudo gpasswd -a $USER docker ※ docker docsではusermodコマンドを利用してグループ追加を行っていますが、破壊的なコマンドのため、ここではgpasswdコマンドを利用してユーザ追加を行います。 Docker自動起動設定 WSLを起動するたびにDockerを起動するのはとても煩わしいので自動起動設定を行います serviceコマンドのsudo権限追加 visudoを使いsudoersファイルを更新してログインユーザにsudo権限を追加します。 1. visodo起動 sudo visudo 2. Dockerデーモン起動設定追記 最後の行に以下の設定を追加します。 ※ XXXXXX部はユーザ名に置き換える XXXXXX ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service docker start 入力例 3. 保存 3.1. 編集終了 メニューに従い次のコマンドを入力して編集を終了します。 [Ctrl] + [X] 表示メニュー 3.2. 確認 メニューに従い次のコマンドを入力して設定を保存します。 [Y] 表示メニュー 3.3. 終了 ファイル名はそのままに次のコマンドを入力して保存します。 [Enter] 表示メニュー Dockerデーモン起動設定 .bashrcの最後の行に以下の設定を追加します。 .bashrcの編集 vi .bashrc 設定 if [ $(service docker status | awk '{print $4}') = "not" ]; then sudo service docker start > /dev/null fi 設定反映 コマンドプロンプトを起動して次のコマンドを入力してwslをシャットダウンします。 wsl --shutdown 再度wslにログインすることでDockerデーモンが自動で起動しsudo無しでdockerコマンドが実行可能となります。 Dockerイメージの取得 Dockerイメージを取得してデータベース環境を構築していきます。 以下の手順ではイメージはDocker Hubより取得します。 Docker Hubにはイメージ取得(Pull)の回数制限があるため、 同一IPアドレス環境内でイメージ取得が頻繁に行われている場合、 上限に達している可能性があります。 その際にはDocker Hubに登録したユーザーでログインした上で実施する必要があります。 (無料ユーザでも可) Redis環境構築 イメージ取得 次のコマンドを実行してRedisのイメージを取得します。 docker pull redis イメージ起動 次のコマンドを実行してRedisのイメージを起動します。 docker run -it --name redis -d -p 6379:6379 redis:latest コンテナ自動起動設定 次のコマンドを実行することでWSLを再起動した際にコンテナが自動で起動します。 docker update --restart=always redis Redisコマンドラインインタフェースインストール Redisのコマンドラインインタフェースであるredis-cliをインストールします。 redis-cliインストール 次のコマンドを実行してredis-cliをインストールします。 sudo apt install redis-server 接続確認 次のコマンドを実行して接続を確認します。 redis-cli 127.0.0.1:6379に接続され対話モードでCLI実行可能となれば構築完了です。 MySQL環境構築 イメージ取得 次のコマンドを実行してMySQLのイメージを取得します。 docker pull mysql イメージ起動 次のコマンドを実行してMySQLのイメージを起動します。 docker run -it --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql:latest コンテナ自動起動設定 次のコマンドを実行することでWSLを再起動した際にコンテナが自動で起動します。 docker update --restart=always mysql MySQLクライアントインストール MySQLのクライアントをインストールします。 コマンド確認 次のコマンドを実行することでMySQLクライアントのインストールを促されます。 mysql ※ 2022年2月時点では次のコマンドが表示されます。 sudo apt install mysql-client-core-8.0 # version 8.0.27-0ubuntu0.20.04.1, or sudo apt install mariadb-client-core-10.3 # version 1:10.3.32-0ubuntu0.20.04.1 インストール 次のコマンドを実行してMySQLクライアントをインストールします。 sudo apt install mysql-client-core-8.0 接続確認 次のコマンドを実行して接続を確認します。 mysql -u root -p -h 0.0.0.0 -P 3306 接続に成功し対話モードでCLI実行可能となれば構築完了です。 参考 docker docs Docker Engine インストール(Ubuntu 向け) Linux インストール後の作業 ダウンロードレート制限 コンテナーの自動起動 docker hub redis mysql
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む