<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>インフラ・ミドルウェア on ポンコツ地方エンジニアの技術ブログ</title><link>https://blog.ponkotools.com/categories/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2/</link><description>Recent content in インフラ・ミドルウェア on ポンコツ地方エンジニアの技術ブログ</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Wed, 22 Jul 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://blog.ponkotools.com/categories/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2/index.xml" rel="self" type="application/rss+xml"/><item><title>Cloudflare Pages に Web Analytics を導入する</title><link>https://blog.ponkotools.com/posts/2026/07/22/cloudflare-web-analytics/</link><pubDate>Wed, 22 Jul 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/07/22/cloudflare-web-analytics/</guid><description>&lt;p&gt;Cloudflare Dashboard で、&lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="133px" data-flex-grow="55" height="515" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/07/22/cloudflare-web-analytics/01.webp" width="287"&gt;&lt;/p&gt;
&lt;p&gt;対象の Pages プロジェクトを選択した後、&lt;strong&gt;Metrics&lt;/strong&gt; タブを選択し、ページ下部にある &lt;strong&gt;Web Analytics → Enable&lt;/strong&gt; をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="374px" data-flex-grow="156" height="671" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/07/22/cloudflare-web-analytics/02.webp" srcset="https://blog.ponkotools.com/posts/2026/07/22/cloudflare-web-analytics/02_hu_486265102ddf48d9.webp 800w, https://blog.ponkotools.com/posts/2026/07/22/cloudflare-web-analytics/02.webp 1048w" width="1048"&gt;&lt;/p&gt;
&lt;p&gt;これで OK です。&lt;/p&gt;</description></item><item><title>Cloudflare Web Analytics を導入する</title><link>https://blog.ponkotools.com/posts/2026/07/21/cloudflare-web-analytics/</link><pubDate>Tue, 21 Jul 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/07/21/cloudflare-web-analytics/</guid><description>&lt;p&gt;Cloudflare を経由していないサイトの場合の設定方法です。&lt;/p&gt;
&lt;h2 id="cloudflare-web-analytics-にサイトを追加"&gt;&lt;a href="#cloudflare-web-analytics-%e3%81%ab%e3%82%b5%e3%82%a4%e3%83%88%e3%82%92%e8%bf%bd%e5%8a%a0" class="header-anchor"&gt;&lt;/a&gt;Cloudflare Web Analytics にサイトを追加
&lt;/h2&gt;&lt;p&gt;Cloudflare Dashboard で、 &lt;strong&gt;Analytics &amp;gt; Web Analytics&lt;/strong&gt; と進みます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="153px" data-flex-grow="63" height="462" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/07/21/cloudflare-web-analytics/01.webp" width="295"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Add a site&lt;/strong&gt; をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="596px" data-flex-grow="248" height="279" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/07/21/cloudflare-web-analytics/02.webp" width="694"&gt;&lt;/p&gt;
&lt;p&gt;ホスト名を入力し、&lt;strong&gt;Done&lt;/strong&gt; をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="735px" data-flex-grow="306" height="342" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/07/21/cloudflare-web-analytics/03.webp" srcset="https://blog.ponkotools.com/posts/2026/07/21/cloudflare-web-analytics/03_hu_a03d9074e905677f.webp 800w, https://blog.ponkotools.com/posts/2026/07/21/cloudflare-web-analytics/03.webp 1048w" width="1048"&gt;&lt;/p&gt;
&lt;p&gt;Cloudflare を経由していないサイトの場合、登録後に JavaScript snippet が表示されるのでコピーします。&lt;/p&gt;
&lt;p&gt;このスニペットを、通常は &lt;/body&gt; の直前などに入れます。&lt;/p&gt;</description></item><item><title>OCI の Ubuntu インスタンスの初期設定</title><link>https://blog.ponkotools.com/posts/2026/05/29/oci-ubuntu/</link><pubDate>Fri, 29 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/29/oci-ubuntu/</guid><description>&lt;h2 id="swap-の設定"&gt;&lt;a href="#swap-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;swap の設定
&lt;/h2&gt;&lt;p&gt;以下のように、Ubuntu のイメージにはスワップがありません。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ free -m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: &lt;span class="m"&gt;954&lt;/span&gt; &lt;span class="m"&gt;343&lt;/span&gt; &lt;span class="m"&gt;225&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;538&lt;/span&gt; &lt;span class="m"&gt;610&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2GB のスワップファイル（Swap）を追加します。&lt;br&gt;
すべてのコマンドは、管理者権限（&lt;code&gt;sudo&lt;/code&gt;）を付けてターミナルで実行します。&lt;/p&gt;
&lt;h3 id="1-スワップファイルの作成"&gt;&lt;a href="#1-%e3%82%b9%e3%83%af%e3%83%83%e3%83%97%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;1. スワップファイルの作成
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;dd&lt;/code&gt; または &lt;code&gt;fallocate&lt;/code&gt; コマンドで 2GB のファイルを作成します。ここでは確実かつ高速な &lt;code&gt;fallocate&lt;/code&gt; を使用します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo fallocate -l 2G /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="alert alert-warning"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;⚠️&lt;/span&gt;
 &lt;span class="alert-title"&gt;警告&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;もし「fallocate failed: Operation not supported」のようなエラーが出た場合は、以下の &lt;code&gt;dd&lt;/code&gt; コマンドを代わりに試してください。&lt;br&gt;
&lt;code&gt;sudo dd if=/dev/zero of=/swapfile bs=1M count=2048&lt;/code&gt;&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h3 id="2-適切な権限の設定"&gt;&lt;a href="#2-%e9%81%a9%e5%88%87%e3%81%aa%e6%a8%a9%e9%99%90%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;2. 適切な権限の設定
&lt;/h3&gt;&lt;p&gt;セキュリティのため、スワップファイルは root ユーザーのみが読み書きできるように権限を &lt;code&gt;600&lt;/code&gt; に制限します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod &lt;span class="m"&gt;600&lt;/span&gt; /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-スワップ領域の初期化"&gt;&lt;a href="#3-%e3%82%b9%e3%83%af%e3%83%83%e3%83%97%e9%a0%98%e5%9f%9f%e3%81%ae%e5%88%9d%e6%9c%9f%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;3. スワップ領域の初期化
&lt;/h3&gt;&lt;p&gt;作成したファイルをスワップ領域としてフォーマットします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkswap /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-スワップの有効化"&gt;&lt;a href="#4-%e3%82%b9%e3%83%af%e3%83%83%e3%83%97%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;4. スワップの有効化
&lt;/h3&gt;&lt;p&gt;システムにスワップファイルを認識させ、有効化します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo swapon /swapfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-設定の確認"&gt;&lt;a href="#5-%e8%a8%ad%e5%ae%9a%e3%81%ae%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;5. 設定の確認
&lt;/h3&gt;&lt;p&gt;スワップが正しく有効化されたか確認します。2GB（約 2.0GiB）のスワップが表示されていれば成功です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo swapon --show
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# または&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;free -h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="6-再起動後も自動で有効化する設定"&gt;&lt;a href="#6-%e5%86%8d%e8%b5%b7%e5%8b%95%e5%be%8c%e3%82%82%e8%87%aa%e5%8b%95%e3%81%a7%e6%9c%89%e5%8a%b9%e5%8c%96%e3%81%99%e3%82%8b%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;6. 再起動後も自動で有効化する設定
&lt;/h3&gt;&lt;p&gt;上記の設定だけでは、インスタンスを再起動するとスワップが解除されてしまいます。再起動後も自動的に有効化されるよう、&lt;code&gt;/etc/fstab&lt;/code&gt; に追記します。&lt;/p&gt;
&lt;h4 id="6-1-fstab-のバックアップ推奨"&gt;&lt;a href="#6-1-fstab-%e3%81%ae%e3%83%90%e3%83%83%e3%82%af%e3%82%a2%e3%83%83%e3%83%97%e6%8e%a8%e5%a5%a8" class="header-anchor"&gt;&lt;/a&gt;6-1. fstab のバックアップ（推奨）
&lt;/h4&gt;&lt;p&gt;念のため、設定ファイルをバックアップしておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp /etc/fstab /etc/fstab.bak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="6-2-設定の追記"&gt;&lt;a href="#6-2-%e8%a8%ad%e5%ae%9a%e3%81%ae%e8%bf%bd%e8%a8%98" class="header-anchor"&gt;&lt;/a&gt;6-2. 設定の追記
&lt;/h4&gt;&lt;p&gt;以下のコマンドを実行して、&lt;code&gt;/etc/fstab&lt;/code&gt; の末尾に設定を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/swapfile none swap sw 0 0&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="おまけカーネルパラメータの最適化推奨"&gt;&lt;a href="#%e3%81%8a%e3%81%be%e3%81%91%e3%82%ab%e3%83%bc%e3%83%8d%e3%83%ab%e3%83%91%e3%83%a9%e3%83%a1%e3%83%bc%e3%82%bf%e3%81%ae%e6%9c%80%e9%81%a9%e5%8c%96%e6%8e%a8%e5%a5%a8" class="header-anchor"&gt;&lt;/a&gt;【おまけ】カーネルパラメータの最適化（推奨）
&lt;/h3&gt;&lt;p&gt;Linux には、メモリがどれくらい減ったらスワップを開始するかを決める &lt;code&gt;swappiness&lt;/code&gt; という値があります。&lt;br&gt;
初期値は &lt;code&gt;60&lt;/code&gt; であることが多いですが、クラウド環境（特に SSD ストレージ）では **&lt;code&gt;10&lt;/code&gt;〜&lt;code&gt;20**&lt;/code&gt; 程度に下げて、できるだけ物理メモリを優先して使うように設定するのが一般的です。&lt;/p&gt;
&lt;h4 id="1-現在の-swappiness-を確認"&gt;&lt;a href="#1-%e7%8f%be%e5%9c%a8%e3%81%ae-swappiness-%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;1. 現在の swappiness を確認
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /proc/sys/vm/swappiness
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-一時的に-10-に変更"&gt;&lt;a href="#2-%e4%b8%80%e6%99%82%e7%9a%84%e3%81%ab-10-%e3%81%ab%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;2. 一時的に &lt;code&gt;10&lt;/code&gt; に変更
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sysctl vm.swappiness&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="3-永続的に反映"&gt;&lt;a href="#3-%e6%b0%b8%e7%b6%9a%e7%9a%84%e3%81%ab%e5%8f%8d%e6%98%a0" class="header-anchor"&gt;&lt;/a&gt;3. 永続的に反映
&lt;/h4&gt;&lt;p&gt;再起動後もこの設定を維持するため、&lt;code&gt;/etc/sysctl.conf&lt;/code&gt; の末尾に追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vm.swappiness=10&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;これで 2GB のスワップ設定はすべて完了です！&lt;/p&gt;
&lt;h2 id="タイムゾーンの変更"&gt;&lt;a href="#%e3%82%bf%e3%82%a4%e3%83%a0%e3%82%be%e3%83%bc%e3%83%b3%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;タイムゾーンの変更
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在のタイムゾーンを確認&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timedatectl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# JST に変更&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo timedatectl set-timezone Asia/Tokyo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変更されたことを確認&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timedatectl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nano-のインストール"&gt;&lt;a href="#nano-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;nano のインストール
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y nano
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="git-のインストール"&gt;&lt;a href="#git-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;git のインストール
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="glab-のインストールと認証"&gt;&lt;a href="#glab-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%a8%e8%aa%8d%e8%a8%bc" class="header-anchor"&gt;&lt;/a&gt;glab のインストールと認証
&lt;/h2&gt;&lt;p&gt;諸事情で GitHub ではなく GitLab を使っているので、glab をインストールします。&lt;/p&gt;
&lt;h3 id="1-ダウンロード"&gt;&lt;a href="#1-%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;1. ダウンロード
&lt;/h3&gt;&lt;p&gt;apt でインストールできるバージョンは古いので、公式リリースからダウンロードしてインストールします。&lt;/p&gt;
&lt;p&gt;詳細は以下を参照してください。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.ponkotools.com/posts/2026/05/10/glab/" target="_blank" rel="noopener"
 &gt;https://blog.ponkotools.com/posts/2026/05/10/glab/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-gitlab-でのアクセストークンpatの発行"&gt;&lt;a href="#2-gitlab-%e3%81%a7%e3%81%ae%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%83%88%e3%83%bc%e3%82%af%e3%83%b3pat%e3%81%ae%e7%99%ba%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;2. GitLab でのアクセストークン（PAT）の発行
&lt;/h3&gt;&lt;p&gt;CLI から GitLab にアクセスするために、事前にブラウザ側（GitLab のウェブ画面）で Personal Access Token（個人用アクセストークン） を発行しておく必要があります。&lt;br&gt;
WSL を使っているからか、web での認証ではうまくいきませんでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GitLab にログインします（SaaS 版の gitlab.com または社内などのオンプレミス版）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;面左上の自分のアイコン ＞ Preferences（設定） ＞ 左メニューの Access Tokens の順に開きます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add new token をクリックし、以下のように入力します：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Token name: 任意の名前（例: oci-ubuntu-cli）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Expiration date: 空欄（無期限）または任意の有効期限&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scopes（権限）: CLI をフル活用するために、&lt;code&gt;api&lt;/code&gt; と &lt;code&gt;write_repository&lt;/code&gt;以下にチェックを入れます。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create personal access token をクリックします。&lt;/p&gt;
&lt;p&gt;画面に一度だけトークン（glpat-xxxx&amp;hellip;）が表示されるので、必ずコピーして手元に控えておきます。（画面を閉じると二度と見られなくなります）&lt;/p&gt;
&lt;h3 id="3-cli-の認証設定ログイン"&gt;&lt;a href="#3-cli-%e3%81%ae%e8%aa%8d%e8%a8%bc%e8%a8%ad%e5%ae%9a%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3" class="header-anchor"&gt;&lt;/a&gt;3. CLI の認証設定（ログイン）
&lt;/h3&gt;&lt;p&gt;OCI の Ubuntu ターミナルに戻り、以下のコマンドを実行して対話型セットアップを開始します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;glab auth login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行すると、いくつか質問されるので以下のように回答していきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ What GitLab instance &lt;span class="k"&gt;do&lt;/span&gt; you want to sign in to?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; gitlab.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ GitLab Self-Managed or GitLab Dedicated instance
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;gitLab.com（本家）を使っている場合は、そのまま gitLab.com を選択して Enter。&lt;br&gt;
自社サーバーなどの場合は GitLab Self-Managed or GitLab Dedicated instance を選択し、その後 URL（例: &lt;a class="link" href="https://gitlab.example.com" target="_blank" rel="noopener"
 &gt;https://gitlab.example.com&lt;/a&gt;）を入力します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Signing into gitlab.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ How would you like to sign in?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; Token
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ Web
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Token を選択します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Signing into gitlab.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ What domains does this host use &lt;span class="k"&gt;for&lt;/span&gt; the container registry and image dependency proxy?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; gitlab.com,gitlab.com:443,registry.gitlab.com 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そのまま Enter を押します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The minimum required scopes are &lt;span class="s1"&gt;&amp;#39;api&amp;#39;&lt;/span&gt; and &lt;span class="s1"&gt;&amp;#39;write_repository&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Generate a personal access token at https://gitlab.com/-/user_settings/personal_access_tokens?scopes&lt;span class="o"&gt;=&lt;/span&gt;api,write_repository
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ Paste your authentication token:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;先ほど GitLab 画面でコピーしたトークン（glpat-xxxx&amp;hellip;）を貼り付けて Enter を押します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ Choose default Git protocol:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ SSH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ &amp;gt; HTTPS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┃ HTTP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTTPS を選択します。&lt;/p&gt;
&lt;p&gt;セットアップが完了したら、以下のコマンドで無事にログインできているか確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;glab auth status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ご自身のユーザー名や「Logged in to gitlab.com」といったステータスが表示されれば、GitLab CLI の設定はすべて完了です！&lt;/p&gt;
&lt;h2 id="tmux-のインストール"&gt;&lt;a href="#tmux-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;tmux のインストール
&lt;/h2&gt;&lt;p&gt;セッションが切れても実行中のプログラムが停止しないよう tmux を使うためにインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y tmux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-のインストール"&gt;&lt;a href="#docker-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;docker のインストール
&lt;/h2&gt;&lt;h3 id="1-インストール"&gt;&lt;a href="#1-%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;1. インストール
&lt;/h3&gt;&lt;p&gt;公式ドキュメントの Install using the apt repository に従って最新版の docker をインストールします。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-docker-の権限を設定-sudo-を不要にする"&gt;&lt;a href="#2-docker-%e3%81%ae%e6%a8%a9%e9%99%90%e3%82%92%e8%a8%ad%e5%ae%9a-sudo-%e3%82%92%e4%b8%8d%e8%a6%81%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2. docker の権限を設定 (sudo を不要にする)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo gpasswd -a &lt;span class="k"&gt;$(&lt;/span&gt;whoami&lt;span class="k"&gt;)&lt;/span&gt; docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chgrp docker /var/run/docker.sock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="不要なサービスの停止"&gt;&lt;a href="#%e4%b8%8d%e8%a6%81%e3%81%aa%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e5%81%9c%e6%ad%a2" class="header-anchor"&gt;&lt;/a&gt;不要なサービスの停止
&lt;/h2&gt;&lt;p&gt;参考: &lt;a class="link" href="https://qiita.com/ynott/items/4312cb34611d2e462779" target="_blank" rel="noopener"
 &gt;https://qiita.com/ynott/items/4312cb34611d2e462779&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;systemctl | grep running&lt;/code&gt; で稼働中のサービス一覧を出力し、そのうち不要なものを AI に尋ねた結果が以下です。&lt;/p&gt;
&lt;h3 id="確実に停止無効化して良いサービス"&gt;&lt;a href="#%e7%a2%ba%e5%ae%9f%e3%81%ab%e5%81%9c%e6%ad%a2%e7%84%a1%e5%8a%b9%e5%8c%96%e3%81%97%e3%81%a6%e8%89%af%e3%81%84%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9" class="header-anchor"&gt;&lt;/a&gt;確実に停止・無効化して良いサービス
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;サービス名&lt;/th&gt;
 &lt;th&gt;役割と停止して良い理由&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ModemManager.service&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;3G/4G/5G などのモバイルモデムを管理するサービス。クラウドのサーバーでモデムを使うことはないため、完全に不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;fwupd.service&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;マザーボードやデバイスのファームウェアをアップデートするデーモン。仮想マシン（VM）のファームウェアは OCI 側が管理するため不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rpcbind.servicerpcbind.socket&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;NFSv3（ネットワークファイルシステム）などで使われる古いポートマップサービス。NFS でストレージをマウントする予定がなければ不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;iscsid.serviceiscsid.socket&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;iSCSI ストレージに接続するためのクアドラント。OCI のブロック・ボリュームを iSCSI 経由で直接マウント（手動アタッチなど）していない限り、標準の準仮想化（Paravirtualized）アタッチであれば不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;udisks2.service&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;主にデスクトップ環境で USB メモリなどのディスクを自動認識・マウントするためのサービス。サーバー用途では不要です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;停止・無効化のコマンド例&lt;/strong&gt;&lt;br&gt;
単に stop するだけだと再起動時にまた動いてしまうので、disable &amp;ndash;now で自動起動の解除と停止を同時に行います。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl disable --now ModemManager fwupd rpcbind rpcbind.socket iscsid iscsid.socket udisks2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="条件付きで停止削除できるサービス効果大"&gt;&lt;a href="#%e6%9d%a1%e4%bb%b6%e4%bb%98%e3%81%8d%e3%81%a7%e5%81%9c%e6%ad%a2%e5%89%8a%e9%99%a4%e3%81%a7%e3%81%8d%e3%82%8b%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e5%8a%b9%e6%9e%9c%e5%a4%a7" class="header-anchor"&gt;&lt;/a&gt;条件付きで停止・削除できるサービス（効果大）
&lt;/h3&gt;&lt;p&gt;環境によっては不要、あるいは別の手段に切り替えることで大幅に軽量化できる重要ポイントです。&lt;/p&gt;
&lt;h4 id="snapdservice--snaporacle-cloud-agent-メモリ節約効果大"&gt;&lt;a href="#snapdservice--snaporacle-cloud-agent-%e3%83%a1%e3%83%a2%e3%83%aa%e7%af%80%e7%b4%84%e5%8a%b9%e6%9e%9c%e5%a4%a7" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;snapd.service&lt;/code&gt; / &lt;code&gt;snap.oracle-cloud-agent...&lt;/code&gt; （メモリ節約効果：大）
&lt;/h4&gt;&lt;p&gt;Ubuntu のパッケージ管理システム「Snap」と、OCI の管理エージェントです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;判断基準&lt;/strong&gt;&lt;br&gt;
OCI のダッシュボードからインスタンスのメトリック（CPU使用率のグラフなど）を見たり、OS の診断機能を使ったりしない、かつ自分で snap コマンドを使ったアプリ（Nextcloud などの Snap版）を動かす予定がない場合。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解説&lt;/strong&gt;&lt;br&gt;
oracle-cloud-agent は便利ですが、メモリが 1GB 以下の環境ではかなりの重荷になります。これらを Snap ごと削除すると、数十MB〜100MB 以上のメモリが浮きます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;完全に削除する場合のコマンド&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap remove oracle-cloud-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt purge snapd -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="メモリ使用量の変化"&gt;&lt;a href="#%e3%83%a1%e3%83%a2%e3%83%aa%e4%bd%bf%e7%94%a8%e9%87%8f%e3%81%ae%e5%a4%89%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;メモリ使用量の変化
&lt;/h3&gt;&lt;p&gt;上記のサービスをすべて停止した場合の比較です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;サービス停止前&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ free -h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 954Mi 360Mi 72Mi 4.9Mi 677Mi 594Mi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 21Mi 2.0Gi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;サービス停止後&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ free -h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total used free shared buff/cache available
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mem: 954Mi 299Mi 313Mi 4.9Mi 483Mi 655Mi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swap: 2.0Gi 10Mi 2.0Gi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>OCI Bastion 経由でプライベート・サブネット内の Ubuntu インスタンスに SSH で接続</title><link>https://blog.ponkotools.com/posts/2026/05/27/oci-bastion-ubuntu/</link><pubDate>Wed, 27 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/27/oci-bastion-ubuntu/</guid><description>&lt;p&gt;前回、Oracle Linux インスタンスへ OCI Bastion 経由で SSH 接続する手順を書きました。&lt;/p&gt;
&lt;p&gt;今回は、前回記事で触れた基本的な構成を前提に、Ubuntu インスタンスを対象とした OCI Bastion 経由の SSH 接続手順だけをまとめます。&lt;br&gt;
Oracle Linux と共通する VCN / Bastion の作成や一般的なネットワーク設定は省略し、Ubuntu 固有の注意点に絞って解説します。&lt;/p&gt;
&lt;h2 id="前提"&gt;&lt;a href="#%e5%89%8d%e6%8f%90" class="header-anchor"&gt;&lt;/a&gt;前提
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ターゲット OCI インスタンスには Ubuntu のイメージを使う&lt;/li&gt;
&lt;li&gt;インスタンスは &lt;strong&gt;プライベートサブネット&lt;/strong&gt; に配置し、&lt;strong&gt;パブリックIPなし&lt;/strong&gt; で作成する&lt;/li&gt;
&lt;li&gt;Bastion サービスは事前に作成済みで、プライベートサブネットをターゲットにしている&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ubuntu-でのインスタンス作成時のポイント"&gt;&lt;a href="#ubuntu-%e3%81%a7%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e4%bd%9c%e6%88%90%e6%99%82%e3%81%ae%e3%83%9d%e3%82%a4%e3%83%b3%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;Ubuntu でのインスタンス作成時のポイント
&lt;/h2&gt;&lt;h3 id="1-イメージに-ubuntu-を選択する"&gt;&lt;a href="#1-%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e3%81%ab-ubuntu-%e3%82%92%e9%81%b8%e6%8a%9e%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;1. イメージに Ubuntu を選択する
&lt;/h3&gt;&lt;p&gt;インスタンス作成画面のイメージ選択で、&lt;strong&gt;Ubuntu&lt;/strong&gt; を選びます。&lt;br&gt;
OCI の無料枠対象であれば &lt;code&gt;Always Free 適格&lt;/code&gt; のマークを確認してください。&lt;br&gt;
私は今回 &lt;strong&gt;Ubuntu 24.04 Minimal&lt;/strong&gt; を選択しました。&lt;/p&gt;
&lt;h3 id="2-ネットワーキング設定"&gt;&lt;a href="#2-%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%ad%e3%83%b3%e3%82%b0%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;2. ネットワーキング設定
&lt;/h3&gt;&lt;p&gt;ここは Oracle Linux のときと同じく以下のように設定します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プライベートサブネットを選択する&lt;/li&gt;
&lt;li&gt;パブリックIP の割当ては &lt;strong&gt;なし&lt;/strong&gt; にする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SSH キーについても同様です。&lt;/p&gt;
&lt;h2 id="ubuntu-での-bastion-セッション作成"&gt;&lt;a href="#ubuntu-%e3%81%a7%e3%81%ae-bastion-%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Ubuntu での Bastion セッション作成
&lt;/h2&gt;&lt;p&gt;Bastion 自体は、Oracle Linux のときに作成済みなのでそれを使います。&lt;br&gt;
ただ、セッションの作成方法が異なり、Ubuntu の場合は &lt;strong&gt;管理対象 SSH セッションではなく、SSHポート転送セッションを使う&lt;/strong&gt; のが一般的です。&lt;/p&gt;
&lt;h3 id="bastion-セッションの設定"&gt;&lt;a href="#bastion-%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Bastion セッションの設定
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;OCI コンソールで「アイデンティティとセキュリティ」 &amp;gt; 「要塞（Bastion）」に移動する&lt;/li&gt;
&lt;li&gt;作成した Bastion を選択し、「セッションの作成」をクリックする&lt;/li&gt;
&lt;li&gt;以下のように設定する&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション・タイプ&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;SSHポート転送セッション&lt;/strong&gt; を選択します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ターゲット・ホスト&lt;/td&gt;
 &lt;td&gt;Ubuntu インスタンスをIPアドレスまたはインスタンス名で指定します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SSH キー&lt;/td&gt;
 &lt;td&gt;ご自身のPCにある SSH 公開鍵をアップロード or ペーストするか、新規に生成します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="330px" data-flex-grow="137" height="621" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/27/oci-bastion-ubuntu/01.webp" srcset="https://blog.ponkotools.com/posts/2026/05/27/oci-bastion-ubuntu/01_hu_4bf74bb699c3bcbb.webp 800w, https://blog.ponkotools.com/posts/2026/05/27/oci-bastion-ubuntu/01.webp 854w" width="854"&gt;&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;「セッションの作成」を実行し、状態が &lt;code&gt;アクティブ&lt;/code&gt; になるまで待つ&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="鍵のパーミッション"&gt;&lt;a href="#%e9%8d%b5%e3%81%ae%e3%83%91%e3%83%bc%e3%83%9f%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3" class="header-anchor"&gt;&lt;/a&gt;鍵のパーミッション
&lt;/h3&gt;&lt;p&gt;Linux の SSH では秘密鍵の権限が緩いと接続が拒否されます。
以下のように &lt;code&gt;chmod 600&lt;/code&gt; で制限しておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; ~/.ssh/&amp;lt;Ubuntuの秘密鍵&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; ~/.ssh/&amp;lt;セッションの秘密鍵&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ssh-での接続方法"&gt;&lt;a href="#ssh-%e3%81%a7%e3%81%ae%e6%8e%a5%e7%b6%9a%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;SSH での接続方法
&lt;/h2&gt;&lt;h3 id="方法１"&gt;&lt;a href="#%e6%96%b9%e6%b3%95%ef%bc%91" class="header-anchor"&gt;&lt;/a&gt;方法１
&lt;/h3&gt;&lt;p&gt;Bastion セッションがアクティブになったら、右側のメニューから「SSH コマンドのコピー」を使います。
以下のようなコマンドがコピーされます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i &amp;lt;privateKey&amp;gt; -N -L &amp;lt;localPort&amp;gt;:10.0.1.203:22 -p &lt;span class="m"&gt;22&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;privateKey&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;セッション作成時の秘密鍵のパスを設定します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;&amp;lt;localPort&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;基本的には 「（1024番〜65535番の間であれば）あなたのPCで現在使われていない任意のポート番号」なら何番でも自由 です。&lt;br&gt;よく使われるのは、覚えやすい 12345 や 2222、50022 などだそうです。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上記を踏まえたうえで、まずは以下のようにコマンドを時刻します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/bastion_id_rsa -N -L 12345:10.0.1.143:22 -p &lt;span class="m"&gt;22&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すると画面が止まった（待機状態）になります。&lt;br&gt;
これでトンネルが維持されている状態ですので、このターミナル画面は閉じずにそのまま放置してください。&lt;/p&gt;
&lt;p&gt;この状態で新しく別のターミナル画面を開き、以下のコマンドを実行して Ubuntu インスタンスにログインします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/Ubuntu作成時の秘密鍵 -p &lt;span class="m"&gt;12345&lt;/span&gt; ubuntu@localhost
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;あなたのPCの 12345 番ポート（localhost:12345）に接続することが、そのままトンネルを通じて向こう側のUbuntuに繋がるため、接続先は localhost となります。&lt;br&gt;
OCI の Ubuntu インスタンスのユーザー名は &lt;code&gt;ubuntu&lt;/code&gt; なので、それを指定します。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h3 id="方法２"&gt;&lt;a href="#%e6%96%b9%e6%b3%95%ef%bc%92" class="header-anchor"&gt;&lt;/a&gt;方法２
&lt;/h3&gt;&lt;p&gt;前述の方法だとターミナルを２つを使わないといけません。&lt;br&gt;
これをコマンド一発でやる場合、以下のように打ちます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i &amp;lt;Ubuntuの秘密鍵&amp;gt; -o &lt;span class="nv"&gt;ProxyCommand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -i &amp;lt;セッションの秘密鍵&amp;gt; -W %h:%p -p 22 ... ubuntu@10.0.1.143
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="方法３"&gt;&lt;a href="#%e6%96%b9%e6%b3%95%ef%bc%93" class="header-anchor"&gt;&lt;/a&gt;方法３
&lt;/h3&gt;&lt;p&gt;上記のコマンドも結局めちゃくちゃ長いので、自分のPCの &lt;code&gt;~/.ssh/config&lt;/code&gt; に設定を書いてしまうのが最もスマートです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/.ssh/config&lt;/code&gt; をテキストエディタで開き、以下のように追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1. Bastion（要塞）自体の設定
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host oci-bastion
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName host.bastion.....oci.oraclecloud.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Port 22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # ★セッションを作成するたびに、以下のUser（ocid...の部分）だけ書き換える
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User ocid1.bastionsession.oc1.....amaaaaaa...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/セッション作成時の秘密鍵
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 2. ターゲットとなるUbuntuの設定
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host oci-ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName 10.0.1.143
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/Ubuntu作成時の秘密鍵
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ProxyCommand ssh oci-bastion -W %h:%p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定した後は以下のコマンドだけで接続できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh oci-ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、3時間ごとにセッションを作り直した際も、上の User の部分（ocid1.bastionsession&amp;hellip;）だけを書き換えるだけで済みます。&lt;/p&gt;
&lt;p&gt;VS Code の Remote SSH もこれで使えるようになります。&lt;/p&gt;
&lt;h2 id="ubuntu-へのログイン後に確認すること"&gt;&lt;a href="#ubuntu-%e3%81%b8%e3%81%ae%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e5%be%8c%e3%81%ab%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8" class="header-anchor"&gt;&lt;/a&gt;Ubuntu へのログイン後に確認すること
&lt;/h2&gt;&lt;p&gt;接続に成功すると、プロンプトが次のようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ubuntu@&amp;lt;hostname&amp;gt;:~$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://documentation.ubuntu.com/oracle/oracle-how-to/use-bastion-to-access-VM/" target="_blank" rel="noopener"
 &gt;https://documentation.ubuntu.com/oracle/oracle-how-to/use-bastion-to-access-VM/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.oracle.com/en-us/iaas/Content/Bastion/Tasks/bastionmanaging.htm" target="_blank" rel="noopener"
 &gt;https://docs.oracle.com/en-us/iaas/Content/Bastion/Tasks/bastionmanaging.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://oci-tech.jp/connect-private-compute-via-oci-bastion/" target="_blank" rel="noopener"
 &gt;https://oci-tech.jp/connect-private-compute-via-oci-bastion/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>OCI Bastion 経由でプライベート・サブネット内のインスタンスに SSH で接続</title><link>https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/</link><pubDate>Tue, 26 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/</guid><description>&lt;p&gt;日本語では &lt;strong&gt;要塞&lt;/strong&gt; と訳されています。&lt;/p&gt;
&lt;p&gt;手元の PC からこの Bastion（踏み台の役割）を経由させることで、インスタンス自体にパブリックIPを一切持たせないまま、手元の PC のターミナルから直接 SSH 接続できるようになります。&lt;/p&gt;
&lt;p&gt;設定には、ネットワーク（VCN）の構築段階からいくつか重要なポイント（ルーターやセキュリティ・リストの設定など）があり、結構はまったのでメモとして残しておきます。&lt;/p&gt;
&lt;h2 id="仕組みとメリット"&gt;&lt;a href="#%e4%bb%95%e7%b5%84%e3%81%bf%e3%81%a8%e3%83%a1%e3%83%aa%e3%83%83%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;仕組みとメリット
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;完全無料で、自分で踏み台用のサーバー（EC2など）を1台管理・維持する必要がありません。&lt;/li&gt;
&lt;li&gt;接続が必要なときだけ、手元のPCから「3時間だけ有効な一時的な接続セッション（トンネル）」を発行して侵入します。時間が経てば自動で完全に閉じられるため、セキュリティが非常に強固です。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ホストPC: Ubuntu 22.04&lt;/li&gt;
&lt;li&gt;インスタンス: Oracle Linux 9&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;インスタンスが Oracle Linux の場合と、Ubuntu などの他の OS の場合とで方法が一部異なります。&lt;br&gt;
今回は Oracle Linux 9 の場合で、Ubuntu についてはまた別で書きます。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h2 id="step1-vcn-とサブネットの作成"&gt;&lt;a href="#step1-vcn-%e3%81%a8%e3%82%b5%e3%83%96%e3%83%8d%e3%83%83%e3%83%88%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Step1: VCN とサブネットの作成
&lt;/h2&gt;&lt;p&gt;まずは土台となる仮想クラウド・ネットワーク（VCN）を作成します。&lt;br&gt;
手動で細かく作ることもできますが、「VCNウィザード」を使うのが一番簡単で確実です。&lt;br&gt;
インターネットに出るための「インターネット・ゲートウェイ」だけでなく、プライベートVMがアップデート等で外と通信するための「NATゲートウェイ」や「サービス・ゲートウェイ」も自動で作成・紐付けされます。&lt;/p&gt;
&lt;p&gt;OCIコンソールメニューから 「ネットワーキング」 &amp;gt; 「仮想クラウド・ネットワーク」 に移動します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="306px" data-flex-grow="127" height="535" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/01-1.webp" width="683"&gt;&lt;/p&gt;
&lt;p&gt;アクションから「VCNウィザードの起動」 をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="306px" data-flex-grow="127" height="535" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/01-2.webp" width="683"&gt;&lt;/p&gt;
&lt;p&gt;「インターネット接続性を持つVCNの作成」 を選択し、「VCNウィザードの起動」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="420px" data-flex-grow="175" height="677" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/01-3.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/01-3_hu_eeb952604ff3b7e5.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/01-3.webp 1187w" width="1187"&gt;&lt;/p&gt;
&lt;p&gt;以下の情報を入力・確認して「次へ」進み、作成します。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;VCN名&lt;/td&gt;
 &lt;td&gt;任意の名前（例: my-bastion-vcn）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;VCNの構成 CIDRブロック&lt;/td&gt;
 &lt;td&gt;10.0.0.0/16（デフォルトのままでOK）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;パブリック・サブネットのCIDR&lt;/td&gt;
 &lt;td&gt;10.0.0.0/24&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;プライベート・サブネットのCIDR&lt;/td&gt;
 &lt;td&gt;10.0.1.0/24&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="step2-インスタンスの作成"&gt;&lt;a href="#step2-%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Step2: インスタンスの作成
&lt;/h2&gt;&lt;p&gt;次に、パブリックIPを持たない接続先のインスタンスを作成します。&lt;br&gt;
「コンピュート」 &amp;gt; 「インスタンス」 から 「インスタンスの作成」 をクリックします。&lt;br&gt;
インスタンスの作成については別記事でも書いているので詳細は割愛しますが、イメージは &lt;strong&gt;Oracle Linux 9&lt;/strong&gt; を選びます。&lt;/p&gt;
&lt;p&gt;そして、ネットワーキングセクションで以下を選択します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プライベート・サブネット（Step 1で作成したもの）を選択。&lt;/li&gt;
&lt;li&gt;「パブリックIPアドレスの割当て」 で 「パブリックIPなし」 を選択。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="270px" data-flex-grow="112" height="1047" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-1_hu_650111b0751cc4fc.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-1.webp 1178w" width="1178"&gt;&lt;/p&gt;
&lt;p&gt;SSHキーのセクションでは、ご自身のPCで作成した公開鍵（.pub）をアップロード、または新規で生成して秘密鍵を保存してください。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="679px" data-flex-grow="282" height="329" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-2_hu_9c0e80c630669994.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/02-2.webp 931w" width="931"&gt;&lt;/p&gt;
&lt;p&gt;設定したら「作成」をクリックします。&lt;/p&gt;
&lt;h2 id="stes3-bastion-プラグインの有効化-oracle-linux-の場合のみ"&gt;&lt;a href="#stes3-bastion-%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96-oracle-linux-%e3%81%ae%e5%a0%b4%e5%90%88%e3%81%ae%e3%81%bf" class="header-anchor"&gt;&lt;/a&gt;Stes3: Bastion プラグインの有効化 (Oracle Linux の場合のみ)
&lt;/h2&gt;&lt;p&gt;作成したインスタンスの詳細画面に入り、管理タブの「Oracle Cloud エージェント」で要塞を探し、有効化します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="470px" data-flex-grow="196" height="709" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/03.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/03_hu_3bf5c1beaa28ef3d.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/03.webp 1391w" width="1391"&gt;&lt;/p&gt;
&lt;p&gt;要塞のステータスが停止済となります。&lt;br&gt;
OSの内部でプログラムのダウンロードや配置が行われており、ステータスが「実行中」になるまでには5分〜10分ほどかかることがあります。&lt;/p&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;ここで要塞を有効にしておかないと、後述の管理対象SSHセッションの作成で API エラーとなります。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h2 id="step4-bastionの作成"&gt;&lt;a href="#step4-bastion%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Step4: Bastionの作成
&lt;/h2&gt;&lt;p&gt;「アイデンティティとセキュリティ」 &amp;gt; 「要塞」（Bastion）に移動します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="715px" data-flex-grow="298" height="560" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-1_hu_982245cf6ad2724f.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-1_hu_36b79f883301d695.webp 1600w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-1.webp 1669w" width="1669"&gt;&lt;/p&gt;
&lt;p&gt;「要塞の作成」 をクリックし、以下のように設定します。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;要塞名&lt;/td&gt;
 &lt;td&gt;任意の名前&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ターゲット仮想クラウド・ネットワーク&lt;/td&gt;
 &lt;td&gt;Step 1で作成したVCN&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ターゲット・サブネット&lt;/td&gt;
 &lt;td&gt;ターゲットVMがいる「プライベート・サブネット」 を選択します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CIDRブロックの許可リスト&lt;/td&gt;
 &lt;td&gt;0.0.0.0/0 （特定のIPだけに絞るとより安全です）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="435px" data-flex-grow="181" height="532" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-2_hu_e3bf1741c390b50c.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/04-2.webp 965w" width="965"&gt;&lt;/p&gt;
&lt;p&gt;「要塞の作成」をクリックします（アクティブになるまで数分かかります）。&lt;/p&gt;
&lt;h2 id="step5-セッションの作成"&gt;&lt;a href="#step5-%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Step5: セッションの作成
&lt;/h2&gt;&lt;p&gt;作成した Bastion の詳細画面に入り、「セッションの作成」 をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="322px" data-flex-grow="134" height="481" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/05-1.webp" width="646"&gt;&lt;/p&gt;
&lt;p&gt;以下のように設定します。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;セッション・タイプ&lt;/td&gt;
 &lt;td&gt;Oracle Linux の場合は &lt;strong&gt;管理対象SSHセッション&lt;/strong&gt; を選択します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ユーザー名&lt;/td&gt;
 &lt;td&gt;Oracle Linux の場合は &lt;code&gt;opc&lt;/code&gt; です。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ターゲット・コンピュート・インスタンス&lt;/td&gt;
 &lt;td&gt;Step2 で作成したプライベートVMを選択します。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SSHキー&lt;/td&gt;
 &lt;td&gt;ご自身のPCにある SSH 公開鍵をアップロード or ペーストするか、新規に生成します。VM作成時に使ったものと同じ、またはペアになるものをアップロードしても OK です（後述）。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="295px" data-flex-grow="123" height="739" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/05-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/05-2_hu_bdf974789b8dc277.webp 800w, https://blog.ponkotools.com/posts/2026/05/26/oci-bastion/05-2.webp 911w" width="911"&gt;&lt;/p&gt;
&lt;p&gt;「セッションの作成」をクリックします。&lt;br&gt;
状態が作成中となり、しばらく経つとアクティブになります。&lt;/p&gt;
&lt;h2 id="step6-ssh接続の実行"&gt;&lt;a href="#step6-ssh%e6%8e%a5%e7%b6%9a%e3%81%ae%e5%ae%9f%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;Step6: SSH接続の実行
&lt;/h2&gt;&lt;p&gt;セッションが「アクティブ」になったら、いよいよ接続です。
作成したセッションの右側にある「3つの点」メニューから 「SSHコマンドのコピー」 をクリックします。&lt;/p&gt;
&lt;p&gt;コピーされるコマンドは以下のような形をしています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i &amp;lt;privateKey&amp;gt; -o &lt;span class="nv"&gt;ProxyCommand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -i &amp;lt;privateKey&amp;gt; -W %h:%p -p 22 ocid1.bastionsession.oc1...&amp;#34;&lt;/span&gt; opc@10.0.1.x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;privateKey&amp;gt;&lt;/code&gt; 2箇所ありますので、それぞれ VM インスタンス作成時の秘密鍵、Bastion セッション作成時の秘密鍵のパスに変更して実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/VM用の秘密鍵 -o &lt;span class="nv"&gt;ProxyCommand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -i ~/.ssh/Bastion用の秘密鍵 -W %h:%p ...&amp;#34;&lt;/span&gt; opc@10.0.1.x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;セッション作成時の SSH キーを VM 作成時と同じものにした場合は、2箇所とも同じ秘密鍵のパスを指定します。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;Linux のルールとして、秘密鍵の権限が緩いままだとSSH接続が拒否されてしまいます。この場合、以下のコマンドでパーミッションを変更します。&lt;br&gt;
&lt;code&gt;chmod 600 ssh-key-xxxx.key&lt;/code&gt;&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;p&gt;実行すると、Bastionを経由してパブリックIPのないプライベートVMに直接SSHログインが完了します。&lt;/p&gt;
&lt;h2 id="ssh-キーについての補足"&gt;&lt;a href="#ssh-%e3%82%ad%e3%83%bc%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e3%81%ae%e8%a3%9c%e8%b6%b3" class="header-anchor"&gt;&lt;/a&gt;SSH キーについての補足
&lt;/h2&gt;&lt;p&gt;セッション作成時のSSHキーはVM作成時と同じでも別のものでも大丈夫です。&lt;/p&gt;
&lt;p&gt;OCI の Bastion サービスは、接続時に「2枚の壁（認証）」を通過するイメージになります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bastionセッション作成時のSSHキー（壁1：入口の鍵）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ローカルPCから、OCIのBastionサービス（要塞）に侵入するための鍵です。&lt;/li&gt;
&lt;li&gt;Bastionサービス自体が「あなたは本当にこのセッションを作った本人ですか？」を確かめるために使います。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;VM作成時のSSHキー（壁2：奥の部屋の鍵）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bastionを通り抜けたあと、ターゲットのプライベートVMにログインするための鍵です。&lt;/li&gt;
&lt;li&gt;VM（OS）側が「あなたはログインを許可されたユーザーですか？」を確かめるために使います。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このように鍵の役割が独立しています。&lt;br&gt;
ただ、「同じ鍵」を使った場合と「別の鍵」を使った場合で、最後に実行するSSHコマンドの書き換え方が少し変わります。&lt;/p&gt;
&lt;h3 id="-同じ鍵を使った場合一番シンプル"&gt;&lt;a href="#-%e5%90%8c%e3%81%98%e9%8d%b5%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e5%a0%b4%e5%90%88%e4%b8%80%e7%95%aa%e3%82%b7%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;① 同じ鍵を使った場合（一番シンプル）
&lt;/h3&gt;&lt;p&gt;すべて1つの秘密鍵（例: id_rsa）で開くので、コピーしたコマンド内の2箇所の &lt;code&gt;&amp;lt;privateKey&amp;gt;&lt;/code&gt; に同じ秘密鍵のパスを指定すればOKです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/id_rsa -o &lt;span class="nv"&gt;ProxyCommand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -i ~/.ssh/id_rsa -W %h:%p ...&amp;#34;&lt;/span&gt; opc@10.0.1.x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="-別の鍵を使った場合それぞれ指定が必要"&gt;&lt;a href="#-%e5%88%a5%e3%81%ae%e9%8d%b5%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e5%a0%b4%e5%90%88%e3%81%9d%e3%82%8c%e3%81%9e%e3%82%8c%e6%8c%87%e5%ae%9a%e3%81%8c%e5%bf%85%e8%a6%81" class="header-anchor"&gt;&lt;/a&gt;② 別の鍵を使った場合（それぞれ指定が必要）
&lt;/h3&gt;&lt;p&gt;コマンドの「前半」と「後半」で、それぞれの秘密鍵を指定する必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前半の -i: VM作成時の秘密鍵を指定&lt;/li&gt;
&lt;li&gt;中間の ProxyCommand内の -i: Bastionセッション作成時の秘密鍵を指定&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/VM用の秘密鍵 -o &lt;span class="nv"&gt;ProxyCommand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -i ~/.ssh/Bastion用の秘密鍵 -W %h:%p ...&amp;#34;&lt;/span&gt; opc@10.0.1.x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;管理やコマンドの書き換えをシンプルにしたい場合は、「同じ鍵（ペア）」を使ってしまうのが一番迷わなくてラクです。&lt;/p&gt;
&lt;h3 id="セキュリティ的な問題は"&gt;&lt;a href="#%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3%e7%9a%84%e3%81%aa%e5%95%8f%e9%a1%8c%e3%81%af" class="header-anchor"&gt;&lt;/a&gt;セキュリティ的な問題は？
&lt;/h3&gt;&lt;p&gt;個人開発や一般的な社内検証環境レベルであれば、同じ鍵を使い回しても実用上のセキュリティリスクは非常に低い（実質的に問題ない）と言えます。&lt;/p&gt;
&lt;p&gt;ただし、厳格なエンタープライズ（企業）の運用基準や、セキュリティの理想論（ベストプラクティス）の観点から見ると、いくつか「知っておくべきリスクと理由」があります。&lt;br&gt;
なぜ分けるのが理想とされるのか、その理由は以下です。&lt;/p&gt;
&lt;h4 id="1-鍵が漏洩した際の影響範囲爆発半径が広がる"&gt;&lt;a href="#1-%e9%8d%b5%e3%81%8c%e6%bc%8f%e6%b4%a9%e3%81%97%e3%81%9f%e9%9a%9b%e3%81%ae%e5%bd%b1%e9%9f%bf%e7%af%84%e5%9b%b2%e7%88%86%e7%99%ba%e5%8d%8a%e5%be%84%e3%81%8c%e5%ba%83%e3%81%8c%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;1. 鍵が漏洩した際の影響範囲（爆発半径）が広がる
&lt;/h4&gt;&lt;p&gt;これが最も大きな理由です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;鍵を分けている場合：&lt;/strong&gt;
もしBastion用の鍵が外部に漏れても、攻撃者はBastionの入り口までしか来られません。ターゲットVMの鍵が無事なら、中のデータにはアクセスできません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;同じ鍵を使っている場合：&lt;/strong&gt;
その1つの秘密鍵が漏洩した瞬間、Bastionの突破からターゲットVMへのログインまで、すべての防御壁が同時に崩壊します。&lt;/p&gt;
&lt;p&gt;ひとつの鍵にすべての権限を持たせることは、セキュリティの世界で嫌がられる「単一障害点（Single Point of Failure）」を作ることになってしまいます。&lt;/p&gt;
&lt;h4 id="2-誰がどこにアクセスしたかの監査ログが曖昧になる"&gt;&lt;a href="#2-%e8%aa%b0%e3%81%8c%e3%81%a9%e3%81%93%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%81%97%e3%81%9f%e3%81%8b%e3%81%ae%e7%9b%a3%e6%9f%bb%e3%83%ad%e3%82%b0%e3%81%8c%e6%9b%96%e6%98%a7%e3%81%ab%e3%81%aa%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2. 「誰が・どこに」アクセスしたかの監査（ログ）が曖昧になる
&lt;/h4&gt;&lt;p&gt;本番環境やチーム開発において重要な視点です。&lt;/p&gt;
&lt;p&gt;Bastion（要塞）の本来の目的は、「いつ、誰が、どのサーバーに入ったか」を厳密に記録・コントロールすることです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bastion用の鍵： 「あなたがクラウド環境のネットワークに入った」ことを証明する&lt;/li&gt;
&lt;li&gt;VM用の鍵： 「あなたが特定のサーバーの opc ユーザーとしてログインした」ことを証明する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらを同じ鍵にしてしまうと、鍵の管理者が同一人物である前提になってしまい、「Bastionを通過した人と、実際にVMを操作した人が本当に同一人物か？」という厳密なトレース（監査ログの信頼性）が担保しにくくなります。&lt;/p&gt;
&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://documentation.ubuntu.com/oracle/oracle-how-to/use-bastion-to-access-VM/" target="_blank" rel="noopener"
 &gt;https://documentation.ubuntu.com/oracle/oracle-how-to/use-bastion-to-access-VM/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://techblog.ap-com.co.jp/entry/2025/03/19/132232" target="_blank" rel="noopener"
 &gt;https://techblog.ap-com.co.jp/entry/2025/03/19/132232&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://oci-tech.jp/connect-private-compute-via-oci-bastion/" target="_blank" rel="noopener"
 &gt;https://oci-tech.jp/connect-private-compute-via-oci-bastion/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/rieto/items/3fcdd5d5157ecb406719" target="_blank" rel="noopener"
 &gt;https://qiita.com/rieto/items/3fcdd5d5157ecb406719&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>OCI (Oracle Cloud Infrastructure) で VM インスタンスを作成する</title><link>https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/</link><pubDate>Thu, 21 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/</guid><description>&lt;h2 id="oci-oracle-cloud-infrastructure"&gt;&lt;a href="#oci-oracle-cloud-infrastructure" class="header-anchor"&gt;&lt;/a&gt;OCI (Oracle Cloud Infrastructure)
&lt;/h2&gt;&lt;p&gt;OCI には &lt;strong&gt;Always Free（永久無料枠）&lt;/strong&gt; という非常に強力な特典があり、&lt;strong&gt;4 OCPU / 24 GB メモリ&lt;/strong&gt; という、他社クラウドであれば有料級のハイスペックな Arm サーバー（Ampere A1）を無料で 24時間365日動かすことができます。&lt;/p&gt;
&lt;h3 id="oci-のコンピュート環境vm-とコンテナインスタンスの違い"&gt;&lt;a href="#oci-%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%94%e3%83%a5%e3%83%bc%e3%83%88%e7%92%b0%e5%a2%83vm-%e3%81%a8%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ae%e9%81%95%e3%81%84" class="header-anchor"&gt;&lt;/a&gt;OCI のコンピュート環境：VM とコンテナインスタンスの違い
&lt;/h3&gt;&lt;p&gt;OCI でアプリケーションを動かすアプローチとして、主に &lt;strong&gt;「VM Compute（仮想マシン）」&lt;/strong&gt; と &lt;strong&gt;「コンテナインスタンス（Container Instances）」&lt;/strong&gt; の 2つがあります。&lt;/p&gt;
&lt;p&gt;どちらも Docker コンテナを動かせますが、その管理レイヤーと仕様には明確な違いがあります。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;比較項目&lt;/th&gt;
 &lt;th style="text-align: left"&gt;VM Compute (仮想マシン)&lt;/th&gt;
 &lt;th style="text-align: left"&gt;コンテナインスタンス&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;管理の単位&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;OS（Linux / Windows）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;コンテナ（Dockerイメージなど）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;インフラ管理&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;必要&lt;/strong&gt;（OSアップデート、SSH管理）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;不要&lt;/strong&gt;（サーバーレス。オラクルが基盤を管理）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;起動スピード&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;数分（OSのブート時間必要）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;数秒&lt;/strong&gt;（コンテナの起動のみ）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;永続ストレージ&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ブロック・ボリュームを自由に追加・マウント可能&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エフェメラル（一時的。再起動でデータ消滅）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;永久無料枠&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;あり（4 OCPU / 24 GBメモリまで無料）&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;なし（秒単位の従量課金）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="どちらを選ぶべきか"&gt;&lt;a href="#%e3%81%a9%e3%81%a1%e3%82%89%e3%82%92%e9%81%b8%e3%81%b6%e3%81%b9%e3%81%8d%e3%81%8b" class="header-anchor"&gt;&lt;/a&gt;どちらを選ぶべきか？
&lt;/h3&gt;&lt;p&gt;コンテナインスタンスはサーバーレスで運用が手軽ですが、永久無料枠（Always Free）の対象外となります。また、コンテナの再起動によって内部のデータが消去される特性を持ちます。&lt;/p&gt;
&lt;p&gt;そのため、&lt;strong&gt;「24時間いつでも無料で動かし続けたい」「生成されるログやデータをローカルディスクに安全に保持（永続化）したい」という場合は、VM Compute を選択するのが最適&lt;/strong&gt;です。&lt;/p&gt;
&lt;h2 id="oci-への登録"&gt;&lt;a href="#oci-%e3%81%b8%e3%81%ae%e7%99%bb%e9%8c%b2" class="header-anchor"&gt;&lt;/a&gt;OCI への登録
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.oracle.com/jp/cloud/free/" target="_blank" rel="noopener"
 &gt;https://www.oracle.com/jp/cloud/free/&lt;/a&gt; にアクセスして「無料で始める」をクリックして各種情報を入力します。&lt;br&gt;
ちょっとした注意事項として、住所は英語で入力する必要があります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://tzang.net/ja/oci-apply/" target="_blank" rel="noopener"
 &gt;https://tzang.net/ja/oci-apply/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://techblog.ap-com.co.jp/entry/2024/09/06/093000" target="_blank" rel="noopener"
 &gt;https://techblog.ap-com.co.jp/entry/2024/09/06/093000&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kamimachi06/items/c72ac35600c0597d4524" target="_blank" rel="noopener"
 &gt;https://qiita.com/kamimachi06/items/c72ac35600c0597d4524&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インスタンスの作成"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;インスタンスの作成
&lt;/h2&gt;&lt;p&gt;ホームより &lt;strong&gt;インスタンス&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="607px" data-flex-grow="253" height="472" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/01.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/01_hu_e693b17eecf5f133.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/01.webp 1195w" width="1195"&gt;&lt;/p&gt;
&lt;p&gt;ホームにない場合は、左上のメニューから &lt;strong&gt;コンピュート &amp;gt; インスタンス&lt;/strong&gt; でも OK です。&lt;/p&gt;
&lt;p&gt;続いて &lt;strong&gt;インスタンスの作成&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="599" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/02.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/02_hu_2a5b52be3f71e459.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/02.webp 1005w" width="1005"&gt;&lt;/p&gt;
&lt;h3 id="基本情報"&gt;&lt;a href="#%e5%9f%ba%e6%9c%ac%e6%83%85%e5%a0%b1" class="header-anchor"&gt;&lt;/a&gt;基本情報
&lt;/h3&gt;&lt;h4 id="イメージ"&gt;&lt;a href="#%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8" class="header-anchor"&gt;&lt;/a&gt;イメージ
&lt;/h4&gt;&lt;p&gt;デフォルトでは Oracle linux になっています。&lt;br&gt;
Oracle Linux は Red Hat Enterprise Linux（RHEL）をベースにした OS だそうです。&lt;/p&gt;
&lt;p&gt;セキュリティの「保護インスタンス」は、仮想マシン（VM）の乗っ取りや、悪意のあるプログラムによるOS改ざんを防ぐための「セキュリティ強化機能が有効になっている状態」を指すそうですので、保護インスタンスになっているものを選択しておいたほうが良さそうです。&lt;/p&gt;
&lt;h4 id="シェイプ"&gt;&lt;a href="#%e3%82%b7%e3%82%a7%e3%82%a4%e3%83%97" class="header-anchor"&gt;&lt;/a&gt;シェイプ
&lt;/h4&gt;&lt;p&gt;Always Free 対象のものとして以下の２つがあります。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;Ampere (A1.Flex)&lt;/th&gt;
 &lt;th&gt;AMD (E2.1.Micro)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;最大リソース&lt;/td&gt;
 &lt;td&gt;4 OCPU / 24 GB（分配可能）&lt;/td&gt;
 &lt;td&gt;1 OCPU / 1 GB × 2台&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;アーキテクチャ&lt;/td&gt;
 &lt;td&gt;Arm (aarch64)&lt;/td&gt;
 &lt;td&gt;x86_64&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;主な用途&lt;/td&gt;
 &lt;td&gt;開発環境、Docker、高負荷な処理、Webサーバー&lt;/td&gt;
 &lt;td&gt;軽量なスクリプト実行、VPNサーバー、検証用&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;VM.Standard.A1.Flex&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;現在OCIで提供されている中で最もハイスペックかつ使い勝手の良い無料枠インスタンスです。&lt;br&gt;
&lt;strong&gt;Ampere&lt;/strong&gt; を選択し、&lt;strong&gt;VM.Standard.A1.Flex&lt;/strong&gt; をチェックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="467px" data-flex-grow="194" height="666" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-1_hu_f43726e3dff82e49.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-1.webp 1296w" width="1296"&gt;&lt;/p&gt;
&lt;p&gt;シェイプ名横の ▼ を押すと CPU と RAM の設定ができます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="455px" data-flex-grow="189" height="570" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-3.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-3_hu_cb161b4a08e3cb5b.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-3.webp 1082w" width="1082"&gt;&lt;/p&gt;
&lt;p&gt;「4 OCPU / 24 GB」までは無料で使えるらしいです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VM.Standard.E2.1.Micro&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ampere A1 は人気のため、空きがなくて作成できないことが多いです。&lt;br&gt;
また、システムが Arm（Aarch64）アーキテクチャに対応しておらず、どうしても従来の x86_64 環境が必要な場合もあったりします。&lt;br&gt;
そのような場合はこちらを選びます。&lt;br&gt;
ただし、スペックは Ampere A1 に比べて大幅に低くなります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;専門と前世代&lt;/strong&gt; を選択し、&lt;strong&gt;VM.Standard.E2.1.Micro&lt;/strong&gt; をチェックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="411px" data-flex-grow="171" height="762" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-2_hu_948bb4cca6084069.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/03-2.webp 1306w" width="1306"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;上記のうち好きな方を選び、次へを押します。&lt;/p&gt;
&lt;h3 id="セキュリティ"&gt;&lt;a href="#%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3" class="header-anchor"&gt;&lt;/a&gt;セキュリティ
&lt;/h3&gt;&lt;p&gt;保護インスタンスの設定ができますが、予期せぬエラーや「動かない」トラブルの原因になりやすいそうなので、今回は OFF のままとしました。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="506px" data-flex-grow="211" height="548" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/05.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/05_hu_5e0e0a49f3828ea0.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/05.webp 1157w" width="1157"&gt;&lt;/p&gt;
&lt;h3 id="ネットワーキング"&gt;&lt;a href="#%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%ad%e3%83%b3%e3%82%b0" class="header-anchor"&gt;&lt;/a&gt;ネットワーキング
&lt;/h3&gt;&lt;h4 id="プライマリvnic"&gt;&lt;a href="#%e3%83%97%e3%83%a9%e3%82%a4%e3%83%9e%e3%83%aavnic" class="header-anchor"&gt;&lt;/a&gt;プライマリVNIC
&lt;/h4&gt;&lt;p&gt;初めて OCI を使うので、まだ「既存のネットワーク」が存在しないため、新しく &lt;strong&gt;新規仮想クラウド・ネットワーク&lt;/strong&gt; を選択します。
サブネットも自動的に &lt;strong&gt;新規パブリック・サブネットの作成&lt;/strong&gt; に切り替わり、名前などが自動入力されます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="392px" data-flex-grow="163" height="708" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-1_hu_8ff9b9a5a1b5b81a.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-1.webp 1158w" width="1158"&gt;&lt;/p&gt;
&lt;p&gt;２回目は既存のネットワークを選択すれば OK です。&lt;/p&gt;
&lt;h4 id="パブリックipv4アドレス割当て"&gt;&lt;a href="#%e3%83%91%e3%83%96%e3%83%aa%e3%83%83%e3%82%afipv4%e3%82%a2%e3%83%89%e3%83%ac%e3%82%b9%e5%89%b2%e5%bd%93%e3%81%a6" class="header-anchor"&gt;&lt;/a&gt;パブリックIPv4アドレス割当て
&lt;/h4&gt;&lt;p&gt;今回は外部からの通信（インバウンド）を受ける必要はないため、 &lt;strong&gt;パブリックIPv4アドレスの割当て&lt;/strong&gt; は &lt;strong&gt;OFF&lt;/strong&gt; にしておきました。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="879" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-2_hu_2a95284a5cafcb5f.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-2.webp 1162w" width="1162"&gt;&lt;/p&gt;
&lt;h4 id="sshキーの追加"&gt;&lt;a href="#ssh%e3%82%ad%e3%83%bc%e3%81%ae%e8%bf%bd%e5%8a%a0" class="header-anchor"&gt;&lt;/a&gt;SSHキーの追加
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;キー・ペアを自動で生成&lt;/strong&gt; を選択し、&lt;strong&gt;秘密キーのダウンロード&lt;/strong&gt; を押して秘密鍵をダウンロードしておきます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="714px" data-flex-grow="297" height="330" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-3.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-3_hu_65217d3dc1d492e2.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/06-3.webp 982w" width="982"&gt;&lt;/p&gt;
&lt;blockquote class="alert alert-note"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;📝&lt;/span&gt;
 &lt;span class="alert-title"&gt;注記&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;SSH キーなしを選択すると、後述するように Cloud Shell からもインスタンスにアクセスできませんでした。
外部から SSH でアクセスする予定がなくても SSH キーは作成しておかないといけないようです。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;h3 id="ストレージ"&gt;&lt;a href="#%e3%82%b9%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b8" class="header-anchor"&gt;&lt;/a&gt;ストレージ
&lt;/h3&gt;&lt;p&gt;ここは全てデフォルトのままとしました。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="449px" data-flex-grow="187" height="631" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/07.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/07_hu_950aba20468a9cd0.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/07.webp 1182w" width="1182"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「カスタム・ブート・ボリューム・サイズ&amp;hellip;」について&lt;/strong&gt;
チェックがOFF（デフォルト）の場合、標準サイズである 46.6 GB のディスクが自動で割り当てられます。&lt;br&gt;
OCIの無料枠では最大で合計200GBまでストレージが使え、ここにチェックを入れて数値を 100 や 200 に増やすことも可能です。&lt;br&gt;
ただ、後からでもディスクサイズは簡単に拡張できるため、最初はデフォルトのままで様子見するのが安全です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「転送中暗号化の使用」について&lt;/strong&gt;
デフォルトでONになっていますが、これは「仮想マシンとストレージの間の通信を暗号化して盗聴を防ぐ」というインフラ側の高度な保護機能です。&lt;br&gt;
パフォーマンスへの影響も無視できるレベルですので、ON（今の状態）のままにしておきましょう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「自分が管理するキーでこのボリュームを暗号化」について&lt;/strong&gt;
チェックがOFF（デフォルト）の場合、Oracleが管理する標準の暗号鍵で自動的にディスクが暗号化されます。&lt;br&gt;
個人開発で自前の鍵管理（Vault/KMSなど）を入れると管理コストが増えて複雑になるため、OFFのままで問題ありません。&lt;/p&gt;
&lt;h3 id="作成"&gt;&lt;a href="#%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;作成
&lt;/h3&gt;&lt;p&gt;次へ進み、&lt;strong&gt;「作成」&lt;/strong&gt; を押すとインスタンスが作成されます。&lt;br&gt;
しばらく待つとインスタンスが作成されます（ステータス表示が &lt;strong&gt;実行中&lt;/strong&gt; に変わります）。&lt;/p&gt;
&lt;h3 id="api-エラーが発生した場合"&gt;&lt;a href="#api-%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%8c%e7%99%ba%e7%94%9f%e3%81%97%e3%81%9f%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;API エラーが発生した場合
&lt;/h3&gt;&lt;p&gt;これは設定の間違いではなく、「現在、Oracleのデータセンター側で、無料枠用のArmサーバー（Ampere）の在庫が一時的に切れている」 という、OCIの無料枠で最も頻繁に発生する有名な現象です。&lt;br&gt;
世界中で無料枠のAmpereは非常に人気があるため、椅子取りゲームのようになっています。&lt;/p&gt;
&lt;p&gt;解決策は以下です。&lt;/p&gt;
&lt;h4 id="1x86のamd枠に切り替えて即時作成する確実おすすめ"&gt;&lt;a href="#1x86%e3%81%aeamd%e6%9e%a0%e3%81%ab%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e3%81%a6%e5%8d%b3%e6%99%82%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e7%a2%ba%e5%ae%9f%e3%81%8a%e3%81%99%e3%81%99%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;1：x86の「AMD枠」に切り替えて即時作成する（確実・おすすめ）
&lt;/h4&gt;&lt;p&gt;Arm（Ampere）の在庫がなくても、もう1つの無料枠であるAMD（VM.Standard.E2.1.Micro）であれば、在庫に余裕がありすんなり作成できるケースが非常に多いです。&lt;/p&gt;
&lt;h4 id="2フォルトドメインを変更して再トライする"&gt;&lt;a href="#2%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%83%89%e3%83%a1%e3%82%a4%e3%83%b3%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%97%e3%81%a6%e5%86%8d%e3%83%88%e3%83%a9%e3%82%a4%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2：「フォルト・ドメイン」を変更して再トライする
&lt;/h4&gt;&lt;p&gt;同じAmpere（Arm）のまま、サーバーが置かれる物理的な区画（フォルト・ドメイン）を変更することで、運よく在庫が引っかかることがあります。&lt;/p&gt;
&lt;h4 id="3数日数週間時間を変えてクリックし続ける"&gt;&lt;a href="#3%e6%95%b0%e6%97%a5%e6%95%b0%e9%80%b1%e9%96%93%e6%99%82%e9%96%93%e3%82%92%e5%a4%89%e3%81%88%e3%81%a6%e3%82%af%e3%83%aa%e3%83%83%e3%82%af%e3%81%97%e7%b6%9a%e3%81%91%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;3：数日〜数週間、時間を変えてクリックし続ける
&lt;/h4&gt;&lt;p&gt;どうしても強力な「Arm（4 OCPU / 24 GBを狙いたいなど）」が良い場合、誰かがインスタンスを削除して在庫が空くのを待つことになります。&lt;/p&gt;
&lt;h2 id="インスタンスの起動"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%ae%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;インスタンスの起動
&lt;/h2&gt;&lt;p&gt;コンピュートの画面から &lt;strong&gt;インスタンス&lt;/strong&gt; を選択し、該当のインスタンスをクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="591px" data-flex-grow="246" height="438" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-1.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-1_hu_4c5916a94a5f5af9.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-1.webp 1080w" width="1080"&gt;&lt;/p&gt;
&lt;p&gt;右上から起動を押します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="593px" data-flex-grow="247" height="327" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-2.webp" srcset="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-2_hu_341b4d1921dff504.webp 800w, https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/08-2.webp 808w" width="808"&gt;&lt;/p&gt;
&lt;p&gt;これでしばらく待つとインスタンスが起動します。&lt;/p&gt;
&lt;h2 id="インスタンスへ接続cloud-shell-で接続"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%82%bf%e3%83%b3%e3%82%b9%e3%81%b8%e6%8e%a5%e7%b6%9acloud-shell-%e3%81%a7%e6%8e%a5%e7%b6%9a" class="header-anchor"&gt;&lt;/a&gt;インスタンスへ接続（Cloud Shell で接続）
&lt;/h2&gt;&lt;p&gt;OCI 上から Cloud Shell でインスタンスに接続してみます。&lt;/p&gt;
&lt;h3 id="cloud-shell-の起動"&gt;&lt;a href="#cloud-shell-%e3%81%ae%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;Cloud Shell の起動
&lt;/h3&gt;&lt;p&gt;画面右上の &lt;strong&gt;開発者ツール&lt;/strong&gt; をクリックし、&lt;strong&gt;Cloud Shell&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="483px" data-flex-grow="201" height="141" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/10-1.webp" width="284"&gt;&lt;/p&gt;
&lt;p&gt;画面下に端末が表示されますが、まだインスタンスの中には入っていません。&lt;br&gt;
Cloud Shell が単体で起動しただけです。&lt;/p&gt;
&lt;h3 id="ネットワークの変更"&gt;&lt;a href="#%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;ネットワークの変更
&lt;/h3&gt;&lt;p&gt;端末上部の「ネットワーク：パブリック」と表示されたプルダウンから「エフェメラル・プライベートネット・・・」を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="192" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/10-2.webp" width="322"&gt;&lt;/p&gt;
&lt;p&gt;インスタンス作成時に作成した VCN とサブネットを選択し、&lt;strong&gt;アクティブなネットワークとして使用&lt;/strong&gt; を押します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="273px" data-flex-grow="114" height="538" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/21/oracle-cloud-infrastructure/10-3.webp" width="614"&gt;&lt;/p&gt;
&lt;h3 id="秘密鍵ファイルのアップロード"&gt;&lt;a href="#%e7%a7%98%e5%af%86%e9%8d%b5%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;秘密鍵ファイルのアップロード
&lt;/h3&gt;&lt;p&gt;先程ダウンロードした秘密鍵ファイルを端末上にドラッグ＆ドロップしてアップロードします。&lt;/p&gt;
&lt;p&gt;Linux のルールとして、秘密鍵の権限が緩いままだとSSH接続が拒否されてしまうため、以下のコマンドでパーミッションを変更します。
（※ファイル名はご自身のものに書き換えてください）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod 600 ssh-key-xxxx.key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ssh-コマンドでログインする"&gt;&lt;a href="#ssh-%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%a7%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;SSH コマンドでログインする
&lt;/h3&gt;&lt;p&gt;以上で準備は完了です。&lt;br&gt;
以下のコマンドで Cloud Shell インスタンスへと接続します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ssh-key-xxxx.key &amp;lt;username&amp;gt;@&amp;lt;private_ip_address&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; は、インスタンスのデフォルトのユーザー名です。&lt;br&gt;
Oracle Linux および Redhat Enterprise Linux 互換イメージの場合、デフォルトのユーザー名は &lt;code&gt;opc&lt;/code&gt;、Ubuntu イメージの場合、デフォルトのユーザー名は &lt;code&gt;ubuntu&lt;/code&gt; だそうです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;private_ip_address&amp;gt;&lt;/code&gt; は接続先インスタンスのプライベートIPアドレスです。&lt;br&gt;
&lt;strong&gt;コンピュート &amp;gt; インスタンス&lt;/strong&gt; で確認できます。&lt;code&gt;10.0.x.x&lt;/code&gt; のような数字を入れてください。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px"&gt;&lt;/p&gt;
&lt;p&gt;コマンド入力後、&lt;code&gt;Are you sure you want to continue connecting (yes/no)?&lt;/code&gt; と聞かれたら、 &lt;code&gt;yes&lt;/code&gt; と入力してEnterを押します。&lt;/p&gt;
&lt;p&gt;無事にプロンプトが &lt;code&gt;&amp;lt;username&amp;gt;@instance-xxxx:~$&lt;/code&gt; に切り替われば、インスタンスに接続できています。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;とりあえずはここまで。&lt;/p&gt;
&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.clinks.jp/column/oci/1983/" target="_blank" rel="noopener"
 &gt;https://www.clinks.jp/column/oci/1983/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://oracle-japan.github.io/ocitutorials/beginners/creating-compute-instance/" target="_blank" rel="noopener"
 &gt;https://oracle-japan.github.io/ocitutorials/beginners/creating-compute-instance/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.reqtc.com/blog/oci-ssh.html" target="_blank" rel="noopener"
 &gt;https://www.reqtc.com/blog/oci-ssh.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Cloudflare Pages で静的サイトを公開する（GitLab 連携）</title><link>https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/</link><pubDate>Sun, 17 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/</guid><description>&lt;h2 id="前提環境"&gt;&lt;a href="#%e5%89%8d%e6%8f%90%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;前提・環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ソース管理: &lt;strong&gt;GitLab&lt;/strong&gt; (GitHub でもやり方は同じ)&lt;/li&gt;
&lt;li&gt;ホスティング: &lt;strong&gt;Cloudflare Pages&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;DNS: &lt;strong&gt;Cloudflare&lt;/strong&gt;（既存ドメインのサブドメインに展開する想定）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="gitlab-側で必要なこと"&gt;&lt;a href="#gitlab-%e5%81%b4%e3%81%a7%e5%bf%85%e8%a6%81%e3%81%aa%e3%81%93%e3%81%a8" class="header-anchor"&gt;&lt;/a&gt;GitLab 側で必要なこと
&lt;/h2&gt;&lt;p&gt;ほぼ何もしなくて構いません。&lt;br&gt;
&lt;code&gt;.gitlab-ci.yml&lt;/code&gt; を書く必要はなく、Cloudflare Pages が直接 git clone してビルドします。&lt;/p&gt;
&lt;p&gt;最低限の準備は次のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リポジトリが Cloudflare からアクセスできること（Public ならそのまま、Private なら次節の OAuth で許可します）&lt;/li&gt;
&lt;li&gt;プロダクションブランチ（&lt;code&gt;main&lt;/code&gt; など）を決めておくこと&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ブランチ運用は Cloudflare Pages 側で自動的に処理されます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロダクションブランチへの push → 本番デプロイ&lt;/li&gt;
&lt;li&gt;それ以外のブランチへの push → &lt;strong&gt;自動でプレビュー URL が発行される&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cloudflare-pages-側のセットアップ"&gt;&lt;a href="#cloudflare-pages-%e5%81%b4%e3%81%ae%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%97" class="header-anchor"&gt;&lt;/a&gt;Cloudflare Pages 側のセットアップ
&lt;/h2&gt;&lt;p&gt;Cloudflare ダッシュボード → &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="519px" data-flex-grow="216" height="536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/01.webp" srcset="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/01_hu_9ea2c901c150fda5.webp 800w, https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/01.webp 1160w" width="1160"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Create application&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="529px" data-flex-grow="220" height="529" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/02.webp" srcset="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/02_hu_a08f49e8f9b7bb41.webp 800w, https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/02.webp 1167w" width="1167"&gt;&lt;/p&gt;
&lt;p&gt;下部にある &lt;strong&gt;Get started&lt;/strong&gt; をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="518px" data-flex-grow="216" height="434" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/03.webp" srcset="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/03_hu_6c3acff843249430.webp 800w, https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/03.webp 938w" width="938"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Import an existing Git repository&lt;/strong&gt; の &lt;strong&gt;Get started&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="443px" data-flex-grow="184" height="332" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/04.webp" width="614"&gt;&lt;/p&gt;
&lt;h3 id="git-プロバイダの接続"&gt;&lt;a href="#git-%e3%83%97%e3%83%ad%e3%83%90%e3%82%a4%e3%83%80%e3%81%ae%e6%8e%a5%e7%b6%9a" class="header-anchor"&gt;&lt;/a&gt;Git プロバイダの接続
&lt;/h3&gt;&lt;p&gt;GitHub だけでなく &lt;strong&gt;GitLab も公式サポート&lt;/strong&gt;されています。&lt;br&gt;
&lt;strong&gt;GitLab&lt;/strong&gt; のタブを選択し、&lt;strong&gt;Connect GitLab&lt;/strong&gt; から OAuth で認証を行います。&lt;br&gt;
認証後、対象リポジトリを選び、&lt;strong&gt;Begin setup&lt;/strong&gt; を選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="415px" data-flex-grow="173" height="549" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/05.webp" srcset="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/05_hu_29852ce65aaaecb.webp 800w, https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/05.webp 951w" width="951"&gt;&lt;/p&gt;
&lt;h3 id="ビルド設定で指定する項目"&gt;&lt;a href="#%e3%83%93%e3%83%ab%e3%83%89%e8%a8%ad%e5%ae%9a%e3%81%a7%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b%e9%a0%85%e7%9b%ae" class="header-anchor"&gt;&lt;/a&gt;ビルド設定で指定する項目
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Framework preset&lt;/strong&gt;: 使っているフレームワークに該当があれば選びます。自前のシェルスクリプトでビルドするなら None で構いません&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build command&lt;/strong&gt;: リポジトリ直下から実行されるビルドコマンド&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build output directory&lt;/strong&gt;: 成果物のディレクトリ（例: &lt;code&gt;dist&lt;/code&gt;、&lt;code&gt;public&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Root directory&lt;/strong&gt;: 通常は空欄でリポジトリ直下&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environment variables&lt;/strong&gt;: 必要に応じて設定します&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="286px" data-flex-grow="119" height="785" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/06.webp" srcset="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/06_hu_7c9afe961a914c17.webp 800w, https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/06.webp 936w" width="936"&gt;&lt;/p&gt;
&lt;h3 id="初回デプロイの確認"&gt;&lt;a href="#%e5%88%9d%e5%9b%9e%e3%83%87%e3%83%97%e3%83%ad%e3%82%a4%e3%81%ae%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;初回デプロイの確認
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Save and Deploy&lt;/strong&gt; を選択すると数分でビルドが走り、プレビュー URL（&lt;code&gt;&amp;lt;project&amp;gt;.pages.dev&lt;/code&gt;）が発行されます。&lt;br&gt;
ここでまず動作確認をしてから、カスタムドメインを当てに行きます。&lt;/p&gt;
&lt;h2 id="カスタムドメインの設定"&gt;&lt;a href="#%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%83%89%e3%83%a1%e3%82%a4%e3%83%b3%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;カスタムドメインの設定
&lt;/h2&gt;&lt;p&gt;DNS も Cloudflare で管理しているなら、ほぼワンクリックで終わります。&lt;/p&gt;
&lt;p&gt;初回デプロイ完了後、&lt;strong&gt;Add custom domain&lt;/strong&gt; を選択するとカスタムドメインの設定画面に移行します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="336px" data-flex-grow="140" height="685" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/07.webp" srcset="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/07_hu_5616fba272d14413.webp 800w, https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/07.webp 959w" width="959"&gt;&lt;/p&gt;
&lt;p&gt;メニューからアクセスする場合は、&lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt; の &lt;strong&gt;Custom domains&lt;/strong&gt; タブを選択します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="558px" data-flex-grow="232" height="459" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/08.webp" srcset="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/08_hu_fda31703fcc12606.webp 800w, https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/08.webp 1069w" width="1069"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Set up a custom domain&lt;/strong&gt; を選択します。&lt;br&gt;
続いて、適用したいドメインを入力し、&lt;strong&gt;Continue&lt;/strong&gt; をクリックします。&lt;br&gt;
すると、&lt;strong&gt;CNAME レコードが自動で追加されます&lt;/strong&gt;（手動編集は不要です）。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="502px" data-flex-grow="209" height="438" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/09.webp" srcset="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/09_hu_4303b6333e2844ea.webp 800w, https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/09.webp 917w" width="917"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Activate domain&lt;/strong&gt; をクリックすると設定完了です。&lt;br&gt;
TLS 証明書も Cloudflare 側で自動発行されます（数分待ちます）&lt;/p&gt;
&lt;h3 id="ssltls-モードの変更"&gt;&lt;a href="#ssltls-%e3%83%a2%e3%83%bc%e3%83%89%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;SSL/TLS モードの変更
&lt;/h3&gt;&lt;p&gt;SSL/TLS モードは &lt;strong&gt;Full (strict)&lt;/strong&gt; にしておきます。&lt;br&gt;
Cloudflare Pages の出口側は有効な証明書を持つので、Full (strict) でもエラーにはならず、Flexible のように HTTPS が中途半端な状態を避けられます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SSL/TLS&lt;/strong&gt; の &lt;strong&gt;Overview&lt;/strong&gt; を選択し、SSL/TLS encryption の &lt;strong&gt;Configure&lt;/strong&gt; をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="558px" data-flex-grow="232" height="555" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/10.webp" srcset="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/10_hu_7d12418840684b2a.webp 800w, https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/10.webp 1292w" width="1292"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Full (Strict)&lt;/strong&gt; を選択して、&lt;strong&gt;Save&lt;/strong&gt; をクリックして完了です。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="254px" data-flex-grow="105" height="638" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/17/cloudflare-pages-gitlab/11.webp" width="676"&gt;&lt;/p&gt;
&lt;h2 id="気をつけること"&gt;&lt;a href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%82%8b%e3%81%93%e3%81%a8" class="header-anchor"&gt;&lt;/a&gt;気をつけること
&lt;/h2&gt;&lt;h3 id="node_version-の明示"&gt;&lt;a href="#node_version-%e3%81%ae%e6%98%8e%e7%a4%ba" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;NODE_VERSION&lt;/code&gt; の明示
&lt;/h3&gt;&lt;p&gt;Cloudflare Pages のデフォルト Node は古いことがあります。&lt;br&gt;
&lt;code&gt;package.json&lt;/code&gt; の &lt;code&gt;engines&lt;/code&gt; だけでは効かないので、&lt;strong&gt;ビルド設定の環境変数で明示します&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="ビルド時間と無料枠"&gt;&lt;a href="#%e3%83%93%e3%83%ab%e3%83%89%e6%99%82%e9%96%93%e3%81%a8%e7%84%a1%e6%96%99%e6%9e%a0" class="header-anchor"&gt;&lt;/a&gt;ビルド時間と無料枠
&lt;/h3&gt;&lt;p&gt;無料枠は &lt;strong&gt;同時ビルド 1 並列・月 500 回まで&lt;/strong&gt;です。&lt;br&gt;
push のたびにビルドが走るので、頻繁な push を続けると上限に近づきます。CI ライクに何度も push しまくる運用には向きません。&lt;/p&gt;
&lt;p&gt;初回ビルドは &lt;code&gt;npm install&lt;/code&gt; がフレッシュで 5〜10 分かかることもあります。2 回目以降はキャッシュが効きます。&lt;/p&gt;
&lt;h3 id="プレビュー-url-の検索エンジン除外"&gt;&lt;a href="#%e3%83%97%e3%83%ac%e3%83%93%e3%83%a5%e3%83%bc-url-%e3%81%ae%e6%a4%9c%e7%b4%a2%e3%82%a8%e3%83%b3%e3%82%b8%e3%83%b3%e9%99%a4%e5%a4%96" class="header-anchor"&gt;&lt;/a&gt;プレビュー URL の検索エンジン除外
&lt;/h3&gt;&lt;p&gt;Cloudflare Pages は本番ドメイン以外（&lt;code&gt;&amp;lt;project&amp;gt;.pages.dev&lt;/code&gt; や &lt;code&gt;&amp;lt;branch&amp;gt;.&amp;lt;project&amp;gt;.pages.dev&lt;/code&gt;）にも &lt;strong&gt;自動で &lt;code&gt;X-Robots-Tag: noindex&lt;/code&gt; を付けます&lt;/strong&gt;。Google にプレビュー版がインデックスされる事故は基本的に起きません。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;まとめ
&lt;/h2&gt;&lt;p&gt;すべて &lt;strong&gt;無料枠&lt;/strong&gt;で完結し、自前のサーバー運用はゼロです。&lt;br&gt;
GitLab に push して数分で本番反映される、最小構成になっています。&lt;/p&gt;
&lt;p&gt;GitLab Pages + Cloudflare プロキシでも同じことはできますが、TXT 検証や SSL モード調整など「2 サービスを連携させるための作業」が発生します。&lt;br&gt;
Cloudflare 内で完結させると、覚えることが 1 箇所にまとまって精神的に楽です。&lt;/p&gt;</description></item><item><title>Cloudflare で取得した独自ドメインを GitLab Pages に設定する方法</title><link>https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/</link><pubDate>Tue, 12 May 2026 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/</guid><description>&lt;h2 id="全体の流れ"&gt;&lt;a href="#%e5%85%a8%e4%bd%93%e3%81%ae%e6%b5%81%e3%82%8c" class="header-anchor"&gt;&lt;/a&gt;全体の流れ
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GitLab側&lt;/strong&gt;: カスタムドメイン登録と検証コードの取得&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitLab側&lt;/strong&gt;: Pagesの公開範囲（Visibility）の設定&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare側&lt;/strong&gt;: DNSレコード（CNAME/TXT）の設定&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最終確認&lt;/strong&gt;: SSL証明書の発行とプロキシの有効化&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="1-gitlab側でカスタムドメインを追加する"&gt;&lt;a href="#1-gitlab%e5%81%b4%e3%81%a7%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%83%89%e3%83%a1%e3%82%a4%e3%83%b3%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;1. GitLab側でカスタムドメインを追加する
&lt;/h2&gt;&lt;p&gt;まず、GitLabに「このドメインを使います」と伝えて、検証用のコードを発行します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;プロジェクトの左メニュー &lt;strong&gt;[Deploy] &amp;gt; [Pages]&lt;/strong&gt; を開きます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domains &amp;amp; settings&lt;/strong&gt; のタブを選択し、&lt;strong&gt;[Add Domain]&lt;/strong&gt; をクリックします。&lt;br&gt;
&lt;img class="gallery-image" data-flex-basis="551px" data-flex-grow="229" height="496" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/01.webp" srcset="https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/01_hu_da00e0f781f44ee3.webp 800w, https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/01.webp 1139w" width="1139"&gt;&lt;/li&gt;
&lt;li&gt;使用したいドメイン（例: &lt;code&gt;blog.example.com&lt;/code&gt;）を入力し、&lt;strong&gt;[Create new domain]&lt;/strong&gt; をクリックします。&lt;br&gt;
&lt;img class="gallery-image" data-flex-basis="472px" data-flex-grow="196" height="445" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/02.webp" srcset="https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/02_hu_719ccfceb99c9603.webp 800w, https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/02.webp 876w" width="876"&gt;&lt;/li&gt;
&lt;li&gt;表示された画面から以下の2点をメモします。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TXTレコードの値&lt;/strong&gt;: &lt;code&gt;gitlab-pages-verification-code=...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CNAMEのターゲット&lt;/strong&gt;: &lt;code&gt;username-12345.gitlab.io&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="自分の名前空間targetを確認する方法"&gt;&lt;a href="#%e8%87%aa%e5%88%86%e3%81%ae%e5%90%8d%e5%89%8d%e7%a9%ba%e9%96%93target%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;自分の「名前空間（Target）」を確認する方法
&lt;/h3&gt;&lt;p&gt;GitLab PagesのデフォルトURLを確認してください。
例：&lt;code&gt;https://username-12345.gitlab.io/my-project&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;この場合、Cloudflare側で指定するターゲットは &lt;strong&gt;&lt;code&gt;username-12345.gitlab.io&lt;/code&gt;&lt;/strong&gt; です。
&lt;code&gt;.gitlab.io&lt;/code&gt; の直前まで（スラッシュより前のホスト部分）が、あなたの「名前空間（Namespace）」となります。&lt;/p&gt;
&lt;h2 id="2-プロジェクトはprivateのままpagesだけを公開する"&gt;&lt;a href="#2-%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e3%81%afprivate%e3%81%ae%e3%81%be%e3%81%bepages%e3%81%a0%e3%81%91%e3%82%92%e5%85%ac%e9%96%8b%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;2. プロジェクトはPrivateのまま、Pagesだけを公開する
&lt;/h2&gt;&lt;p&gt;「ソースコードは見せたくないが、ブログとして誰でも見れるようにしたい」場合は、以下の設定が必須です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;[Settings] &amp;gt; [General]&lt;/strong&gt; を開きます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[Visibility, project features and permissions]&lt;/strong&gt; セクションを展開します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project visibility&lt;/strong&gt; は &lt;strong&gt;[Private]&lt;/strong&gt; のままにします。&lt;/li&gt;
&lt;li&gt;下の方にある &lt;strong&gt;[Pages]&lt;/strong&gt; の権限設定を &lt;strong&gt;[Everyone]&lt;/strong&gt; に変更します。
&lt;ul&gt;
&lt;li&gt;※ここが &lt;code&gt;Only Project Members&lt;/code&gt; だと、独自ドメインにアクセスしてもGitLabのログイン画面が出てしまいます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[Save changes]&lt;/strong&gt; で保存します。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="3-cloudflare側でdnsレコードを設定する"&gt;&lt;a href="#3-cloudflare%e5%81%b4%e3%81%a7dns%e3%83%ac%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;3. Cloudflare側でDNSレコードを設定する
&lt;/h2&gt;&lt;p&gt;Cloudflareの管理画面の左メニューから &lt;strong&gt;[Domains] &amp;gt; [Overview]&lt;/strong&gt; を開き、該当のドメインをクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1048px" data-flex-grow="436" height="357" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/03.webp" srcset="https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/03_hu_fa7e6c6c7efaf40f.webp 800w, https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/03.webp 1559w" width="1559"&gt;&lt;/p&gt;
&lt;p&gt;さらに左メニューから &lt;strong&gt;[DNS] &amp;gt; [Records]&lt;/strong&gt; を開き、&lt;strong&gt;Add record&lt;/strong&gt; をクリックして、以下の2つのレコードを追加します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="555px" data-flex-grow="231" height="656" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/04.webp" srcset="https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/04_hu_cd257f623ecf097.webp 800w, https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/04.webp 1518w" width="1518"&gt;&lt;/p&gt;
&lt;h3 id="-cnameレコード接続用"&gt;&lt;a href="#-cname%e3%83%ac%e3%82%b3%e3%83%bc%e3%83%89%e6%8e%a5%e7%b6%9a%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;① CNAMEレコード（接続用）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;項目&lt;/th&gt;
 &lt;th style="text-align: left"&gt;設定値の例&lt;/th&gt;
 &lt;th style="text-align: left"&gt;補足&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;CNAME&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;blog&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;サブドメイン部分のみ入力&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Target&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;username-12345.gitlab.io&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;先ほど確認したGitLabのホスト名&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Proxy status&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;DNS only (灰色雲)&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;SSL発行をスムーズにするため最初は必ず「灰色」にする&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="-txtレコードドメイン所有確認用"&gt;&lt;a href="#-txt%e3%83%ac%e3%82%b3%e3%83%bc%e3%83%89%e3%83%89%e3%83%a1%e3%82%a4%e3%83%b3%e6%89%80%e6%9c%89%e7%a2%ba%e8%aa%8d%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;② TXTレコード（ドメイン所有確認用）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;項目&lt;/th&gt;
 &lt;th style="text-align: left"&gt;設定値の例&lt;/th&gt;
 &lt;th style="text-align: left"&gt;補足&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;TXT&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;_gitlab-pages-verification-code.blog&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;_gitlab-pages-verification-code.&lt;/code&gt; の後にサブドメイン名を付ける&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Content&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;gitlab-pages-verification-code=...&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;GitLabからコピーした検証コード&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="4-仕上げ検証とプロキシ有効化"&gt;&lt;a href="#4-%e4%bb%95%e4%b8%8a%e3%81%92%e6%a4%9c%e8%a8%bc%e3%81%a8%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;4. 仕上げ：検証とプロキシ有効化
&lt;/h2&gt;&lt;h3 id="-gitlabで検証する"&gt;&lt;a href="#-gitlab%e3%81%a7%e6%a4%9c%e8%a8%bc%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;① GitLabで検証する
&lt;/h3&gt;&lt;p&gt;DNS設定後、GitLabのPages設定画面で &lt;strong&gt;[Verify]&lt;/strong&gt;（更新マーク）ボタンを押します。「Verified」になれば成功です。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="451px" data-flex-grow="188" height="470" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/05.webp" srcset="https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/05_hu_e848a83d0f43a8b7.webp 800w, https://blog.ponkotools.com/posts/2026/05/12/cloudflare-gitlab/05.webp 884w" width="884"&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;⚠️ &lt;strong&gt;すぐに認証されない場合があります。&lt;/strong&gt; Cloudflare管理ドメインはDNSのTTLが短いため反映は比較的早いですが、DNSの浸透には最大48時間かかることがあります。Verifyが通らない場合は時間をおいて再試行してください。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="-ssl証明書の発行を待つ"&gt;&lt;a href="#-ssl%e8%a8%bc%e6%98%8e%e6%9b%b8%e3%81%ae%e7%99%ba%e8%a1%8c%e3%82%92%e5%be%85%e3%81%a4" class="header-anchor"&gt;&lt;/a&gt;② SSL証明書の発行を待つ
&lt;/h3&gt;&lt;p&gt;検証完了後、数分〜30分ほどでLet&amp;rsquo;s Encryptの証明書が自動発行され、&lt;code&gt;https://&lt;/code&gt; でアクセスできるようになります。&lt;/p&gt;
&lt;h3 id="-cloudflareのプロキシをonにする"&gt;&lt;a href="#-cloudflare%e3%81%ae%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e3%82%92on%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;③ CloudflareのプロキシをONにする
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;https://&lt;/code&gt; で正常に表示されたことを確認してから、CloudflareのDNSレコードを &lt;strong&gt;[Proxied（オレンジ雲）]&lt;/strong&gt; に切り替えます。&lt;/p&gt;
&lt;h4 id="プロキシを-on-にするメリット"&gt;&lt;a href="#%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e3%82%92-on-%e3%81%ab%e3%81%99%e3%82%8b%e3%83%a1%e3%83%aa%e3%83%83%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;プロキシを ON にするメリット
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CDNによる高速化&lt;/strong&gt;: 画像やJSがキャッシュされ、表示速度が向上します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;セキュリティ強化&lt;/strong&gt;: DDoS保護やWAFが利用可能になります。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;アクセス解析&lt;/strong&gt;: Cloudflare側でトラフィックやアクセス地域を確認できます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-cloudflareのssltls設定を変更する"&gt;&lt;a href="#-cloudflare%e3%81%aessltls%e8%a8%ad%e5%ae%9a%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;④ CloudflareのSSL/TLS設定を変更する
&lt;/h3&gt;&lt;p&gt;プロキシを有効にしたら、Cloudflareの &lt;strong&gt;[SSL/TLS] &amp;gt; [Overview]&lt;/strong&gt; を開き、暗号化モードを確認します。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;モード&lt;/th&gt;
 &lt;th style="text-align: left"&gt;説明&lt;/th&gt;
 &lt;th style="text-align: left"&gt;推奨&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;Full&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;GitLab側の証明書を検証せず暗号化&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;初心者・通常利用向け&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;Full (strict)&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;GitLab側にLet&amp;rsquo;s Encryptなど信頼されたCA発行の証明書が必要&lt;/td&gt;
 &lt;td style="text-align: left"&gt;SSL発行が正常に完了していれば利用可&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;⚠️ &lt;code&gt;Full (strict)&lt;/code&gt; はSSL証明書が有効な状態でのみ機能します。証明書の発行前や更新タイミングで一時的にエラーになるリスクがあるため、迷ったら &lt;strong&gt;&lt;code&gt;Full&lt;/code&gt;&lt;/strong&gt; を選択してください。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="5-運用上の注意キャッシュの扱い"&gt;&lt;a href="#5-%e9%81%8b%e7%94%a8%e4%b8%8a%e3%81%ae%e6%b3%a8%e6%84%8f%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5%e3%81%ae%e6%89%b1%e3%81%84" class="header-anchor"&gt;&lt;/a&gt;5. 運用上の注意：キャッシュの扱い
&lt;/h2&gt;&lt;p&gt;Cloudflareのプロキシを有効にすると、CSSや画像などの静的ファイルがキャッシュされます。
&lt;strong&gt;サイトを更新しても古いコンテンツが表示される場合&lt;/strong&gt;は、Cloudflareのキャッシュをクリアしてください。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;手動でキャッシュをクリアする方法:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cloudflareダッシュボードの &lt;strong&gt;[Caching] &amp;gt; [Configuration]&lt;/strong&gt; を開く&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[Purge Cache]&lt;/strong&gt; &amp;gt; &lt;strong&gt;[Purge Everything]&lt;/strong&gt;（または特定URLを指定）を実行する&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="まとめ"&gt;&lt;a href="#%e3%81%be%e3%81%a8%e3%82%81" class="header-anchor"&gt;&lt;/a&gt;まとめ
&lt;/h2&gt;&lt;p&gt;GitLab Pagesを独自ドメインで運用する主なポイントは以下の3点です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;正しいCNAMEターゲットを設定する&lt;/strong&gt; — GitLabのPages URLから実際のホスト名を確認して使う&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PagesのVisibilityを「Everyone」にする&lt;/strong&gt; — Privateプロジェクトでも公開アクセスを許可する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSL発行前はプロキシを灰色に保つ&lt;/strong&gt; — 証明書が発行されてからオレンジ雲に切り替える&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>docker コンテナ起動時に /tmp ディレクトリの中身を削除する</title><link>https://blog.ponkotools.com/posts/2024/12/11/docker/</link><pubDate>Wed, 11 Dec 2024 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2024/12/11/docker/</guid><description>&lt;p&gt;Linux ではシステム起動時に &lt;code&gt;/tmp&lt;/code&gt; ディレクトリの中身がクリアされます。&lt;br&gt;
しかし、docker コンテナの場合は、通常はコンテナを再起動しても &lt;code&gt;/tmp&lt;/code&gt; ディレクトリの中身はクリアされません。&lt;/p&gt;
&lt;p&gt;docker コンテナで起動時に &lt;code&gt;/tmp&lt;/code&gt; ディレクトリの中身をクリアするには、以下のように &lt;code&gt;tmpfs&lt;/code&gt; ボリュームを使用する方法があります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --tmpfs /tmp my_image
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;docker compose の場合は以下のように指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;my_service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my_image&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tmpfs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/tmp&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# その他の設定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;尚、docker compose で手動でボリュームを再作成したい場合は、以下のように &lt;code&gt;docker compose down -v&lt;/code&gt; コマンドを使用して既存のボリュームを削除し、その後 &lt;code&gt;docker compose up -d&lt;/code&gt; コマンドで新しいボリュームを作成してコンテナを起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker compose down -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;</description></item><item><title>redis コンテナでの redis-server の起動方法による違い</title><link>https://blog.ponkotools.com/posts/2024/06/27/redis/</link><pubDate>Thu, 27 Jun 2024 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2024/06/27/redis/</guid><description>&lt;p&gt;redis の公式のイメージを docker compose で動かしていたのですが、&lt;code&gt;command&lt;/code&gt; を指定しない場合のデフォルトの実行コマンドは &lt;code&gt;redis-server&lt;/code&gt; で、この場合、コンテナを再起動してもデータが残っていました。&lt;/p&gt;
&lt;p&gt;しかし、コマンドを &lt;code&gt;command: sh -c &amp;quot;redis-server&amp;quot;&lt;/code&gt; としたところ、コンテナ再起動でデータがクリアされたので、両者の違いについて ChatGPT に聞いてみました。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;command: &amp;quot;redis-server&amp;quot;:&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;この設定では、単純に redis-server コマンドが実行されます。Docker はこのコマンドを直接実行し、Redis サーバーが起動します。この場合、Redis サーバーが直接起動されるため、Redis のデフォルトの動作が適用され、データが残ります。再起動してもデータがクリアされないのは、Redis サーバーが正しく起動し、データをインメモリに保持しているためです。&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;code&gt;command: sh -c &amp;quot;redis-server&amp;quot;:&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一方、この設定では、sh -c コマンドを使用してシェルでコマンドを実行します。sh -c コマンドは、指定されたコマンドをシェル経由で実行します。この場合、redis-server コマンドがシェル経由で実行されるため、Docker はシェルプロセスを起動し、そのシェルプロセスが redis-server コマンドを実行します。この場合、シェルプロセスがメインプロセスとなり、redis-server がそのサブプロセスとして実行されます。そのため、正しくプロセスが管理されない可能性があり、コンテナの再起動時にデータがクリアされる可能性があります。&lt;/p&gt;</description></item><item><title>[Docker] Python の Windows コンテナを動かしてみた</title><link>https://blog.ponkotools.com/posts/2024/03/18/docker-python/</link><pubDate>Mon, 18 Mar 2024 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2024/03/18/docker-python/</guid><description>&lt;p&gt;ホストもコンテナも Windows になるので、Dockerfile の記述方法や、コンテナ起動時のオプションの指定方法なども Linux とは異なります。&lt;/p&gt;
&lt;p&gt;Windows 上で Docker を (Docker Desktop を使わずに) 動かす方法については以下を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2023/11/docker-windows.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2023/11/docker-windows.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そのうえで、今回 Python の Windows コンテナを動かしてみました。&lt;/p&gt;
&lt;p&gt;Docker Hub にある Python の Windows コンテナとしては、&lt;code&gt;windowsservercore-ltsc2022&lt;/code&gt; と &lt;code&gt;windowsservercore-1809&lt;/code&gt; があるようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://hub.docker.com/_/python" target="_blank" rel="noopener"
 &gt;https://hub.docker.com/_/python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回は &lt;code&gt;python:3.11-windowsservercore-1809&lt;/code&gt; のイメージを使いました。&lt;/p&gt;
&lt;h2 id="dockerfile-のサンプル"&gt;&lt;a href="#dockerfile-%e3%81%ae%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;Dockerfile のサンプル
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM python:3.11-windowsservercore-1809
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CMD &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cmd.exe&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Linux コンテナでは &lt;code&gt;CMD [ &amp;quot;/bin/bash&amp;quot; ]&lt;/code&gt; のように記述していましたが、Windows コンテナでは &lt;code&gt;CMD [&amp;quot;cmd.exe&amp;quot;]&lt;/code&gt; または &lt;code&gt;CMD [&amp;quot;powershell.exe&amp;quot;]&lt;/code&gt; のように記述します。&lt;/p&gt;
&lt;h2 id="コンテナ起動例"&gt;&lt;a href="#%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e8%b5%b7%e5%8b%95%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;コンテナ起動例
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; docker run -it --rm ^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name コンテナ名 ^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v %CD%&lt;span class="se"&gt;\w&lt;/span&gt;orkspace:C:&lt;span class="se"&gt;\w&lt;/span&gt;orkspace ^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --workdir&lt;span class="o"&gt;=&lt;/span&gt;C:&lt;span class="se"&gt;\w&lt;/span&gt;orkspace ^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; イメージ名
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Linux ではカレントディレクトリを指定するために &lt;code&gt;$(pwd)&lt;/code&gt; と記述したりしていましたが、Windows なので &lt;code&gt;%CD%&lt;/code&gt; と記述します。&lt;br&gt;
パスの区切りは &lt;code&gt;\(バックスラッシュ)&lt;/code&gt; になります。&lt;br&gt;
コマンド途中での改行も、Linux ではバックスラッシュでしたが、Windows なので &lt;code&gt;^&lt;/code&gt; になります。&lt;br&gt;
また、Windows コンテナなので、マウント先のパスも C ドライブからのパスで記述します。&lt;/p&gt;
&lt;p&gt;とりあえずここまで。&lt;br&gt;
追々いろいろ追記するかもしれません。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ishibashi-futoshi/items/db807d64624f43be1be9" target="_blank" rel="noopener"
 &gt;https://qiita.com/ishibashi-futoshi/items/db807d64624f43be1be9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GitLab Pages でディレクトリ一覧を表示したい</title><link>https://blog.ponkotools.com/posts/2023/12/25/gitlab-pages/</link><pubDate>Mon, 25 Dec 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/12/25/gitlab-pages/</guid><description>&lt;p&gt;GitLab Pages で公開しているサイトにアクセスしたときに、配下ディレクトリの一覧を表示させる方法です。&lt;/p&gt;
&lt;p&gt;GitLab 12.8 までは nginx の autoindex を有効にして index of で表示させることができたようですが、セキュリティの観点からその機能は削除されたそうです。&lt;/p&gt;
&lt;p&gt;なので、どうにかしてインデックスページを作成し、GitLab Pages に公開するしかありません。
例えば、Hugo や Jekyll で Sitemap やインデックスページの自動生成機能を使う方法があるようです。&lt;/p&gt;
&lt;p&gt;ただ、今回私はシェルスクリプトファイルで作成することにしました。&lt;/p&gt;
&lt;p&gt;以下、サンプルです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 公開ディレクトリ内のディレクトリ一覧を取得&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;dirs&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;public/*/&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# HTMLで一覧を表示するための変数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;ul&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ディレクトリのHTMLリストを生成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; d in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;dirs&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# フォルダ一覧のみに制限するため、publicディレクトリ内のサブディレクトリのみを対象としています。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$d&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -e &lt;span class="s1"&gt;&amp;#39;s/public\///&amp;#39;&lt;/span&gt; -e &lt;span class="s1"&gt;&amp;#39;s/\///&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$list&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$list&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/ul&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# index.htmlファイルを作成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;タイトル&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; public/index.html &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;lt;!DOCTYPE html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;lt;html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;lt;head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;lt;meta charset=&amp;#34;UTF-8&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;lt;title&amp;gt;$title&amp;lt;/title&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;lt;/head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;lt;body&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;lt;h1&amp;gt;$title&amp;lt;/h1&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; $list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;lt;/body&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを、&lt;code&gt;.gitlab-ci.yml&lt;/code&gt; の script の最後に実行すれば OK です。&lt;/p&gt;
&lt;p&gt;上記はディレクトリに限定していますが、応用でファイル一覧を出力できると思います。&lt;/p&gt;</description></item><item><title>GitLab Pages でブランチ毎にディレクトリを分けて公開したい</title><link>https://blog.ponkotools.com/posts/2023/12/20/gitlab-pages/</link><pubDate>Wed, 20 Dec 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/12/20/gitlab-pages/</guid><description>&lt;p&gt;mkdocs で作成したサイトを GitLab Pages で公開していたのですが、これをブランチ毎にディレクトリを分けて公開するようにしました。&lt;/p&gt;
&lt;p&gt;基本的には、キャッシュを有効にするだけで可能です。&lt;br&gt;
各ブランチでの成果物も一緒に Pages で公開したいため、キャッシュのキーは固定値にします。&lt;br&gt;
以下、 &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; の抜粋です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mkdocs build&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;rm -rf public/${CI_COMMIT_REF_NAME}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mv site public/${CI_COMMIT_REF_NAME}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;artifacts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;public&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ブランチ毎に別のキャッシュを利用したい場合はブランチ名をキーにするが、&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 今回は全ブランチのビルド結果も一緒に公開したいため、キーは全ブランチで共通の固定値にする&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;common-key&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#key: &amp;#34;$CI_COMMIT_REF_NAME&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;public&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;site&lt;/code&gt; ディレクトリが mkdocs の成果物が入っているディレクトリですが、これを &lt;code&gt;public/ブランチ名&lt;/code&gt; に配置しています。&lt;/p&gt;
&lt;h2 id="注意点"&gt;&lt;a href="#%e6%b3%a8%e6%84%8f%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;注意点
&lt;/h2&gt;&lt;p&gt;デフォルトでは、保護されたブランチと保護されていないブランチではキャッシュが共有されないため、この場合はプロジェクトの設定変更が必要です。&lt;br&gt;
これを知らずに何度試してもキャッシュが共有されずはまっていました・・・。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gitlab-docs.creationline.com/ee/ci/caching/#use-the-same-cache-for-all-branches" target="_blank" rel="noopener"
 &gt;https://gitlab-docs.creationline.com/ee/ci/caching/#use-the-same-cache-for-all-branches&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;変更する設定は以下です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;サイドメニューより、&lt;code&gt;Settings&lt;/code&gt; &amp;gt; &lt;code&gt;CI/CD&lt;/code&gt; を選択&lt;/li&gt;
&lt;li&gt;&lt;code&gt;General pipelines&lt;/code&gt; を開く&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Use separate caches for protected branches&lt;/code&gt; のチェックボックスをオフにする&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Save changes&lt;/code&gt; をクリックして保存&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://dev.to/zenika/gitlab-pages-preview-the-no-compromise-hack-to-serve-per-branch-pages-5599" target="_blank" rel="noopener"
 &gt;https://dev.to/zenika/gitlab-pages-preview-the-no-compromise-hack-to-serve-per-branch-pages-5599&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gist.github.com/donaldpipowitch/2590b20520b2cf6ae01aab4f7b55f8fa" target="_blank" rel="noopener"
 &gt;https://gist.github.com/donaldpipowitch/2590b20520b2cf6ae01aab4f7b55f8fa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gitlab-docs.creationline.com/ee/ci/caching/#use-the-same-cache-for-all-branches" target="_blank" rel="noopener"
 &gt;https://gitlab-docs.creationline.com/ee/ci/caching/#use-the-same-cache-for-all-branches&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] Windows コンテナを動かす</title><link>https://blog.ponkotools.com/posts/2023/11/21/docker-windows/</link><pubDate>Tue, 21 Nov 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/11/21/docker-windows/</guid><description>&lt;p&gt;Docker Desktop を使わずに、Windows 10 に Docker のバイナリを直接インストールして、Windows コンテナを動かすまでをやってみました。&lt;/p&gt;
&lt;p&gt;やり方は以下のドキュメントに記載されていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/engine/install/binaries/#install-server-and-client-binaries-on-windows" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/engine/install/binaries/#install-server-and-client-binaries-on-windows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;記載の通り、これで動かせるようになるのは Windows コンテナのみで、Linux コンテナは動かせません。&lt;br&gt;
Windows 上で Linux コンテナを動かしたい場合は、WSL を使う方法などがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/01/wsl2-ubuntu-docker.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/01/wsl2-ubuntu-docker.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Windows 10 Pro&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="windows-の機能の有効化"&gt;&lt;a href="#windows-%e3%81%ae%e6%a9%9f%e8%83%bd%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;Windows の機能の有効化
&lt;/h2&gt;&lt;p&gt;コントロールパネルの [Windows の機能の有効化または無効化] より、&lt;code&gt;コンテナ&lt;/code&gt; にチェックを入れます。&lt;br&gt;
これにチェックが入っていないと Docker コンテナが動きませんでした。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="270px" data-flex-grow="112" height="368" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2023/11/21/docker-windows/container.png" width="415"&gt;&lt;/p&gt;
&lt;p&gt;また、Hyper-V の有効化が必要という記事も見かけましたが、私の環境では Hyper-V を有効化しなくても動きました。&lt;br&gt;
Hyper-V については以下を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/reference/hyper-v-requirements" target="_blank" rel="noopener"
 &gt;https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/reference/hyper-v-requirements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール方法"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;インストール方法
&lt;/h2&gt;&lt;h3 id="バイナリのダウンロード"&gt;&lt;a href="#%e3%83%90%e3%82%a4%e3%83%8a%e3%83%aa%e3%81%ae%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;バイナリのダウンロード
&lt;/h3&gt;&lt;p&gt;以下からインストールしたい Docker のバージョンのバイナリファイルをダウンロードします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://download.docker.com/win/static/stable/x86_64/" target="_blank" rel="noopener"
 &gt;https://download.docker.com/win/static/stable/x86_64/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;現時点で最新の 24.0.7 をダウンロードしました。&lt;/p&gt;
&lt;h3 id="programfiles-への展開"&gt;&lt;a href="#programfiles-%e3%81%b8%e3%81%ae%e5%b1%95%e9%96%8b" class="header-anchor"&gt;&lt;/a&gt;ProgramFiles への展開
&lt;/h3&gt;&lt;p&gt;ダウンロードした zip を ProgramFiles に展開するため、PowerShell を管理者で起動して以下を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; Expand-Archive &amp;lt;ダウンロードした zip へのパス&amp;gt; -DestinationPath &lt;span class="nv"&gt;$Env&lt;/span&gt;:ProgramFiles
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;$Env:ProgramFiles&lt;/code&gt; は環境変数 &lt;code&gt;ProgramFiles&lt;/code&gt; を表示しており、通常は &lt;code&gt;C:\Program Files&lt;/code&gt; というパスになります。&lt;br&gt;
以降のコマンドは全て PowerShell で実行します。&lt;/p&gt;
&lt;h3 id="サービスへの登録"&gt;&lt;a href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%b8%e3%81%ae%e7%99%bb%e9%8c%b2" class="header-anchor"&gt;&lt;/a&gt;サービスへの登録
&lt;/h3&gt;&lt;p&gt;Docker をサービスへ登録します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;$Env&lt;/span&gt;:ProgramFiles&lt;span class="se"&gt;\D&lt;/span&gt;ocker&lt;span class="se"&gt;\d&lt;/span&gt;ockerd --register-service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;amp;&lt;/code&gt; は、PowerShell においてコマンドやスクリプトを呼び出す演算子です。&lt;br&gt;
従って、環境変数展開後の &lt;code&gt;C:\ProgramFiles\Docker\dockerd&lt;/code&gt; という文字列をコマンドとして実行しています。&lt;/p&gt;
&lt;h3 id="サービスの開始"&gt;&lt;a href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e9%96%8b%e5%a7%8b" class="header-anchor"&gt;&lt;/a&gt;サービスの開始
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; Start-Service docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="動作確認"&gt;&lt;a href="#%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;動作確認
&lt;/h3&gt;&lt;p&gt;Hello World イメージを動かしてみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;$Env&lt;/span&gt;:ProgramFiles&lt;span class="se"&gt;\D&lt;/span&gt;ocker&lt;span class="se"&gt;\d&lt;/span&gt;ocker run hello-world:nanoserver
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本的にはこれで上手くいくはずですが、プロキシ環境下の場合は、後述するプロキシ設定が必要になります。&lt;/p&gt;
&lt;h2 id="環境変数へパスを通す"&gt;&lt;a href="#%e7%92%b0%e5%a2%83%e5%a4%89%e6%95%b0%e3%81%b8%e3%83%91%e3%82%b9%e3%82%92%e9%80%9a%e3%81%99" class="header-anchor"&gt;&lt;/a&gt;環境変数へパスを通す
&lt;/h2&gt;&lt;p&gt;毎回 &lt;code&gt;&amp;amp;$Env:ProgramFiles\Docker\docker&lt;/code&gt; と打つのは面倒なため、&lt;code&gt;$env:ProgramFiles\docker\&lt;/code&gt; をPATHに追加します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;Environment&lt;span class="o"&gt;]&lt;/span&gt;::SetEnvironmentVariable&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Path&amp;#34;&lt;/span&gt;, &lt;span class="nv"&gt;$env&lt;/span&gt;:Path + &lt;span class="s2"&gt;&amp;#34;;&lt;/span&gt;&lt;span class="nv"&gt;$env&lt;/span&gt;&lt;span class="s2"&gt;:ProgramFiles\docker\&amp;#34;, [EnvironmentVariableTarget]::Machine)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PowerShell を一度閉じて、再度開きます。&lt;br&gt;
これで以下のように &lt;code&gt;docker&lt;/code&gt; と打つだけで実行できるようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; docker run hello-world:nanoserver
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="プロキシ設定"&gt;&lt;a href="#%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;プロキシ設定
&lt;/h2&gt;&lt;p&gt;プロキシ環境下では、プロキシサーバーの設定を行っていないと Docker イメージを pull できません。&lt;br&gt;
設定方法については以下に記載がありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/ja-jp/virtualization/windowscontainers/manage-docker/configure-docker-daemon" target="_blank" rel="noopener"
 &gt;https://learn.microsoft.com/ja-jp/virtualization/windowscontainers/manage-docker/configure-docker-daemon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;環境変数 &lt;code&gt;HTTP_PROXY&lt;/code&gt; &lt;code&gt;HTTPS_PROXY&lt;/code&gt; を設定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;Environment&lt;span class="o"&gt;]&lt;/span&gt;::SetEnvironmentVariable&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;HTTP_PROXY&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;http://&amp;lt;IP address&amp;gt;:&amp;lt;port&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;EnvironmentVariableTarget&lt;span class="o"&gt;]&lt;/span&gt;::Machine&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定後、Docker サービスを再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; Restart-Service docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="docker-クライアントのプロキシ設定"&gt;&lt;a href="#docker-%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2%e3%83%b3%e3%83%88%e3%81%ae%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;docker クライアントのプロキシ設定
&lt;/h3&gt;&lt;p&gt;Linux では &lt;code&gt;~/.docker/config.json&lt;/code&gt; に設定しますが、Windows では &lt;code&gt;%USERPROFILE%\.docker\config.json&lt;/code&gt; に設定します。&lt;/p&gt;
&lt;p&gt;以下のように設定しておくことで、Dockerfile のビルドを行う際に &lt;code&gt;--build-args&lt;/code&gt; などで都度プロキシの設定を行う必要がなくなります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;proxies&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;default&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;httpProxy&amp;#34;: &amp;#34;http://&amp;lt;IPアドレス&amp;gt;:&amp;lt;port&amp;gt;&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;httpsProxy&amp;#34;: &amp;#34;http://&amp;lt;IPアドレス&amp;gt;:&amp;lt;port&amp;gt;&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;noProxy&amp;#34;: &amp;#34;localhost,127.0.0.1,host.docker.internal&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もしかしたら、一度 Docker サービスを再起動する必要があるかもしれません。&lt;/p&gt;
&lt;h2 id="エラーが発生した場合"&gt;&lt;a href="#%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%8c%e7%99%ba%e7%94%9f%e3%81%97%e3%81%9f%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;エラーが発生した場合
&lt;/h2&gt;&lt;p&gt;次のようなエラーが発生した場合、Docker サービスが起動していないか、プロキシにより通信が通っていないかのどちらか可能性が高いです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Unable to find image &lt;span class="s1"&gt;&amp;#39;hello-world:nanoserver&amp;#39;&lt;/span&gt; locally
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker: Error response from daemon: Get &lt;span class="s2"&gt;&amp;#34;https://registry-1.docker.io/v2/&amp;#34;&lt;/span&gt;: net/http: request canceled &lt;span class="k"&gt;while&lt;/span&gt; waiting &lt;span class="k"&gt;for&lt;/span&gt; connection &lt;span class="o"&gt;(&lt;/span&gt;Client.Timeout exceeded &lt;span class="k"&gt;while&lt;/span&gt; awaiting headers&lt;span class="o"&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;See &lt;span class="s1"&gt;&amp;#39;docker run --help&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、次のようなエラーが発生した場合、[Windows の機能の有効化または無効化] で &lt;code&gt;コンテナ&lt;/code&gt; にチェックが入っていない可能性があります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker: Error response from daemon: hcs::CreateComputeSystem d5ccfe373c27d9053c87689f60075aed9acdca360d6cd42e1abdc5591bb60cbc: The request is not supported.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アンインストール"&gt;&lt;a href="#%e3%82%a2%e3%83%b3%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;アンインストール
&lt;/h2&gt;&lt;p&gt;サービスから Docker を削除します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;$Env&lt;/span&gt;:ProgramFiles&lt;span class="se"&gt;\D&lt;/span&gt;ocker&lt;span class="se"&gt;\d&lt;/span&gt;ockerd --unregister-service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これだけではまだ完全にサービスは削除されていないので、一度 OS を再起動します。&lt;br&gt;
その後、docker のフォルダを削除します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; Remove-item -Recurse &lt;span class="nv"&gt;$Env&lt;/span&gt;:ProgramFiles&lt;span class="se"&gt;\D&lt;/span&gt;ocker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アップデート"&gt;&lt;a href="#%e3%82%a2%e3%83%83%e3%83%97%e3%83%87%e3%83%bc%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;アップデート
&lt;/h2&gt;&lt;p&gt;現在のバージョンをアンインストールし、新しいバージョンをインストールします。&lt;/p&gt;
&lt;h2 id="余談他の-windows-コンテナを動かしてみた"&gt;&lt;a href="#%e4%bd%99%e8%ab%87%e4%bb%96%e3%81%ae-windows-%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%82%92%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f" class="header-anchor"&gt;&lt;/a&gt;余談：他の Windows コンテナを動かしてみた
&lt;/h2&gt;&lt;p&gt;python3.11 の Windows コンテナを動かしてみました。&lt;/p&gt;
&lt;p&gt;python イメージのタグ一覧が以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://hub.docker.com/_/python" target="_blank" rel="noopener"
 &gt;https://hub.docker.com/_/python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Windows コンテナをベースとしている python3.11 のイメージとして以下の２つがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3.11-windowsservercore-ltsc2022&lt;/li&gt;
&lt;li&gt;3.11-windowsservercore-1809&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;私の PC では、&lt;code&gt;3.11-windowsservercore-ltsc2022&lt;/code&gt; は動かず、&lt;code&gt;3.11-windowsservercore-1809&lt;/code&gt; は動きました。&lt;br&gt;
ベースとしている Windows コンテナの詳細は以下で確認できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://hub.docker.com/_/microsoft-windows-servercore" target="_blank" rel="noopener"
 &gt;https://hub.docker.com/_/microsoft-windows-servercore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ulvaniac.co.jp/2023/09/06/docker-desktop%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84windows%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E5%8B%95%E4%BD%9C%E6%96%B9%E6%B3%95/" target="_blank" rel="noopener"
 &gt;https://www.ulvaniac.co.jp/2023/09/06/docker-desktop%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84windows%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E5%8B%95%E4%BD%9C%E6%96%B9%E6%B3%95/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://and-engineer.com/articles/YcGZxhYAACUAbPjg" target="_blank" rel="noopener"
 &gt;https://and-engineer.com/articles/YcGZxhYAACUAbPjg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/SGTY/items/1126e0b95c35843fd8c5" target="_blank" rel="noopener"
 &gt;https://qiita.com/SGTY/items/1126e0b95c35843fd8c5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.shibata.tech/entry/2016/08/05/233212" target="_blank" rel="noopener"
 &gt;https://blog.shibata.tech/entry/2016/08/05/233212&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/ja-jp/virtualization/windowscontainers/manage-docker/configure-docker-daemon" target="_blank" rel="noopener"
 &gt;https://learn.microsoft.com/ja-jp/virtualization/windowscontainers/manage-docker/configure-docker-daemon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] docker-compose の --scale でコンテナを複製した際に、コンテナ側で何番目のコンテナなのかを判別したい</title><link>https://blog.ponkotools.com/posts/2023/11/14/docker/</link><pubDate>Tue, 14 Nov 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/11/14/docker/</guid><description>&lt;p&gt;本来、スケールは大きな負荷を処理できるようにするために使用し、スケールしたコンテナ毎に異なる構成を使用すべきではないと思いますが、それでも、スケールしたコンテナ毎にぞれぞれ別の構成が適用できると便利な場合もあります。
その場合、複製したコンテナ内で、自身が何番目のコンテナなのかを把握できるのが最も都合が良いと考えます。&lt;/p&gt;
&lt;p&gt;しかし、調べてみてもやり方が分からず、同様の質問はいくつか見つかりますが、現状、docker compose にはそのような機能は提供されていないようです。
その代わりに、docker swarm でタスクスロットを使うことで、コンテナの番号をコンテナ内に設定することができました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/service_create/" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/service_create/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="サンプル"&gt;&lt;a href="#%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;サンプル
&lt;/h2&gt;&lt;p&gt;以下のような docker-compose.yml を用意します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: &amp;#39;3&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; deploy:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; replicas: 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hostname: &amp;#34;server-{{.Task.Slot}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のコマンドでサービスを起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker swarm init # Swarmを初期化する（すでに初期化済みであれば不要）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker stack deploy -c docker-compose.yml my_stack
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker ps&lt;/code&gt; で確認すると、コンテナが3つ起動しているのが確認できます。&lt;br&gt;
ここで、3つのうちの1つのコンテナに入ってみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker exec -it &amp;lt;コンテナ名&amp;gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コンテナ内で hostname を確認すると、番号が振られていることが確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# echo $(hostname)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;尚、サービスを停止するには、以下のコマンドを使用します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker stack rm my_stack
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/service_create/" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/service_create/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.docker.com/t/how-to-identify-the-number-of-scaled-container/15041/11" target="_blank" rel="noopener"
 &gt;https://forums.docker.com/t/how-to-identify-the-number-of-scaled-container/15041/11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/docker/compose/issues/9153" target="_blank" rel="noopener"
 &gt;https://github.com/docker/compose/issues/9153&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Rocket.Chat 移行後にアップロードファイルの URL が古いままになっている</title><link>https://blog.ponkotools.com/posts/2023/10/19/rocketchat/</link><pubDate>Thu, 19 Oct 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/10/19/rocketchat/</guid><description>&lt;p&gt;Rocket.Chat を移行したのですが、アップロード済みファイルの URL と、サイト URL のリセット値が、移行前の古い URL のままになっていました。&lt;/p&gt;
&lt;h2 id="概要"&gt;&lt;a href="#%e6%a6%82%e8%a6%81" class="header-anchor"&gt;&lt;/a&gt;概要
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Rocket.Chat を移行し、ドメイン (サイトURL) が変わった&lt;/li&gt;
&lt;li&gt;その際、Rocket.Chatを 3.10.14 から 6.2.12 にアップグレードしている
&lt;ul&gt;
&lt;li&gt;MongoDB も 4.0 から 5.0 にアップグレード&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rocket.Chat 起動時に指定する環境変数 &lt;code&gt;ROOT_URL&lt;/code&gt; は移行後の URL を設定済み&lt;/li&gt;
&lt;li&gt;Rocket.Chat の管理者メニューで設定できる &lt;code&gt;サイト URL&lt;/code&gt; も移行後の URL を設定済み&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この状況で、以下の２つの不具合を確認しました。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;アップロード済みのファイルの URL (ダウンロードリンク) が移行前の古い URL になっている&lt;/li&gt;
&lt;li&gt;Rocket.Chat の管理者メニューで設定できる &lt;code&gt;サイト URL&lt;/code&gt; について、リセットボタンを押すと移行前の古い URL がセットされる&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="先に結論"&gt;&lt;a href="#%e5%85%88%e3%81%ab%e7%b5%90%e8%ab%96" class="header-anchor"&gt;&lt;/a&gt;先に結論
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;1.&lt;/code&gt; については MongoDB のデータを直接修正すれば直りました。&lt;br&gt;
&lt;code&gt;2.&lt;/code&gt; については未解決です。&lt;/p&gt;
&lt;h3 id="mongodb-のデータを確認することにしたきっかけ"&gt;&lt;a href="#mongodb-%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8%e3%81%ab%e3%81%97%e3%81%9f%e3%81%8d%e3%81%a3%e3%81%8b%e3%81%91" class="header-anchor"&gt;&lt;/a&gt;MongoDB のデータを確認することにしたきっかけ
&lt;/h3&gt;&lt;p&gt;いろいろググっていく中で以下のページに辿り着きました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ryadel.com/en/rocket-chat-change-root_url-site-url-rocketchat/" target="_blank" rel="noopener"
 &gt;https://www.ryadel.com/en/rocket-chat-change-root_url-site-url-rocketchat/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こちらの方法を試しても今回発生している不具合は直りませんでしたが、これをきっかけに MongoDB の中身を調査していくことで修正できました。&lt;/p&gt;
&lt;p&gt;MongoDB の中身の確認方法については以下が参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.mtioutput.com/entry/2019/02/21/180000" target="_blank" rel="noopener"
 &gt;https://www.mtioutput.com/entry/2019/02/21/180000&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/dev/serial/01/mongodb/0003" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/dev/serial/01/mongodb/0003&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="調査の過程と修正方法"&gt;&lt;a href="#%e8%aa%bf%e6%9f%bb%e3%81%ae%e9%81%8e%e7%a8%8b%e3%81%a8%e4%bf%ae%e6%ad%a3%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;調査の過程と修正方法
&lt;/h2&gt;&lt;p&gt;Rocket.Chat と MongoDB は docker で動かしています。&lt;br&gt;
なので、まず MongoDB の docker コンテナに入ります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it rocketchat-mongo bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コンテナに入ったら MongoDB シェルを開き、&lt;code&gt;rocketchat&lt;/code&gt; のデータベースを選択します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# mongo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; use rocketchat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コレクションを表示してみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; show collections
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;たくさん表示されますが、ここから不具合内容に該当する箇所を推測して調査していきます。&lt;/p&gt;
&lt;h2 id="1-アップロードファイルのダウンロードリンクについて"&gt;&lt;a href="#1-%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89%e3%83%aa%e3%83%b3%e3%82%af%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6" class="header-anchor"&gt;&lt;/a&gt;1. アップロードファイルのダウンロードリンクについて
&lt;/h2&gt;&lt;p&gt;前述の &lt;code&gt;1.&lt;/code&gt; についてですが、こちらはアップロードファイルに関することなので、&lt;code&gt;rocketchat_uploads&lt;/code&gt; の中身を表示してみました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; db.rocketchat_uploads.find&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;20件のみ表示されますが、適当なデータ一件について中身をみると以下のような感じになっていました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;27JzjqpXHxAHBzaxp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hoge.jpg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;size&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;51268&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;image/jpeg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;rid&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MgKrXXN4XmQwtMMjgjXnWzpNvR6YrRpH4F&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;userId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;jXnWzpNvR6YrRpH4F&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;store&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;GridFS:Uploads&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;_updatedAt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;ISODate(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2023-07-26T03:58:50.233Z&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;instanceId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;R252ARSHBKR3RrXHY&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;identify&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;format&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;jpeg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;size&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;width&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;495&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;height&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;700&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;complete&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;etag&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HoMjiYj2fbb799RFK&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/ufs/GridFS:Uploads/27JzjqpXHxAHBzaxp/%E5%90%8D%E7%A7%B0%E6%9C%AA%E8%A8%AD%E5%AE%9A%201.jpg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;progress&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;68c8A8CAb8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;uploadedAt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;ISODate(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2023-07-26T03:58:50.852Z&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;uploading&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://old_domain:port/ufs/GridFS:Uploads/27JzjqpXHxAHBzaxp/%E5%90%8D%E7%A7%B0%E6%9C%AA%E8%A8%AD%E5%AE%9A%201.jpg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;typeGroup&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;image&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;見てわかる通り、&lt;code&gt;url&lt;/code&gt; のフィールドにファイルへの絶対パスが記録されているため、これを修正しないと直らないんじゃないかと思いました。&lt;/p&gt;
&lt;p&gt;というわけで、以下のコマンドでドメインの部分のみを置換します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;db.rocketchat_uploads.find&lt;span class="o"&gt;()&lt;/span&gt;.forEach&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;row&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; row.url &lt;span class="o"&gt;=&lt;/span&gt; row.url.replace&lt;span class="o"&gt;(&lt;/span&gt;new RegExp&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;old_domain&amp;#34;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;g&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;new_domain&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; db.rocketchat_uploads.save&lt;span class="o"&gt;(&lt;/span&gt;row&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで Rocket.Chat のほうを確認すると、URL が直っていました。&lt;/p&gt;
&lt;h2 id="2-サイト-url-のリセット値について"&gt;&lt;a href="#2-%e3%82%b5%e3%82%a4%e3%83%88-url-%e3%81%ae%e3%83%aa%e3%82%bb%e3%83%83%e3%83%88%e5%80%a4%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6" class="header-anchor"&gt;&lt;/a&gt;2. サイト URL` のリセット値について
&lt;/h2&gt;&lt;p&gt;次に前述の &lt;code&gt;2.&lt;/code&gt; についてですが、設定に関することなので &lt;code&gt;rocketchat_settings&lt;/code&gt; を確認してみました。
こちらはついては中身を全てを見たかったので、以下のようにして json ファイルに出力して確認しました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mongoexport -d rocketchat -c rocketchat_settings -o rocketchat_settings.json --type&lt;span class="o"&gt;=&lt;/span&gt;json mongodb://localhost:27017
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;で、中身を確認してみましたが、それらしい設定は見当たりませんでした。&lt;br&gt;
他のコレクションもいろいろ確認してみましたが、それらしい設定は見つかっていません。&lt;/p&gt;
&lt;p&gt;というわけで未解決ですが、特に実害はないので放っておいてます。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ryadel.com/en/rocket-chat-change-root_url-site-url-rocketchat/" target="_blank" rel="noopener"
 &gt;https://www.ryadel.com/en/rocket-chat-change-root_url-site-url-rocketchat/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.mtioutput.com/entry/2019/02/21/180000" target="_blank" rel="noopener"
 &gt;https://www.mtioutput.com/entry/2019/02/21/180000&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/dev/serial/01/mongodb/0003" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/dev/serial/01/mongodb/0003&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Rocket.Chat のアップグレード手順</title><link>https://blog.ponkotools.com/posts/2023/10/11/rocketchat/</link><pubDate>Wed, 11 Oct 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/10/11/rocketchat/</guid><description>&lt;p&gt;アップグレード手順については以下に記載されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.rocket.chat/deploy/deploy-rocket.chat/updating-rocket.chat" target="_blank" rel="noopener"
 &gt;https://docs.rocket.chat/deploy/deploy-rocket.chat/updating-rocket.chat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;アップグレードのフローが以下になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://whimsical.com/upgrade-version-path-rocket-chat-51eoS7aUunTan5wLt2CBHU" target="_blank" rel="noopener"
 &gt;https://whimsical.com/upgrade-version-path-rocket-chat-51eoS7aUunTan5wLt2CBHU&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これに従ってアップデートしますが、いくつかはまったポイントがありました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;p&gt;アップグレード前のバージョンは以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rocket.Chat Version: 3.10.4&lt;/li&gt;
&lt;li&gt;NodeJS Version: 12.18.4 - x64&lt;/li&gt;
&lt;li&gt;MongoDB Version: 4.0.28&lt;/li&gt;
&lt;li&gt;MongoDB Engine: wiredTiger&lt;/li&gt;
&lt;li&gt;Platform: linux&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rocket.Chat も MongoDB も docker で動かしています。&lt;/p&gt;
&lt;h2 id="rocketchat-3187-へのアップグレード"&gt;&lt;a href="#rocketchat-3187-%e3%81%b8%e3%81%ae%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;Rocket.Chat 3.18.7 へのアップグレード
&lt;/h2&gt;&lt;p&gt;現在のバージョンが 3.10.4 なので、3系の最新の 3.18.7 にアップグレードしました。&lt;br&gt;
すると、データベースバージョンのエラーが表示されたました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; ERROR! SERVER STOPPED &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Your database migration failed: &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Start date cannot be later than expire date &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Please make sure you are running the latest version and try again. &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; If the problem persists, please contact support. &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; This Rocket.Chat version: 3.18.7 &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Database locked at version: &lt;span class="m"&gt;213&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Database target version: &lt;span class="m"&gt;232&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Commit: 660c9f5e896982932e1d02d35ddd6013c6b03e11 &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Date: Mon May &lt;span class="m"&gt;30&lt;/span&gt; 19:06:57 &lt;span class="m"&gt;2022&lt;/span&gt; -0300 &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Branch: HEAD &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Tag: 3.18.7 &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;対策は以下に書いてありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://martinschoeler.github.io/docs/administrator-guides/database-migration/" target="_blank" rel="noopener"
 &gt;https://martinschoeler.github.io/docs/administrator-guides/database-migration/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MongoDB のコンテナに入り、以下のコマンドを実行してバージョンを強制的に一つ上げます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mongo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; use rocketchat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; db.migrations.update({_id: &amp;#39;control&amp;#39;},{$set:{locked:false,version:231}})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで Rocket.Chat を再起動すれば OK でした。&lt;/p&gt;
&lt;h2 id="rocketchat-3187-から-487-へのアップグレード"&gt;&lt;a href="#rocketchat-3187-%e3%81%8b%e3%82%89-487-%e3%81%b8%e3%81%ae%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;Rocket.Chat 3.18.7 から 4.8.7 へのアップグレード
&lt;/h2&gt;&lt;p&gt;次に4系の最新の 4.8.7 にアップグレードしました。&lt;br&gt;
これはすんなりいきました。&lt;/p&gt;
&lt;h2 id="mongodb-のアップグレード"&gt;&lt;a href="#mongodb-%e3%81%ae%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;MongoDB のアップグレード
&lt;/h2&gt;&lt;p&gt;上記のフローによれば、Rocket.Chat を5系にアップグレードする前に、MongoDB を 5.0 以上までアップグレードする必要があります。&lt;br&gt;
方法については以下に記載されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.growi.org/ja/admin-guide/admin-cookbook/upgrade-mongodb.html" target="_blank" rel="noopener"
 &gt;https://docs.growi.org/ja/admin-guide/admin-cookbook/upgrade-mongodb.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mongodb-40-から-42-へのアップグレード"&gt;&lt;a href="#mongodb-40-%e3%81%8b%e3%82%89-42-%e3%81%b8%e3%81%ae%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;MongoDB 4.0 から 4.2 へのアップグレード
&lt;/h3&gt;&lt;p&gt;現在のバージョンが 4.0 なので、まずは 4.2 にアップグレードしました。
これはすんなりいきました。&lt;/p&gt;
&lt;h3 id="mongodb-42-から-44-へのアップグレード"&gt;&lt;a href="#mongodb-42-%e3%81%8b%e3%82%89-44-%e3%81%b8%e3%81%ae%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;MongoDB 4.2 から 4.4 へのアップグレード
&lt;/h3&gt;&lt;p&gt;次に 4.4 にアップグレードしたところ、以下のようなエラーとなりました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{&amp;#34;t&amp;#34;:{&amp;#34;$date&amp;#34;:&amp;#34;2023-10-13T00:38:13.842+00:00&amp;#34;},&amp;#34;s&amp;#34;:&amp;#34;W&amp;#34;, &amp;#34;c&amp;#34;:&amp;#34;STORAGE&amp;#34;, &amp;#34;id&amp;#34;:22347, &amp;#34;ctx&amp;#34;:&amp;#34;initandlisten&amp;#34;,&amp;#34;msg&amp;#34;:&amp;#34;Failed to start up WiredTiger under any compatibility version. This may be due to an unsupported upgrade or downgrade.&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{&amp;#34;t&amp;#34;:{&amp;#34;$date&amp;#34;:&amp;#34;2023-10-13T00:38:13.842+00:00&amp;#34;},&amp;#34;s&amp;#34;:&amp;#34;F&amp;#34;, &amp;#34;c&amp;#34;:&amp;#34;STORAGE&amp;#34;, &amp;#34;id&amp;#34;:28595, &amp;#34;ctx&amp;#34;:&amp;#34;initandlisten&amp;#34;,&amp;#34;msg&amp;#34;:&amp;#34;Terminating.&amp;#34;,&amp;#34;attr&amp;#34;:{&amp;#34;reason&amp;#34;:&amp;#34;95: Operation not supported&amp;#34;}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{&amp;#34;t&amp;#34;:{&amp;#34;$date&amp;#34;:&amp;#34;2023-10-13T00:38:13.842+00:00&amp;#34;},&amp;#34;s&amp;#34;:&amp;#34;F&amp;#34;, &amp;#34;c&amp;#34;:&amp;#34;-&amp;#34;, &amp;#34;id&amp;#34;:23091, &amp;#34;ctx&amp;#34;:&amp;#34;initandlisten&amp;#34;,&amp;#34;msg&amp;#34;:&amp;#34;Fatal assertion&amp;#34;,&amp;#34;attr&amp;#34;:{&amp;#34;msgid&amp;#34;:28595,&amp;#34;file&amp;#34;:&amp;#34;src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp&amp;#34;,&amp;#34;line&amp;#34;:958}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{&amp;#34;t&amp;#34;:{&amp;#34;$date&amp;#34;:&amp;#34;2023-10-13T00:38:13.843+00:00&amp;#34;},&amp;#34;s&amp;#34;:&amp;#34;F&amp;#34;, &amp;#34;c&amp;#34;:&amp;#34;-&amp;#34;, &amp;#34;id&amp;#34;:23092, &amp;#34;ctx&amp;#34;:&amp;#34;initandlisten&amp;#34;,&amp;#34;msg&amp;#34;:&amp;#34;\n\n***aborting after fassert() failure\n\n&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MongoDB を 4.2 に戻してコンテナに入り、以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mongo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; db.adminCommand( { setFeatureCompatibilityVersion: &amp;#34;4.2&amp;#34; } )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで Rocket.Chat を再起動すれば OK でした。&lt;/p&gt;
&lt;h3 id="mongodb-44-から-50-へのアップグレード"&gt;&lt;a href="#mongodb-44-%e3%81%8b%e3%82%89-50-%e3%81%b8%e3%81%ae%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;MongoDB 4.4 から 5.0 へのアップグレード
&lt;/h3&gt;&lt;p&gt;次に 5.0 にアップグレードしたところ、同様のエラーとなりました。&lt;br&gt;
MongoDB を 4.4 に戻してコンテナに入り、以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mongo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; db.adminCommand( { setFeatureCompatibilityVersion: &amp;#34;4.4&amp;#34; } )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで Rocket.Chat を再起動すれば OK でした。&lt;/p&gt;
&lt;h2 id="rocketchat-487-から-5410-へのアップグレード"&gt;&lt;a href="#rocketchat-487-%e3%81%8b%e3%82%89-5410-%e3%81%b8%e3%81%ae%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;Rocket.Chat 4.8.7 から 5.4.10 へのアップグレード
&lt;/h2&gt;&lt;p&gt;MongoDB を 5.0 までアップグレードしたので、次は Rocket.Chat を5系の最新の 5.4.10 にアップグレードしました。&lt;br&gt;
すると以下のエラーが表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/app/bundle/programs/server/node_modules/fibers/future.js:313
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; throw(ex);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MongoServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Timeout._onTimeout (/app/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/sdam/topology.js:312:38)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at listOnTimeout (internal/timers.js:557:17)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at processTimers (internal/timers.js:500:7) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reason: TopologyDescription {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; type: &amp;#39;ReplicaSetNoPrimary&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; servers: Map(1) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#39;localhost:27017&amp;#39; =&amp;gt; ServerDescription {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; _hostAddress: HostAddress { isIPv6: false, host: &amp;#39;localhost&amp;#39;, port: 27017 },
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; address: &amp;#39;localhost:27017&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; type: &amp;#39;Unknown&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hosts: [],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; passives: [],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; arbiters: [],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tags: {},
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; minWireVersion: 0,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; maxWireVersion: 0,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; roundTripTime: -1,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lastUpdateTime: 17764280,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lastWriteDate: 0,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; error: MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at connectionFailureError (/app/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/cmap/connect.js:381:20)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Socket.&amp;lt;anonymous&amp;gt; (/app/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb/lib/cmap/connect.js:301:22)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Object.onceWrapper (events.js:520:26)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Socket.emit (events.js:400:28)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at emitErrorNT (internal/streams/destroy.js:106:8)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at emitErrorCloseNT (internal/streams/destroy.js:74:3)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at processTicksAndRejections (internal/process/task_queues.js:82:21)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stale: false,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; compatible: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; heartbeatFrequencyMS: 10000,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; localThresholdMS: 15,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; setName: &amp;#39;rs0&amp;#39;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; maxSetVersion: 2,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; maxElectionId: ObjectId {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [Symbol(id)]: Buffer(12) [Uint8Array] [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 127, 255, 255, 255, 0,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 0, 0, 0, 0, 0,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 0, 10
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; commonWireVersion: 13,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; logicalSessionTimeoutMinutes: undefined
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解決策は以下にありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/RocketChat/Rocket.Chat/releases/tag/5.0.0" target="_blank" rel="noopener"
 &gt;https://github.com/RocketChat/Rocket.Chat/releases/tag/5.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;環境変数 &lt;code&gt;MONGO_URL&lt;/code&gt; &lt;code&gt;MONGO_OPLOG_URL&lt;/code&gt; に &lt;code&gt;directConnection=true&lt;/code&gt; を追加します。&lt;br&gt;
例えば、&lt;code&gt;MONGO_URL=mongodb://mongo/rocketchat?replicaSet=rs0&amp;amp;directConnection=true&lt;/code&gt; のような感じです。&lt;/p&gt;
&lt;p&gt;これで Rocket.Chat を再起動すれば OK でした。&lt;/p&gt;
&lt;h2 id="rocketchat-を最新にアップデート"&gt;&lt;a href="#rocketchat-%e3%82%92%e6%9c%80%e6%96%b0%e3%81%ab%e3%82%a2%e3%83%83%e3%83%97%e3%83%87%e3%83%bc%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;Rocket.Chat を最新にアップデート
&lt;/h2&gt;&lt;p&gt;最後に、Rocket.Chat を現在の最新バージョンである 6.3.9 にアップグレードしました。
以上で完了です。&lt;/p&gt;</description></item><item><title>YAML のアンカー/エイリアスと docker compose の profiles を使って docker-compose.yml を作成する</title><link>https://blog.ponkotools.com/posts/2023/08/25/yaml/</link><pubDate>Fri, 25 Aug 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/08/25/yaml/</guid><description>&lt;p&gt;github などで公開されている docker-compose.yml を見ていると、見慣れない表記を見かけることがあり、調べてみると YAML のアンカー/エイリアス機能であることがわかりました。&lt;/p&gt;
&lt;p&gt;これと、docker compose の &lt;code&gt;--profiles&lt;/code&gt; を組み合わせて、&lt;code&gt;docker-compose.yml&lt;/code&gt; 一つで様々な環境で動かすことができるようにしているのを見るととても便利だなと思ったので、メモしておきます。&lt;/p&gt;
&lt;h2 id="yaml-のアンカーとエイリアス"&gt;&lt;a href="#yaml-%e3%81%ae%e3%82%a2%e3%83%b3%e3%82%ab%e3%83%bc%e3%81%a8%e3%82%a8%e3%82%a4%e3%83%aa%e3%82%a2%e3%82%b9" class="header-anchor"&gt;&lt;/a&gt;yaml のアンカーとエイリアス
&lt;/h2&gt;&lt;p&gt;yaml 自体の標準機能です。&lt;br&gt;
これを使うことで、記述内容を共通化して DRY にできます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アンカー: &lt;code&gt;&amp;amp;&lt;/code&gt; を付けることで、他の場所でも参照できるようにします。&lt;/li&gt;
&lt;li&gt;エイリアス: &lt;code&gt;*&lt;/code&gt; を付けて、アンカーで定義した内容を参照します。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;サンプル1&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;aaa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;&amp;amp;hoge&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ddd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*hoge&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の場合、以下の様に展開されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;aaa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ddd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;サンプル2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;アンカー内にアンカーがあっても問題ありません。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;aaa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;&amp;amp;hoge&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;&amp;amp;piyo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ddd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*hoge&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;eee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*piyo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の場合、以下の様に展開されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;aaa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ddd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;eee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="マージ"&gt;&lt;a href="#%e3%83%9e%e3%83%bc%e3%82%b8" class="header-anchor"&gt;&lt;/a&gt;マージ
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;&amp;lt;&amp;lt;:&lt;/code&gt; と記述することで、アンカーで定義した内容をそのまま入れ込むことができます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;aaa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;&amp;amp;hoge&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ddd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*hoge&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;eee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3333&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の場合、以下の様に展開されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;aaa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ddd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;eee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3333&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="アンカーの上書き"&gt;&lt;a href="#%e3%82%a2%e3%83%b3%e3%82%ab%e3%83%bc%e3%81%ae%e4%b8%8a%e6%9b%b8%e3%81%8d" class="header-anchor"&gt;&lt;/a&gt;アンカーの上書き
&lt;/h3&gt;&lt;p&gt;アンカー名と同じキーが後にあった場合、上書きされます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;aaa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;&amp;amp;hoge&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ddd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3333&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;eee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*hoge&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4444&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;fff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*hoge&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ddd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5555&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記は以下のように展開されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;aaa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ddd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3333&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;eee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4444&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ddd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3333&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;fff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bbb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1111&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2222&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ddd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5555&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを使って、内容の大部分を共通化しつつ一部分だけは変えたいということができます。&lt;/p&gt;
&lt;h3 id="docker-composeyml-で使用する場合"&gt;&lt;a href="#docker-composeyml-%e3%81%a7%e4%bd%bf%e7%94%a8%e3%81%99%e3%82%8b%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml で使用する場合
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; 内で共通の設定を括りだそうと以下の様に書くとエラーになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;common: &amp;amp;common
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: hoge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;service:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; app:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;&amp;lt;: *common
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;docker compose によって &lt;code&gt;common&lt;/code&gt; 自体が解釈されるためです。&lt;br&gt;
この場合、プレフィックスとして &lt;code&gt;x-&lt;/code&gt; を付けると、docker compose からは無視されるようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x-common: &amp;amp;common
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: hoge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;service:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; app:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;&amp;lt;: *x-common
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-compose-の-profile"&gt;&lt;a href="#docker-compose-%e3%81%ae-profile" class="header-anchor"&gt;&lt;/a&gt;docker compose の profile
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; で定義されたサービスに profiles を定義することで、サービスのグループ分けやタグ付けのようなことができます。&lt;br&gt;
以下が公式ドキュメントによる説明です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.jp/compose/profiles.html" target="_blank" rel="noopener"
 &gt;https://docs.docker.jp/compose/profiles.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;profiles で指定したサービスのみを起動させることができるようになります。&lt;/p&gt;
&lt;h2 id="上記を踏まえた実用的なサンプル"&gt;&lt;a href="#%e4%b8%8a%e8%a8%98%e3%82%92%e8%b8%8f%e3%81%be%e3%81%88%e3%81%9f%e5%ae%9f%e7%94%a8%e7%9a%84%e3%81%aa%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;上記を踏まえた実用的なサンプル
&lt;/h2&gt;&lt;p&gt;上記を踏まえると、yaml のアンカー/エイリアスにより記述内容を共通化しつつ、profile によって起動するコンテナを切り替えることができます。&lt;/p&gt;
&lt;p&gt;尚、今回の記事を書くことになった動機が、以下の Stable Diffusion 用の docker-compose.yml を見たときで、どういう意味なんだろうと思ったのがきっかけです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/AbdBarho/stable-diffusion-webui-docker" target="_blank" rel="noopener"
 &gt;https://github.com/AbdBarho/stable-diffusion-webui-docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GPU を使う場合と、CPU を使う場合とで上手く共通化されており、また記述量も少なくサンプルとして丁度いいので、こちらをサンプルとして挙げさせていただきます。&lt;/p&gt;
&lt;h2 id="docker-composeyml-の確認"&gt;&lt;a href="#docker-composeyml-%e3%81%ae%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml の確認
&lt;/h2&gt;&lt;p&gt;ちなみに、docker compose によってどのように yaml ファイルが読み込まれるか確認するには、config オプションを使用します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker compose config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://genzouw.com/entry/2021/06/19/082626/2661/#" target="_blank" rel="noopener"
 &gt;https://genzouw.com/entry/2021/06/19/082626/2661/#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.jp/compose/profiles.html" target="_blank" rel="noopener"
 &gt;https://docs.docker.jp/compose/profiles.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://techracho.bpsinc.jp/hachi8833/2020_02_07/87447" target="_blank" rel="noopener"
 &gt;https://techracho.bpsinc.jp/hachi8833/2020_02_07/87447&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>systemd で環境変数を展開する</title><link>https://blog.ponkotools.com/posts/2023/06/14/systemd/</link><pubDate>Wed, 14 Jun 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/06/14/systemd/</guid><description>&lt;p&gt;環境変数を参照する Python アプリを systemd でサービス化したときにかなりはまってしまいました。&lt;/p&gt;
&lt;p&gt;systemd はユーザーの環境変数を参照しないようなので、ユニット定義ファイルで環境変数を設定する必要があるそうで、&lt;code&gt;Environment&lt;/code&gt; で記述したり、外部ファイルに定義して &lt;code&gt;EnvironmentFile&lt;/code&gt; で読み込む方法があるようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://note.com/meiburg/n/n5cd098a8c744" target="_blank" rel="noopener"
 &gt;https://note.com/meiburg/n/n5cd098a8c744&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yasushi-jp/items/97057509e96919c35f64" target="_blank" rel="noopener"
 &gt;https://qiita.com/yasushi-jp/items/97057509e96919c35f64&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、上記だと変数を展開することができないので、そのような場合には以下のように &lt;code&gt;ExecStartPre&lt;/code&gt; で &lt;code&gt;systemctl&lt;/code&gt; の &lt;code&gt;set-environment&lt;/code&gt; を使う方法などがあるようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kobanyan/items/f8e8a3bd5406e1d290fb" target="_blank" rel="noopener"
 &gt;https://qiita.com/kobanyan/items/f8e8a3bd5406e1d290fb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただ、今回の私の場合は、シェル変数 &lt;code&gt;HOSTNAME&lt;/code&gt; を環境変数に export して参照したかったのですが、systemd にはホスト名を表す特殊な変数として &lt;code&gt;%H&lt;/code&gt; があるようなので、これを使って以下のようにすれば解決できました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Description=My Python App
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ExecStart=/path/to/your/python/app.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Environment=&amp;#34;HOSTNAME=%H&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ja.stackoverflow.com/questions/62360/systemd-%E3%81%8B%E3%82%89%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%ABhome%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%84" target="_blank" rel="noopener"
 &gt;https://ja.stackoverflow.com/questions/62360/systemd-%E3%81%8B%E3%82%89%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%ABhome%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%84&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kobanyan/items/f8e8a3bd5406e1d290fb" target="_blank" rel="noopener"
 &gt;https://qiita.com/kobanyan/items/f8e8a3bd5406e1d290fb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/37864999/referencing-other-environment-variables-in-systemd" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/37864999/referencing-other-environment-variables-in-systemd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Telegraf で Jetson の GPU 情報を取得する</title><link>https://blog.ponkotools.com/posts/2023/05/27/telegraf/</link><pubDate>Sat, 27 May 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/05/27/telegraf/</guid><description>&lt;p&gt;Telegraf で GPU 情報を取得しよううとしたのですが、Jetson には &lt;code&gt;nvidia-smi&lt;/code&gt; のコマンドがありません。&lt;/p&gt;
&lt;p&gt;どうしようかなと思っていたら、以下の記事に Jetson で GPU 情報を取得する方法が書いてありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.influxdata.com/blog/nvidia-jetson-series-part-1-jetson-stats/" target="_blank" rel="noopener"
 &gt;https://www.influxdata.com/blog/nvidia-jetson-series-part-1-jetson-stats/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これを参考に、InfluxDB にデータを保存し、Grafana で可視化まで行いました。&lt;br&gt;
尚、TIG Stack (Telegraf, InfluxDB, Grafana) については以下を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2021/12/telegraf-influxdb-garafana.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2021/12/telegraf-influxdb-garafana.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Jetson Xavier NX&lt;/li&gt;
&lt;li&gt;Ubuntu 18.04&lt;/li&gt;
&lt;li&gt;Telegraf 1.23.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Telegraf, InfluxDB, Grafana は Docker で動作させています。&lt;/p&gt;
&lt;h2 id="jetson-stats-のインストール"&gt;&lt;a href="#jetson-stats-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;Jetson Stats のインストール
&lt;/h2&gt;&lt;p&gt;まずはホストに Jetson Stats をインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install python3-pip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo -H python3 -m pip install -U jetson-stats
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インストール後、一度ログアウト or 再起動します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;jtop&lt;/code&gt; を実行して動作確認します。&lt;/p&gt;
&lt;h2 id="telegraf-の設定"&gt;&lt;a href="#telegraf-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Telegraf の設定
&lt;/h2&gt;&lt;p&gt;Jetson Stats を使って GPU の情報を取得する python スクリプトを作成し、それを Telegraf から定期的に実行するようにします。&lt;br&gt;
ただし、今回 Telegraf は Docker コンテナで動かしているので、上記の記事そのままでは上手く行きません。&lt;/p&gt;
&lt;h3 id="python-スクリプトの作成"&gt;&lt;a href="#python-%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Python スクリプトの作成
&lt;/h3&gt;&lt;p&gt;上記の記事にある以下のスクリプトを &lt;code&gt;jetson_stats.py&lt;/code&gt; という名前で保存しました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Import jtop python library. We will use this to access the Jetson_Stats service.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;jtop&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;jtop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;jtop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;jetson&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# jetson.stats provides our system measurements as type dict.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jetson&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# time and uptime are proved as time objects. These needed to be converted before passing as a JSON string,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%m/&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt;/%Y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# We then convert our dict -&amp;amp;gt; Json string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;influx_json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;jetson&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;influx_json&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このスクリプトを Telegraf から定期的に実行することになります。&lt;/p&gt;
&lt;h3 id="dockerfile-の作成"&gt;&lt;a href="#dockerfile-%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Dockerfile の作成
&lt;/h3&gt;&lt;p&gt;今までは Telegraf の Docker イメージをそのまま使っていましたが、このコンテナには Python の実行環境が入っていないため、上記の Python スクリプトを動かすことができません。&lt;br&gt;
そこで、以下のような Dockerfile を作成しました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;1.23&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ARG&lt;/span&gt; &lt;span class="n"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;noninteractive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;COPY&lt;/span&gt; &lt;span class="n"&gt;jetson_stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;recommends&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;python3&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setuptools&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wheel&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;autoremove&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;rm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rf&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;/*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;pip3&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;jetson&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;jetson_stats.py&lt;/code&gt; をイメージ内にコピーし、あとは Python の実行環境と Jetson Stats をインストールしています。&lt;/p&gt;
&lt;h3 id="docker-composeyml-の変更"&gt;&lt;a href="#docker-composeyml-%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml の変更
&lt;/h3&gt;&lt;p&gt;コンテナ内で Jetson Stats を使うためには、&lt;code&gt;/run/jtop.sock&lt;/code&gt; をマウントする必要があるようです。&lt;br&gt;
ただ、それだけではアクセス権限の関係で以下のようなエラーが表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jtop.core.exceptions.JtopException: I can&amp;#39;t access jetson_stats.service.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker コンテナの実行ユーザーを &lt;code&gt;/run/jtop.sock&lt;/code&gt; の所有グループに加えたら解決できたので、&lt;code&gt;group_add&lt;/code&gt; のプロパティを追加します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/rbonghi/jetson_stats" target="_blank" rel="noopener"
 &gt;https://github.com/rbonghi/jetson_stats&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上を踏まえ、docker-compose.yml を以下のように変更しました（今回に関連する部分のみ抜粋）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;telegraf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;HOSTNAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;NVIDIA_VISIBLE_DEVICES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;NVIDIA_DRIVER_CAPABILITIES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;reservations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;gpu&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unless&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;stopped&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;6514&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6514&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nvidia&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;smi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nvidia&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;smi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 以下は Jetson Xavier NX 用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jtop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jtop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ro&lt;/span&gt; &lt;span class="c1"&gt;# https://github.com/rbonghi/jetson_stats&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;TELEGRAF_UID_GID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;group_add&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${JTOP_GID:?}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="環境変数の追加"&gt;&lt;a href="#%e7%92%b0%e5%a2%83%e5%a4%89%e6%95%b0%e3%81%ae%e8%bf%bd%e5%8a%a0" class="header-anchor"&gt;&lt;/a&gt;環境変数の追加
&lt;/h3&gt;&lt;p&gt;上記の docker-compose.yml 内にある &lt;code&gt;JTOP_GID&lt;/code&gt; という環境変数を定義します。&lt;br&gt;
&lt;code&gt;~/.bashrc&lt;/code&gt; に以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;JTOP_GID&lt;/span&gt;&lt;span class="o"&gt;=$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%g&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jtop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再読み込みします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~$ &lt;span class="nb"&gt;source&lt;/span&gt; .bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで、&lt;code&gt;/run/jtop.sock&lt;/code&gt; の所有グループを &lt;code&gt;JTOP_GID&lt;/code&gt; で参照できます。&lt;/p&gt;
&lt;h3 id="telegrafconf-の設定"&gt;&lt;a href="#telegrafconf-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;telegraf.conf の設定
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;telegraf.conf&lt;/code&gt; に以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[[inputs.exec]]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ## Commands array
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; commands = [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;python3 /usr/local/bin/jetson_stats.py&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ## Timeout for each command to complete.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; timeout = &amp;#34;5s&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ## measurement name suffix (for separating different commands)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name_suffix = &amp;#34;_jetson_stats&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ## Data format to consume.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ## Each data format has its own unique set of configuration options, read
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ## more about them here:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; data_format = &amp;#34;json&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ## Array of glob pattern strings or booleans keys that should be added as string fields.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; json_string_fields = [&amp;#34;jetson_uptime&amp;#34;, &amp;#34;jetson_nvp model&amp;#34;, &amp;#34;jetson_NVENC&amp;#34;, &amp;#34;jetson_NVDEC&amp;#34;, &amp;#34;jetson_NVJPG&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;内容は前述の参考記事の中身そのままです。&lt;/p&gt;
&lt;h3 id="テスト"&gt;&lt;a href="#%e3%83%86%e3%82%b9%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;テスト
&lt;/h3&gt;&lt;p&gt;Docker コンテナに入って、以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 jetson_stats.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;json が取得できていれば OK です。&lt;/p&gt;
&lt;h2 id="grafana-のダッシュボードを作成"&gt;&lt;a href="#grafana-%e3%81%ae%e3%83%80%e3%83%83%e3%82%b7%e3%83%a5%e3%83%9c%e3%83%bc%e3%83%89%e3%82%92%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;Grafana のダッシュボードを作成
&lt;/h2&gt;&lt;p&gt;Jetson Stats 用のテンプレートがないかなと探してみましたが、見つかりませんでした。&lt;br&gt;
どうやら自分で作成するしかなさそうです。&lt;/p&gt;
&lt;p&gt;参考として、&lt;code&gt;jetson_stats.py&lt;/code&gt; を実行したら以下のような出力が得られます（わかりやすいように整形しています）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;jetson&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;09/14/2022&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0:40:39.970000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;jetson_clocks&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OFF&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;nvp model&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MODE_10W_DESKTOP&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;CPU1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;CPU2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;CPU3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;CPU4&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;CPU5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OFF&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;CPU6&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OFF&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;GPU&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;MTS FG&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;MTS BG&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;RAM&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1413804&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;EMC&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1413804&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;SWAP&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;APE&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;NVENC&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OFF&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;NVDEC&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OFF&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;NVJPG&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OFF&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;fan&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Temp AO&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;42.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Temp AUX&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;42.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Temp CPU&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;42.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Temp GPU&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;41.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Temp thermal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;42.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;power cur&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4166&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;power avg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4166&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これらの値が InfluxDB に格納されているはずなので、その値を使ってダッシュボードを作成していきます。&lt;br&gt;
尚、各プロパティの説明は以下にありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://rnext.it/jetson_stats/jtop.html#jtop.jtop.jtop.stats" target="_blank" rel="noopener"
 &gt;https://rnext.it/jetson_stats/jtop.html#jtop.jtop.jtop.stats&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;単位くらい書いておいてほしいなぁ〜。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.influxdata.com/blog/nvidia-jetson-series-part-1-jetson-stats/" target="_blank" rel="noopener"
 &gt;https://www.influxdata.com/blog/nvidia-jetson-series-part-1-jetson-stats/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/rbonghi/jetson_stats" target="_blank" rel="noopener"
 &gt;https://github.com/rbonghi/jetson_stats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/rbonghi/jetson_stats/issues/63" target="_blank" rel="noopener"
 &gt;https://github.com/rbonghi/jetson_stats/issues/63&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/manabuishiirb/items/a2620ec8020811540d81" target="_blank" rel="noopener"
 &gt;https://qiita.com/manabuishiirb/items/a2620ec8020811540d81&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/14493-nvidia-jetson/" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/14493-nvidia-jetson/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>MongoDB と 2106 年問題</title><link>https://blog.ponkotools.com/posts/2023/05/23/mongodb/</link><pubDate>Tue, 23 May 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/05/23/mongodb/</guid><description>&lt;p&gt;ボタン電池がなくなり、RTC が遥か未来になったときに MongoDB が動作しなくなりました。（正確には、Python アプリにおいて、MongoDB の初期化を行う際にエラーとなりました。）&lt;/p&gt;
&lt;p&gt;MongoDB のバージョンは 6.0.5 です。&lt;/p&gt;
&lt;p&gt;調べてみると、MongoDB の ObjectID は先頭の4バイトがタイムスタンプ(UNIX タイム)となっているそうです。&lt;br&gt;
MongoDB はこれを符号なし整数として扱っていて、その場合の上限は &lt;code&gt;4,294,967,295&lt;/code&gt; であり、これは UTC で2106年2月7日6時28分16秒となります。&lt;br&gt;
というわけで、MongoDB はいわゆる 2106 年問題を孕んでいることになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.wdic.org/w/TECH/2106%E5%B9%B4%E5%95%8F%E9%A1%8C" target="_blank" rel="noopener"
 &gt;https://www.wdic.org/w/TECH/2106%E5%B9%B4%E5%95%8F%E9%A1%8C&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちなみに、4バイトがタイムスタンプを符号付き整数として扱っている場合は 2038 年問題となります。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/42097779/how-can-mongodb-handle-objectid-timestamp-beyond-tue-19-jan-2038" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/42097779/how-can-mongodb-handle-objectid-timestamp-beyond-tue-19-jan-2038&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://jira.mongodb.org/browse/GODRIVER-1092" target="_blank" rel="noopener"
 &gt;https://jira.mongodb.org/browse/GODRIVER-1092&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.wdic.org/w/TECH/2106%E5%B9%B4%E5%95%8F%E9%A1%8C" target="_blank" rel="noopener"
 &gt;https://www.wdic.org/w/TECH/2106%E5%B9%B4%E5%95%8F%E9%A1%8C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.mongodb.com/blog/post/generating-globally-unique-identifiers-for-use-with-mongodb" target="_blank" rel="noopener"
 &gt;https://www.mongodb.com/blog/post/generating-globally-unique-identifiers-for-use-with-mongodb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] docker-compose の env_file 内でシェルスクリプトを実行する</title><link>https://blog.ponkotools.com/posts/2023/05/12/docker/</link><pubDate>Fri, 12 May 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/05/12/docker/</guid><description>&lt;p&gt;Docker Compose の env_file ディレクティブを使用する場合、原則として env_file に指定されたファイル内でシェルのシンタックスを使用することはできません。&lt;/p&gt;
&lt;p&gt;しかし、env_file にはシェルスクリプトを指定することもできますので、以下のようにシェルスクリプトファイル（例えば、env.shとします）を作成することで対応できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;MY_VARIABLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my_value
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;docker-compose.yml の env_file ディレクティブでシェルスクリプトファイルを指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;myservice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./env.sh&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意点として、シェルスクリプトのパーミッションを正しく設定する必要があります。&lt;br&gt;
また、シェルスクリプト内で環境変数を定義する場合には &lt;code&gt;export&lt;/code&gt; する必要があります。&lt;/p&gt;
&lt;p&gt;ちなみに、env_file で定義された環境変数は、コンテナ内では使えますが、docker-compose.yml 内では使えません。&lt;br&gt;
（これでちょっとはまりました。）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/rhene/scraps/781fdbecd340d3" target="_blank" rel="noopener"
 &gt;https://zenn.dev/rhene/scraps/781fdbecd340d3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://maku77.github.io/p/8r3cmu5/" target="_blank" rel="noopener"
 &gt;https://maku77.github.io/p/8r3cmu5/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/rhene/scraps/781fdbecd340d3" target="_blank" rel="noopener"
 &gt;https://zenn.dev/rhene/scraps/781fdbecd340d3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Nginx の proxy_pass で名前解決されない</title><link>https://blog.ponkotools.com/posts/2023/03/14/nginx/</link><pubDate>Tue, 14 Mar 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/03/14/nginx/</guid><description>&lt;p&gt;nginx を Docker コンテナとして動かしており、ホスト側へリバースプロキシを行おうとした際にはまってしまいました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;docker 20.10.21&lt;/li&gt;
&lt;li&gt;nginx 1.23.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="問題と対策"&gt;&lt;a href="#%e5%95%8f%e9%a1%8c%e3%81%a8%e5%af%be%e7%ad%96" class="header-anchor"&gt;&lt;/a&gt;問題と対策
&lt;/h2&gt;&lt;p&gt;Docker コンテナ内からホストにアクセスする際には &lt;code&gt;host.docker.internal&lt;/code&gt; を指定します。&lt;br&gt;
これについては以下の記事を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/06/docker.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/06/docker.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その上で、nginx の設定で以下のようにリバースプロキシの設定を行いました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="n"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hoge&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;resolver&lt;/span&gt; &lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.11&lt;/span&gt; &lt;span class="n"&gt;valid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;dummy_var&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;internal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rewrite&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hoge&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="o"&gt;/$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;dummy_var&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Upgrade&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;alive&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_cache_bypass&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Proto&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すると、以下のように名前解決できないというエラーが表示されました。&lt;/p&gt;
&lt;p&gt;尚、コンテナ内に入って &lt;code&gt;curl&lt;/code&gt; などを使ってテストすると、きちんと &lt;code&gt;host.docker.internal&lt;/code&gt; の名前解決がされていました。&lt;br&gt;
いろいろ調べてみると、どうやら &lt;code&gt;proxy_pass&lt;/code&gt; では &lt;code&gt;/etc/hosts&lt;/code&gt; が参照されないそうです。&lt;/p&gt;
&lt;p&gt;どのように対応しようか悩んでいたところ、&lt;code&gt;upstream&lt;/code&gt; の設定ではきちんと &lt;code&gt;/etc/hosts&lt;/code&gt; が参照されるようでしたので、以下のように設定して回避することにしました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;upstream&lt;/span&gt; &lt;span class="n"&gt;backends&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;internal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="n"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hoge&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;resolver&lt;/span&gt; &lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.11&lt;/span&gt; &lt;span class="n"&gt;valid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;dummy_var&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;backends&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rewrite&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hoge&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="o"&gt;/$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;dummy_var&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Upgrade&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;alive&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_cache_bypass&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Proto&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yKanazawa/items/2136c4880e8d48370981" target="_blank" rel="noopener"
 &gt;https://qiita.com/yKanazawa/items/2136c4880e8d48370981&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://rougeref.hatenablog.com/entry/2022/06/13/185501" target="_blank" rel="noopener"
 &gt;https://rougeref.hatenablog.com/entry/2022/06/13/185501&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/tksugimoto/items/804e0051bf1b1ddab168" target="_blank" rel="noopener"
 &gt;https://qiita.com/tksugimoto/items/804e0051bf1b1ddab168&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Nginx で upstream の 名前解決を無効化（回避）する方法</title><link>https://blog.ponkotools.com/posts/2023/02/16/nginx/</link><pubDate>Thu, 16 Feb 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/02/16/nginx/</guid><description>&lt;p&gt;Docker で動かしている Nginx でリバースプロキシの設定を行い、別の Docker コンテナに転送するように設定したときにちょっとはまったのでメモです。&lt;/p&gt;
&lt;p&gt;コンテナ同士はコンテナ名を使ってアクセスできるので、Nginx の設定では以下のようにリバースプロキシの設定を行っています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;location /some_path {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://container-name.docker-network:port;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このとき、Nginx は 起動時に upstream の名前解決を行っているので、上記の URL の名前解決ができない場合（つまり転送先のコンテナが起動していない）と &lt;code&gt;host not found in upstream&lt;/code&gt; というエラーが表示されて起動に失敗します。&lt;/p&gt;
&lt;p&gt;私の場合、仕様によって起動するコンテナの数が異なったり、開発中は一部のコンテナだけ起動して確認したりするので、その都度 Nginx の設定を変えるのは面倒です。&lt;br&gt;
なので、名前解決できなくても Nginx が起動できるように回避策がないかと調べた所、以下の記事に書いてありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://serverfault.com/questions/700894/make-nginx-ignore-site-config-when-its-upstream-cannot-be-reached" target="_blank" rel="noopener"
 &gt;https://serverfault.com/questions/700894/make-nginx-ignore-site-config-when-its-upstream-cannot-be-reached&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;resolver&lt;/code&gt; のディレクティブを使って名前解決してやることで回避できるそうです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;some_path&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;resolver&lt;/span&gt; &lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="n"&gt;valid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# resolver 8.8.8.8 valid=30s; # or some other DNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# resolver 127.0.0.11 valid=30s; # or Docker&amp;#39;s DNS server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;dummy_var&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;dummy_var&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;私の場合、Nginx を Docker で動かしているので、&lt;code&gt;127.0.0.11&lt;/code&gt; をリゾルバに指定することで、転送先のコンテナが起動していなくても Nginx が起動できるようになりました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://architecting.hateblo.jp/entry/2021/01/12/124135" target="_blank" rel="noopener"
 &gt;https://architecting.hateblo.jp/entry/2021/01/12/124135&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://serverfault.com/questions/700894/make-nginx-ignore-site-config-when-its-upstream-cannot-be-reached" target="_blank" rel="noopener"
 &gt;https://serverfault.com/questions/700894/make-nginx-ignore-site-config-when-its-upstream-cannot-be-reached&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Grafana Cloud で InfluxDB v2 のデータを可視化する</title><link>https://blog.ponkotools.com/posts/2023/01/06/influxdb-cloud/</link><pubDate>Fri, 06 Jan 2023 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2023/01/06/influxdb-cloud/</guid><description>&lt;p&gt;InfluxDB v2 ではそれ自体でダッシュボードの作成もできますが、まだまだ使いにくかったり細かい設定ができなかったりしたので、使い慣れている Grafana を使うことにしました。&lt;br&gt;
また、この機会に Grafana もオンプレミス版からクラウドサービスの Grafana Cloud に変更しました。&lt;/p&gt;
&lt;p&gt;Grafana Cloud へのサインアップ方法などは割愛します。&lt;/p&gt;
&lt;h2 id="データソースの設定"&gt;&lt;a href="#%e3%83%87%e3%83%bc%e3%82%bf%e3%82%bd%e3%83%bc%e3%82%b9%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;データソースの設定
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;サイドメニューから &lt;code&gt;Data Sources&lt;/code&gt; を選択します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Add data source&lt;/code&gt; をクリックし、&lt;code&gt;InfluxDB&lt;/code&gt; をクリックします。&lt;/li&gt;
&lt;li&gt;InfluxDB の情報を入力します。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;InfluxDB Cloud の場合、&lt;code&gt;Query Language&lt;/code&gt; は &lt;code&gt;Flux&lt;/code&gt; を選択します。&lt;br&gt;
また、URL, トークン、バケット名が必要になるので、以下を参考に取得しておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/12/influxdb-cloud.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/12/influxdb-cloud.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ダッシュボードパネルの作成"&gt;&lt;a href="#%e3%83%80%e3%83%83%e3%82%b7%e3%83%a5%e3%83%9c%e3%83%bc%e3%83%89%e3%83%91%e3%83%8d%e3%83%ab%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;ダッシュボード（パネル）の作成
&lt;/h2&gt;&lt;p&gt;InfluxDB v1 では GUI でポチポチと設定していくだけでグラフが表示できましたが、InfluxDB v2 では Flux で処理を書いていく必要があります。&lt;br&gt;
最初は難しかったですが、慣れればこちらのほうが簡単に思えてきました。&lt;br&gt;
いくつか例を挙げます。&lt;/p&gt;
&lt;h3 id="基本"&gt;&lt;a href="#%e5%9f%ba%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;基本
&lt;/h3&gt;&lt;p&gt;以下にサンプルがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/docs/grafana/latest/datasources/influxdb/query-editor/#use-macros" target="_blank" rel="noopener"
 &gt;https://grafana.com/docs/grafana/latest/datasources/influxdb/query-editor/#use-macros&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from(bucket:&amp;#34;バケット名&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; range(start: v.timeRangeStart, stop: v.timeRangeStop)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; filter(fn:(r) =&amp;gt; r._measurement == &amp;#34;メジャーメント名&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; filter(fn:(r) =&amp;gt; r[&amp;#34;_field&amp;#34;] == &amp;#34;表示したいフィールドの名前&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; aggregateWindow(every: v.windowPeriod, fn: mean)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本的にはこれでグラフが作成できます。&lt;/p&gt;
&lt;h3 id="一日ごとのデータを表示"&gt;&lt;a href="#%e4%b8%80%e6%97%a5%e3%81%94%e3%81%a8%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e8%a1%a8%e7%a4%ba" class="header-anchor"&gt;&lt;/a&gt;一日ごとのデータを表示
&lt;/h3&gt;&lt;p&gt;例えば株価の終値を表示したい場合などは以下のようにすることでできました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import &amp;#34;timezone&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;option location = timezone.location(name: &amp;#34;Asia/Tokyo&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from(bucket:&amp;#34;バケット名&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; range(start: -30d, stop: now())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; filter(fn:(r) =&amp;gt; r._measurement == &amp;#34;メジャーメント名&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; filter(fn:(r) =&amp;gt; r[&amp;#34;_field&amp;#34;] == &amp;#34;表示したいフィールドの名前&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; aggregateWindow(every: 1d, fn: last)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ポイントは &lt;code&gt;aggregateWindow(every: 1d, fn: last)&lt;/code&gt; で、一日ごとの最後の値を取得しています。&lt;/p&gt;
&lt;p&gt;また、タイムゾーンを指定しないと UTC での終値（つまり、日本時間の9時の時点の値）が取得されてしまったので、JST を指定しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.influxdata.com/blog/time-zones-in-flux/" target="_blank" rel="noopener"
 &gt;https://www.influxdata.com/blog/time-zones-in-flux/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;尚、私の場合はグラフではなくテーブル表示にしたかったため、グラフの表示期間に関わらず &lt;code&gt;range(start: -30d, stop: now())&lt;/code&gt; で直近30日固定表示にしています。&lt;/p&gt;
&lt;h3 id="累積グラフの作成"&gt;&lt;a href="#%e7%b4%af%e7%a9%8d%e3%82%b0%e3%83%a9%e3%83%95%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;累積グラフの作成
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;cumulativeSum&lt;/code&gt; を使います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.influxdata.com/influxdb/cloud/query-data/flux/cumulativesum/" target="_blank" rel="noopener"
 &gt;https://docs.influxdata.com/influxdb/cloud/query-data/flux/cumulativesum/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば、日次損益の集計を行う場合などは以下のようにするとできました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import &amp;#34;timezone&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;option location = timezone.location(name: &amp;#34;Asia/Tokyo&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from(bucket:&amp;#34;バケット名&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; range(start: -30d, stop: now())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; filter(fn:(r) =&amp;gt; r._measurement == &amp;#34;メジャーメント名&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; filter(fn:(r) =&amp;gt; r[&amp;#34;_field&amp;#34;] == &amp;#34;表示したいフィールドの名前&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; aggregateWindow(every: 1d, fn: last)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |&amp;gt; cumulativeSum()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一日ごとの値は取り出す方法は前述の例と同じです。&lt;br&gt;
あとはそれを &lt;code&gt;cumulativeSum()&lt;/code&gt; で加算していくだけです。&lt;br&gt;
これにより、一日ごとの値を加算してグラフに表示できます。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/aikige/items/22dc9ebc64e32a5bdfae" target="_blank" rel="noopener"
 &gt;https://qiita.com/aikige/items/22dc9ebc64e32a5bdfae&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ekzemplaro/items/f462dfc0d81329b39c09" target="_blank" rel="noopener"
 &gt;https://qiita.com/ekzemplaro/items/f462dfc0d81329b39c09&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://rabbit-note.com/2022/09/12/influxdb-2-flux/" target="_blank" rel="noopener"
 &gt;https://rabbit-note.com/2022/09/12/influxdb-2-flux/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Influxdb Cloud を使ってみた</title><link>https://blog.ponkotools.com/posts/2022/12/26/influxdb-cloud/</link><pubDate>Mon, 26 Dec 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/12/26/influxdb-cloud/</guid><description>&lt;p&gt;今までは AWS や GCP 上に InfluxDB の環境を用意して使っていたのですが、InfluxDB Cloud というクラウドサービスがあることを知ったので、使ってみました。&lt;br&gt;
バージョンも今までは v1 を使っていましたが、クラウドなので v2 に変わります。&lt;/p&gt;
&lt;h2 id="準備"&gt;&lt;a href="#%e6%ba%96%e5%82%99" class="header-anchor"&gt;&lt;/a&gt;準備
&lt;/h2&gt;&lt;h3 id="バケットの作成"&gt;&lt;a href="#%e3%83%90%e3%82%b1%e3%83%83%e3%83%88%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;バケットの作成
&lt;/h3&gt;&lt;p&gt;InfluxDB v1 系でいう、データベースとリテンションポリシーを合わせたようなものかなと思います。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;サイドメニューより &lt;code&gt;Load Data&lt;/code&gt; &amp;gt; &lt;code&gt;Buckets&lt;/code&gt; を選択します。&lt;/li&gt;
&lt;li&gt;画面右側の &lt;code&gt;GENERATE BUCKET&lt;/code&gt; &amp;gt; クリックします。&lt;/li&gt;
&lt;li&gt;バケット名を入力し、必要に応じてデータの保存期間を指定します（デフォルトでは 30 日経ったら古いデータが削除されます）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="343px" data-flex-grow="143" height="454" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2022/12/26/influxdb-cloud/01.png" width="650"&gt;&lt;/p&gt;
&lt;h3 id="トークンの取得"&gt;&lt;a href="#%e3%83%88%e3%83%bc%e3%82%af%e3%83%b3%e3%81%ae%e5%8f%96%e5%be%97" class="header-anchor"&gt;&lt;/a&gt;トークンの取得
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;サイドメニューより &lt;code&gt;Load Data&lt;/code&gt; &amp;gt; &lt;code&gt;API Tokens&lt;/code&gt; を選択します。&lt;/li&gt;
&lt;li&gt;画面右側の &lt;code&gt;GENERATE API TOKEN&lt;/code&gt; &amp;gt; &lt;code&gt;All Access API Token&lt;/code&gt; を選択します。&lt;/li&gt;
&lt;li&gt;トークンが表示されるのでコピーします。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;コピーしたトークンは環境変数などに設定して使います。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;INFLUX_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;コピーしたトークン&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="url-の取得"&gt;&lt;a href="#url-%e3%81%ae%e5%8f%96%e5%be%97" class="header-anchor"&gt;&lt;/a&gt;URL の取得
&lt;/h3&gt;&lt;p&gt;API エンドポイントとなる URL は以下で取得できます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;画面上部のメールアドレスを選択 &amp;gt; &lt;code&gt;Settings&lt;/code&gt; をクリック&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="python-からデータを書き込む"&gt;&lt;a href="#python-%e3%81%8b%e3%82%89%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e6%9b%b8%e3%81%8d%e8%be%bc%e3%82%80" class="header-anchor"&gt;&lt;/a&gt;Python からデータを書き込む
&lt;/h2&gt;&lt;p&gt;以下の記事を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/12/python-influxdb-18-influxdbclient.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/12/python-influxdb-18-influxdbclient.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;必要な情報はバケット名、トークン、URL です。&lt;/p&gt;
&lt;h2 id="ダッシュボードの作成"&gt;&lt;a href="#%e3%83%80%e3%83%83%e3%82%b7%e3%83%a5%e3%83%9c%e3%83%bc%e3%83%89%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;ダッシュボードの作成
&lt;/h2&gt;&lt;p&gt;別途記事にします。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://dev.classmethod.jp/articles/send-and-visualize-data-with-influxdb-cloud/" target="_blank" rel="noopener"
 &gt;https://dev.classmethod.jp/articles/send-and-visualize-data-with-influxdb-cloud/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Grafana から Rocket.Chat へ通知を行う</title><link>https://blog.ponkotools.com/posts/2022/12/13/grafana-rocketchat/</link><pubDate>Tue, 13 Dec 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/12/13/grafana-rocketchat/</guid><description>&lt;p&gt;Grafana 自体は Rocket.Chat に対応していませんが、Webhook を使うことで Rocket.Chat に通知できます。&lt;br&gt;
アラートの基本的な設定方法については以下を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/11/grafana.html" target="_blank" rel="noopener"
 &gt;Grafana でアラートを設定する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここでは Rocket.Chat への通知の設定のみ記載します。&lt;/p&gt;
&lt;h2 id="rocketchat-側の設定"&gt;&lt;a href="#rocketchat-%e5%81%b4%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Rocket.Chat 側の設定
&lt;/h2&gt;&lt;p&gt;管理画面のメニューから &lt;code&gt;サービス連携&lt;/code&gt; を選択し、&lt;code&gt;Incoming&lt;/code&gt; で新規作成を行います。&lt;br&gt;
スクリプトを有効にし、以下のスクリプトを記入します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Script {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; process_incoming_request({ request }) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; let color = &amp;#34;#00FF00&amp;#34;; // green
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; switch(request.content.state) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; case &amp;#39;ok&amp;#39;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; color = &amp;#39;#00FF00&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; break;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; case &amp;#39;paused&amp;#39;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; color = &amp;#39;#666666&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; break;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; case &amp;#39;alerting&amp;#39;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; color = &amp;#39;#FF0000&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; break;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; case &amp;#39;pending&amp;#39;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; color = &amp;#39;#CCCCCC&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; break;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; case &amp;#39;no_data&amp;#39;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; color = &amp;#39;#333333&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; break;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; default:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; color = &amp;#39;#666666&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; content:{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; text: request.content.title,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;attachments&amp;#34;: [{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;color&amp;#34;: color,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;title&amp;#34;: request.content.title,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;title_link&amp;#34;: request.content.ruleUrl,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;text&amp;#34;: request.content.message,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;image_url&amp;#34;: request.content.imageUrl,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;その他、投稿先チャンネルや投稿ユーザーなどの基本的な設定を行います。&lt;br&gt;
Grafana の設定で Webhook URL が必要になるのでコピーしておきます。&lt;/p&gt;
&lt;h2 id="grafana-側の設定"&gt;&lt;a href="#grafana-%e5%81%b4%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Grafana 側の設定
&lt;/h2&gt;&lt;p&gt;Grafana のサイドメニューから &lt;code&gt;Alert rules&lt;/code&gt; を選択し、&lt;code&gt;Contact Points&lt;/code&gt; で以下の設定を行います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;New contact point&lt;/code&gt; をクリック&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Name&lt;/code&gt; にはわかりやすい名前を適当に入力する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Contact point type&lt;/code&gt; で &lt;code&gt;Webhook&lt;/code&gt; を選択する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Webhook URL&lt;/code&gt; に上記で取得した URL を入力する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rocket.Chat に関する設定は以上で完了です。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gist.github.com/ATofighi/79895715ae0a8f5bdeff058a64012275" target="_blank" rel="noopener"
 &gt;https://gist.github.com/ATofighi/79895715ae0a8f5bdeff058a64012275&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Grafana から Slack へ通知を行う</title><link>https://blog.ponkotools.com/posts/2022/12/07/grafana-slack/</link><pubDate>Wed, 07 Dec 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/12/07/grafana-slack/</guid><description>&lt;p&gt;Grafana のアラートで Slack のチャンネルへ通知を行う方法です。&lt;br&gt;
アラートの基本的な設定方法については以下を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/11/grafana.html" target="_blank" rel="noopener"
 &gt;Grafana でアラートを設定する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここでは Slack への通知の設定のみ記載します。&lt;/p&gt;
&lt;h2 id="webhook-url-の取得"&gt;&lt;a href="#webhook-url-%e3%81%ae%e5%8f%96%e5%be%97" class="header-anchor"&gt;&lt;/a&gt;Webhook URL の取得
&lt;/h2&gt;&lt;p&gt;まず、通知したい Slack のチャンネルの Webhook URL を取得します。
Webhook URL は、以下からワークスペースとチャンネルを指定して取得できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://slack.com/services/new/incoming-webhook" target="_blank" rel="noopener"
 &gt;https://slack.com/services/new/incoming-webhook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact-point-の設定"&gt;&lt;a href="#contact-point-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Contact Point の設定
&lt;/h2&gt;&lt;p&gt;Grafana のサイドメニューから &lt;code&gt;Alert rules&lt;/code&gt; を選択し、&lt;code&gt;Contact Points&lt;/code&gt; で以下の設定を行います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;New contact point&lt;/code&gt; をクリック&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Name&lt;/code&gt; にはわかりやすい名前を適当に入力する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Contact point type&lt;/code&gt; で &lt;code&gt;Slack&lt;/code&gt; を選択する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Webhook URL&lt;/code&gt; に上記で取得した URL を入力する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Slack に関する設定は以上です。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://fclout.hateblo.jp/entry/2020/06/20/Grafana%E3%81%8B%E3%82%89Slack%E3%81%B8%E9%80%9A%E7%9F%A5%E3%81%99%E3%82%8B" target="_blank" rel="noopener"
 &gt;https://fclout.hateblo.jp/entry/2020/06/20/Grafana%E3%81%8B%E3%82%89Slack%E3%81%B8%E9%80%9A%E7%9F%A5%E3%81%99%E3%82%8B&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Grafana でアラートを設定する</title><link>https://blog.ponkotools.com/posts/2022/11/30/grafana-alert/</link><pubDate>Wed, 30 Nov 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/11/30/grafana-alert/</guid><description>&lt;p&gt;Grafana で任意の値が閾値を超えたら（または下回ったら）アラートを発報するように設定します。&lt;/p&gt;
&lt;p&gt;設定方法は Grafana のバージョンによって大きく異なるようですが、今回使用した Grafana 9.1.0 では、以下の３段階で設定を行うようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Alert rules&lt;/code&gt;: アラート条件の設定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Contact points&lt;/code&gt;：通知先の登録&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Notification policy&lt;/code&gt;：アラート条件と通知先の関連付け&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Grafana 9.1.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="アラート条件の設定"&gt;&lt;a href="#%e3%82%a2%e3%83%a9%e3%83%bc%e3%83%88%e6%9d%a1%e4%bb%b6%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;アラート条件の設定
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;左のサイドメニューより、&lt;code&gt;Alerting&lt;/code&gt; &amp;gt; &lt;code&gt;Alert rules&lt;/code&gt; をクリックします。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;New alert rule&lt;/code&gt; をクリックします。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1. Set a query and alert condision&lt;/code&gt; で監視したい値や閾値を設定します。（具体的な設定例は後述します。）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2.Alert evaluation behavior&lt;/code&gt; でアラート保留状態となる時間を設定します。&lt;br&gt;
デフォルトでは１分毎に評価し、アラートを検出した後５分が経過したら通知が行われるようになっています。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3. Add details for your alert&lt;/code&gt; でこのアラートの名前や説明を記載します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;4. Notifications&lt;/code&gt; で通知先のラベルを指定します（後述）。&lt;br&gt;
指定しなかった場合はデフォルトの通知先が使用されます（後述）。&lt;/li&gt;
&lt;li&gt;設定が完了したら画面右上の Save で保存します。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="通知先の登録"&gt;&lt;a href="#%e9%80%9a%e7%9f%a5%e5%85%88%e3%81%ae%e7%99%bb%e9%8c%b2" class="header-anchor"&gt;&lt;/a&gt;通知先の登録
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;左のサイドメニューより、&lt;code&gt;Alerting&lt;/code&gt; &amp;gt; &lt;code&gt;Contact points&lt;/code&gt; をクリックします。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;New contact points&lt;/code&gt; をクリックします。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Name&lt;/code&gt; で適当な名前を付け、&lt;code&gt;Contact point type&lt;/code&gt; で通知方法を選択します（後述）。&lt;/li&gt;
&lt;li&gt;設定が完了したら Save contact point で保存します。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="具体的な設定例"&gt;&lt;a href="#%e5%85%b7%e4%bd%93%e7%9a%84%e3%81%aa%e8%a8%ad%e5%ae%9a%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;具体的な設定例
&lt;/h3&gt;&lt;p&gt;通知先によって異なるため、別記事にまとめます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/12/grafana-slack.html" target="_blank" rel="noopener"
 &gt;Grafana から Slack へ通知を行う&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/12/grafana-rocketchat.html" target="_blank" rel="noopener"
 &gt;Grafana から Rocket.Chat へ通知を行う&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="アラート条件と通知先の関連付け"&gt;&lt;a href="#%e3%82%a2%e3%83%a9%e3%83%bc%e3%83%88%e6%9d%a1%e4%bb%b6%e3%81%a8%e9%80%9a%e7%9f%a5%e5%85%88%e3%81%ae%e9%96%a2%e9%80%a3%e4%bb%98%e3%81%91" class="header-anchor"&gt;&lt;/a&gt;アラート条件と通知先の関連付け
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;左のサイドメニューより、&lt;code&gt;Alerting&lt;/code&gt; &amp;gt; &lt;code&gt;Notification policies&lt;/code&gt; をクリックします。&lt;/li&gt;
&lt;li&gt;デフォルトの通知先の変更や、特定のラベルのアラートに対する通知先を設定します（後述）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Save policy&lt;/code&gt; をクリックして保存します。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="デフォルトの通知先を指定"&gt;&lt;a href="#%e3%83%87%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%81%ae%e9%80%9a%e7%9f%a5%e5%85%88%e3%82%92%e6%8c%87%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;デフォルトの通知先を指定
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Root policy&lt;/code&gt; の右側にある Edit をクリックします。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Default contact point&lt;/code&gt; でデフォルトの通知先を指定します。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="特定のラベルに対する通知先を指定"&gt;&lt;a href="#%e7%89%b9%e5%ae%9a%e3%81%ae%e3%83%a9%e3%83%99%e3%83%ab%e3%81%ab%e5%af%be%e3%81%99%e3%82%8b%e9%80%9a%e7%9f%a5%e5%85%88%e3%82%92%e6%8c%87%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;特定のラベルに対する通知先を指定
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;New specific policy&lt;/code&gt; をクリックします。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Add matcher&lt;/code&gt; でラベルの条件を指定し、&lt;code&gt;Contact point&lt;/code&gt; で通知先を指定します。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://doc.cloud.global.fujitsu.com/lib/monitoringservice/jp/usersguide/capter02/alerting/alert_rule/" target="_blank" rel="noopener"
 &gt;https://doc.cloud.global.fujitsu.com/lib/monitoringservice/jp/usersguide/capter02/alerting/alert_rule/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>overlayroot の有効無効をシェルスクリプト化</title><link>https://blog.ponkotools.com/posts/2022/10/18/overlayroot/</link><pubDate>Tue, 18 Oct 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/10/18/overlayroot/</guid><description>&lt;p&gt;overlayroot を使ってファイルシステムを読み取り専用にしましたが、現在読み取り専用になっているのかどうかのチェックと、有効無効を簡単に切り替えられるようなスクリプトを作成してみました。&lt;/p&gt;
&lt;p&gt;overlayroot のインストールや設定方法については以下の記事を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overlayroot-が有効か無効かをチェック"&gt;&lt;a href="#overlayroot-%e3%81%8c%e6%9c%89%e5%8a%b9%e3%81%8b%e7%84%a1%e5%8a%b9%e3%81%8b%e3%82%92%e3%83%81%e3%82%a7%e3%83%83%e3%82%af" class="header-anchor"&gt;&lt;/a&gt;overlayroot が有効か無効かをチェック
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;overlayroot on / type overlay&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot enabled&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot disabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;amp;&amp;gt; /dev/null&lt;/code&gt; は標準出力と標準エラー出力の破棄です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea" target="_blank" rel="noopener"
 &gt;https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;$?&lt;/code&gt; は直前に実行したコマンドの終了値です（0は成功、1は失敗）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337" target="_blank" rel="noopener"
 &gt;https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overlayroot-を無効にする"&gt;&lt;a href="#overlayroot-%e3%82%92%e7%84%a1%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;overlayroot を無効にする
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo overlayroot-chroot rm /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;overlayroot-chroot&lt;/code&gt; で一時的に書き込み可能状態にして &lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を削除しているだけです。&lt;/p&gt;
&lt;h2 id="overlayroot-を有効にする"&gt;&lt;a href="#overlayroot-%e3%82%92%e6%9c%89%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;overlayroot を有効にする
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を作成して &lt;code&gt;overlayroot=&amp;quot;tmpfs:recurse=0&amp;quot;&lt;/code&gt; を記述しているだけです。&lt;/p&gt;
&lt;h2 id="サンプル"&gt;&lt;a href="#%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;サンプル
&lt;/h2&gt;&lt;p&gt;以上を踏まえて作成してみたのが以下のスクリプトです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ex: ./overlayroot.sh disable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ex: ./overlayroot.sh enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ex: ./overlayroot.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在の overlayroot の状態を取得&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;overlayroot on / type overlay&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;overlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot enabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;overlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot disabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; disable &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# overlayroot を無効にする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$overlay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;disable overlayroot...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo overlayroot-chroot rm /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;\nReboot after &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; seconds&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot already disabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# overlayroot を有効にする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$overlay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;overlayroot already enabled&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;enable overlayroot...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;\nReboot after &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; seconds&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;\nCloses after &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; seconds&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sleep &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;timeout&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/copergit/automations/blob/a258017fd4c25a1704ba711e5921aa8c1bbc7c62/scripts/overlay/overlayroot" target="_blank" rel="noopener"
 &gt;https://github.com/copergit/automations/blob/a258017fd4c25a1704ba711e5921aa8c1bbc7c62/scripts/overlay/overlayroot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea" target="_blank" rel="noopener"
 &gt;https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337" target="_blank" rel="noopener"
 &gt;https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker Volume をコピー（複製）する</title><link>https://blog.ponkotools.com/posts/2022/10/14/docker/</link><pubDate>Fri, 14 Oct 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/10/14/docker/</guid><description>&lt;p&gt;Linux だと &lt;code&gt;/var/lib/docker/volumes/&amp;lt;volume_name&amp;gt;&lt;/code&gt; に保存されているため、基本的にはこれを &lt;code&gt;cp&lt;/code&gt; コマンドでコピーするだけで OK です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -p to preserve permissions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo cp -rp /var/lib/docker/volumes/source_volume /var/lib/docker/volumes/target_volume
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/ciffelia/articles/docker-volume-backup-restore" target="_blank" rel="noopener"
 &gt;https://zenn.dev/ciffelia/articles/docker-volume-backup-restore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/67567986/copy-docker-volumes" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/67567986/copy-docker-volumes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>NTP サーバー/クライアント chrony の設定</title><link>https://blog.ponkotools.com/posts/2022/09/29/chrony/</link><pubDate>Thu, 29 Sep 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/09/29/chrony/</guid><description>&lt;p&gt;chrony を使って NTP サーバー、NTP クライアントのぞれぞれを設定してみました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;chrony 3.5&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install chrony
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ntp-サーバーとしての設定"&gt;&lt;a href="#ntp-%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%a8%e3%81%97%e3%81%a6%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;NTP サーバーとしての設定
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;/etc/chrony/chrony.conf&lt;/code&gt; をエディタで編集します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/chrony/chrony.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="上位サーバーの無効化"&gt;&lt;a href="#%e4%b8%8a%e4%bd%8d%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%ae%e7%84%a1%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;上位サーバーの無効化
&lt;/h3&gt;&lt;p&gt;17行目〜20行目をコメントアウトします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#pool ntp.ubuntu.com iburst maxsources 4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#pool 2.ubuntu.pool.ntp.org iburst maxsources 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="認証の無効化"&gt;&lt;a href="#%e8%aa%8d%e8%a8%bc%e3%81%ae%e7%84%a1%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;認証の無効化
&lt;/h3&gt;&lt;p&gt;24行目をコメントアウトします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#keyfile /etc/chrony/chrony.keys
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="アクセス許可"&gt;&lt;a href="#%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e8%a8%b1%e5%8f%af" class="header-anchor"&gt;&lt;/a&gt;アクセス許可
&lt;/h3&gt;&lt;p&gt;特定のセグメントからのみアクセスを許可したい場合は以下のように追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Allow NTP client access from local network.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;allow 192.168.4.0/24
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;全セグメントから許可シたい場合は &lt;code&gt;allow&lt;/code&gt; とだけ記載するようです。&lt;/p&gt;
&lt;h3 id="上位の-ntp-サーバーがいなくても同期を取れるようにする"&gt;&lt;a href="#%e4%b8%8a%e4%bd%8d%e3%81%ae-ntp-%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%8c%e3%81%84%e3%81%aa%e3%81%8f%e3%81%a6%e3%82%82%e5%90%8c%e6%9c%9f%e3%82%92%e5%8f%96%e3%82%8c%e3%82%8b%e3%82%88%e3%81%86%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;上位の NTP サーバーがいなくても同期を取れるようにする
&lt;/h3&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Serve time even if not synchronized to a time source.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;local stratum 5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="再起動"&gt;&lt;a href="#%e5%86%8d%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;再起動
&lt;/h3&gt;&lt;p&gt;設定が完了したら chrony を再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl restart chrony
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ntp-クライアントとしての設定"&gt;&lt;a href="#ntp-%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2%e3%83%b3%e3%83%88%e3%81%a8%e3%81%97%e3%81%a6%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;NTP クライアントとしての設定
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;/etc/chrony/chrony.conf&lt;/code&gt; をエディタで編集します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/chrony/chrony.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;17行目〜20行目をコメントアウトし、&lt;code&gt;pool &amp;lt;NTPサーバーのIPアドレス&amp;gt; iburst&amp;gt;&lt;/code&gt; を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#pool ntp.ubuntu.com iburst maxsources 4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#pool 2.ubuntu.pool.ntp.org iburst maxsources 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pool 192.168.0.10 iburst
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="時刻同期について"&gt;&lt;a href="#%e6%99%82%e5%88%bb%e5%90%8c%e6%9c%9f%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6" class="header-anchor"&gt;&lt;/a&gt;時刻同期について
&lt;/h3&gt;&lt;p&gt;以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.bigbang.mydns.jp/chrony-x.htm" target="_blank" rel="noopener"
 &gt;https://www.bigbang.mydns.jp/chrony-x.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://go-journey.club/archives/12037" target="_blank" rel="noopener"
 &gt;https://go-journey.club/archives/12037&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;chrony は iburst オプションの付いた NTP サーバーに対して、起動直後に短い間隔で4回問い合わせをするそうです。
また、デフォルトでは &lt;code&gt;makestep 1 3&lt;/code&gt; の設定がありますが、これは chrony の起動時に、1.0 秒以上時刻ずれが 3 回続いた場合、step モードで一気に時刻補正をするという意味だそうです。
そうでない場合は slew モードで少しずつ時刻補正を行うそうです。&lt;/p&gt;
&lt;h3 id="再起動-1"&gt;&lt;a href="#%e5%86%8d%e8%b5%b7%e5%8b%95-1" class="header-anchor"&gt;&lt;/a&gt;再起動
&lt;/h3&gt;&lt;p&gt;設定が完了したら chrony を再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl restart chrony
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="確認"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;chronyc sources&lt;/code&gt; を実行し、サーバー名の最初に &lt;code&gt;*&lt;/code&gt; と表示されていれば同期が取れています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chronyc sources
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;210&lt;/span&gt; Number of &lt;span class="nv"&gt;sources&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MS Name/IP address Stratum Poll Reach LastRx Last &lt;span class="nv"&gt;sample&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;===============================================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;^* 192.168.0.10 &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt; &lt;span class="m"&gt;377&lt;/span&gt; &lt;span class="m"&gt;34&lt;/span&gt; -7277ns&lt;span class="o"&gt;[&lt;/span&gt;-2447ns&lt;span class="o"&gt;]&lt;/span&gt; +/- 41us
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ちょっとはまったところ"&gt;&lt;a href="#%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%81%af%e3%81%be%e3%81%a3%e3%81%9f%e3%81%a8%e3%81%93%e3%82%8d" class="header-anchor"&gt;&lt;/a&gt;ちょっとはまったところ
&lt;/h2&gt;&lt;p&gt;きちんと同期がとれているか確認するために、サーバー側の日時を Ubuntu の GUI で変更し、クライアントの PC を再起動してみましたが、同期されませんでした。&lt;br&gt;
何でだろうと思っていたら、日時を GUI で変更したときに chrony のサービスが停止していました。&lt;/p&gt;
&lt;p&gt;chrony が動いているかどうかは以下のコマンドで確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl status chrony
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もし chrony が停止していた場合は、以下のコマンドで起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl start chrony
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この状態でクライアントの PC を再起動したら、起動時に日時が同期されました。&lt;/p&gt;
&lt;p&gt;もし PC 再起動後に chrony が停止していた場合は有効化されていないので、以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; chrony
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.isoroot.jp/blog/2844/" target="_blank" rel="noopener"
 &gt;https://www.isoroot.jp/blog/2844/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tech-lab.sios.jp/archives/11247" target="_blank" rel="noopener"
 &gt;https://tech-lab.sios.jp/archives/11247&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.bigbang.mydns.jp/chrony-x.htm" target="_blank" rel="noopener"
 &gt;https://www.bigbang.mydns.jp/chrony-x.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://go-journey.club/archives/12037" target="_blank" rel="noopener"
 &gt;https://go-journey.club/archives/12037&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>InfluxDB のコマンド (InfluxQL)</title><link>https://blog.ponkotools.com/posts/2022/09/22/influxdb/</link><pubDate>Thu, 22 Sep 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/09/22/influxdb/</guid><description>&lt;p&gt;ちょっと何かしたいというときに毎回コマンドを調べているので、個人的によく使うコマンドをまとめてみました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;InfluxDB 1.8.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="事前知識"&gt;&lt;a href="#%e4%ba%8b%e5%89%8d%e7%9f%a5%e8%ad%98" class="header-anchor"&gt;&lt;/a&gt;事前知識
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;influx&lt;/code&gt; コマンドで DB との対話モードとなります。&lt;br&gt;
この状態でコマンドを実行していきます。&lt;br&gt;
尚、対話モードに入らずに以下のようにしてコマンドを実行することもできます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ influx -execute &lt;span class="s2"&gt;&amp;#34;コマンド&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下、対話モードになっている前提でコマンドのみ記載します。&lt;/p&gt;
&lt;h2 id="データベースの作成"&gt;&lt;a href="#%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;データベースの作成
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#create-database" target="_blank" rel="noopener"
 &gt;https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#create-database&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;create database &amp;lt;データベース名&amp;gt;&lt;/code&gt; を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; create database sampledb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="データベースの表示"&gt;&lt;a href="#%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%81%ae%e8%a1%a8%e7%a4%ba" class="header-anchor"&gt;&lt;/a&gt;データベースの表示
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#show-databases" target="_blank" rel="noopener"
 &gt;https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#show-databases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;show databases&lt;/code&gt; を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; show databases
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name: databases
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sampledb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;_internal
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="リテンションポリシーの作成"&gt;&lt;a href="#%e3%83%aa%e3%83%86%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%b3%e3%83%9d%e3%83%aa%e3%82%b7%e3%83%bc%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;リテンションポリシーの作成
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#create-retention-policy" target="_blank" rel="noopener"
 &gt;https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#create-retention-policy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;create retention policy &amp;lt;リテンションポリシー名&amp;gt; on &amp;lt;データベース名&amp;gt;&lt;/code&gt; を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; create retention policy samplerp on sampledb duration 30d replication &lt;span class="m"&gt;1&lt;/span&gt; default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;duration&lt;/code&gt; : 保存期間を指定
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#durations" target="_blank" rel="noopener"
 &gt;https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#durations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;replication&lt;/code&gt; : でレプリケーション数を指定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;default&lt;/code&gt; : このリテンションポリシーをデフォルトにする&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="リテンションポリシーの表示"&gt;&lt;a href="#%e3%83%aa%e3%83%86%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%b3%e3%83%9d%e3%83%aa%e3%82%b7%e3%83%bc%e3%81%ae%e8%a1%a8%e7%a4%ba" class="header-anchor"&gt;&lt;/a&gt;リテンションポリシーの表示
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#show-retention-policies" target="_blank" rel="noopener"
 &gt;https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#show-retention-policies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;use &amp;lt;データベース名&amp;gt;&lt;/code&gt; でデータベースを選択し、&lt;code&gt;show retention policies&lt;/code&gt; で表示します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; use sampledb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Using database sampledb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; show retention policies
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name duration shardGroupDuration replicaN default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---- -------- ------------------ -------- -------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;autogen 0s 168h0m0s &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;samplerp 720h0m0s 24h0m0s &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="リテンションポリシーの保存期間を変更"&gt;&lt;a href="#%e3%83%aa%e3%83%86%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%b3%e3%83%9d%e3%83%aa%e3%82%b7%e3%83%bc%e3%81%ae%e4%bf%9d%e5%ad%98%e6%9c%9f%e9%96%93%e3%82%92%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;リテンションポリシーの保存期間を変更
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#alter-retention-policy" target="_blank" rel="noopener"
 &gt;https://docs.influxdata.com/influxdb/v1.8/query_language/spec/#alter-retention-policy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;alter retention policy &amp;lt;リテンションポリシー名&amp;gt; on &amp;lt;データベース名&amp;gt; duration &amp;lt;保存期間&amp;gt;&lt;/code&gt; を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; alter retention policy samplerp on sampledb duration 180d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;show retention policies&lt;/code&gt; で変わったことを確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; show retention policies
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name duration shardGroupDuration replicaN default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---- -------- ------------------ -------- -------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;autogen 0s 168h0m0s &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;samplerp 4320h0m0s 24h0m0s &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>TIG Stack を動かしてみる</title><link>https://blog.ponkotools.com/posts/2022/09/16/tigstack/</link><pubDate>Fri, 16 Sep 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/09/16/tigstack/</guid><description>&lt;p&gt;サーバーリソースのメトリクスやログの収集・保存・可視化・アラートを行うためにTIG Stack (Telegraf, InfluxDB, Grafana) を使って一通り設定してみました。&lt;/p&gt;
&lt;p&gt;一応、以前にも記事は書いていますが、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2021/12/telegraf-influxdb-garafana.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2021/12/telegraf-influxdb-garafana.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちょっと情報が古くなっていたので、アップデートし、さらに出来る限り設定を自動化しました。&lt;/p&gt;
&lt;h2 id="予備知識"&gt;&lt;a href="#%e4%ba%88%e5%82%99%e7%9f%a5%e8%ad%98" class="header-anchor"&gt;&lt;/a&gt;予備知識
&lt;/h2&gt;&lt;p&gt;時系列とは何ぞや？ TICK スタックとは何ぞや？みたいな話が以下に載ってました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.influxdata.com/blog/influxdb-the-platform-for-time-series-data/" target="_blank" rel="noopener"
 &gt;https://www.influxdata.com/blog/influxdb-the-platform-for-time-series-data/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.influxdata.com/blog/introduction-to-influxdatas-influxdb-and-tick-stack/" target="_blank" rel="noopener"
 &gt;https://www.influxdata.com/blog/introduction-to-influxdatas-influxdb-and-tick-stack/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://medium.com/yavar/influxdb-tick-stack-part1-28bd04d10a18" target="_blank" rel="noopener"
 &gt;https://medium.com/yavar/influxdb-tick-stack-part1-28bd04d10a18&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.influxdata.com/integration/syslog/" target="_blank" rel="noopener"
 &gt;https://www.influxdata.com/integration/syslog/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;p&gt;TIG Stack は全て Docker で動かします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;Docker 20.10.12&lt;/li&gt;
&lt;li&gt;Telegraf 1.23.0&lt;/li&gt;
&lt;li&gt;InfluxDB 1.8.10&lt;/li&gt;
&lt;li&gt;Grafana 9.1.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="各ツールの役割"&gt;&lt;a href="#%e5%90%84%e3%83%84%e3%83%bc%e3%83%ab%e3%81%ae%e5%bd%b9%e5%89%b2" class="header-anchor"&gt;&lt;/a&gt;各ツールの役割
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;ツール&lt;/th&gt;
 &lt;th style="text-align: left"&gt;役割&lt;/th&gt;
 &lt;th&gt;Docker イメージ&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Telegraf&lt;/td&gt;
 &lt;td style="text-align: left"&gt;データの収集&lt;/td&gt;
 &lt;td&gt;&lt;a class="link" href="https://hub.docker.com/_/telegraf" target="_blank" rel="noopener"
 &gt;https://hub.docker.com/_/telegraf&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;InfluxDB&lt;/td&gt;
 &lt;td style="text-align: left"&gt;データの保存（時系列データベース）&lt;/td&gt;
 &lt;td&gt;&lt;a class="link" href="https://hub.docker.com/_/influxdb" target="_blank" rel="noopener"
 &gt;https://hub.docker.com/_/influxdb&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Grafana&lt;/td&gt;
 &lt;td style="text-align: left"&gt;データの可視化（UI）&lt;/td&gt;
 &lt;td&gt;&lt;a class="link" href="https://hub.docker.com/r/grafana/grafana/" target="_blank" rel="noopener"
 &gt;https://hub.docker.com/r/grafana/grafana/&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上記の Docker hub のページに各ツールの起動方法や設定方法などが一通り載っているので、それを参考に設定していきます。&lt;/p&gt;
&lt;h2 id="telegraf-の設定"&gt;&lt;a href="#telegraf-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Telegraf の設定
&lt;/h2&gt;&lt;p&gt;まずは設定ファイルの雛型（デフォルトの設定ファイル）を取得します。&lt;br&gt;
Telegraf の Docker コンテナを起動し、コンテナ内から設定ファイルをホストにコピーしてきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm telegraf telegraf config &amp;gt; telegraf.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この &lt;code&gt;telegraf.conf&lt;/code&gt; を取得したいデータに応じて編集します。&lt;br&gt;
これについてはいろいろあるので、別記事にまとめました。&lt;/p&gt;
&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;p&gt;設定ファイルが必要なのは Telegraf だけなので、ここで TIG Stack を起動する &lt;code&gt;docker-compose.yml&lt;/code&gt; のサンプルを載せます。&lt;br&gt;
前提として、&lt;code&gt;tigstack&lt;/code&gt; というネットワークを共通に使用しているので、以下のコマンドであらかじめ作成しておく必要があります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker network create tigstack
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下、&lt;code&gt;docker-compose.yml&lt;/code&gt; のサンプルです。解説などは後述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="telegraf-について"&gt;&lt;a href="#telegraf-%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6" class="header-anchor"&gt;&lt;/a&gt;Telegraf について
&lt;/h3&gt;&lt;h4 id="gpu-の情報取得について"&gt;&lt;a href="#gpu-%e3%81%ae%e6%83%85%e5%a0%b1%e5%8f%96%e5%be%97%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6" class="header-anchor"&gt;&lt;/a&gt;GPU の情報取得について
&lt;/h4&gt;&lt;p&gt;NVIDIA の GPU の情報を取得するために以下を指定しています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;NVIDIA_VISIBLE_DEVICES=all&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;NVIDIA_DRIVER_CAPABILITIES=all&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;reservations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;gpu]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/usr/bin/nvidia-smi:/usr/bin/nvidia-smi:ro&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これについては以下の記事を参照してください。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/usr/bin/nvidia-smi&lt;/code&gt; のパスは環境によっては異なるかもしれません。&lt;/p&gt;
&lt;h4 id="docker-の情報取得について"&gt;&lt;a href="#docker-%e3%81%ae%e6%83%85%e5%a0%b1%e5%8f%96%e5%be%97%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6" class="header-anchor"&gt;&lt;/a&gt;Docker の情報取得について
&lt;/h4&gt;&lt;p&gt;Docker の情報を取得するためには &lt;code&gt;/var/run/docker.sock&lt;/code&gt; をマウントする必要があります。&lt;br&gt;
さらに Telegraf の実行ユーザーが docker.sock にアクセスできるように、&lt;code&gt;user&lt;/code&gt; を設定する必要があります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${TELEGRAF_UID_GID:?}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これについては以下の記事を参照してください。&lt;/p&gt;
&lt;h4 id="ホスト名の指定"&gt;&lt;a href="#%e3%83%9b%e3%82%b9%e3%83%88%e5%90%8d%e3%81%ae%e6%8c%87%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;ホスト名の指定
&lt;/h4&gt;&lt;p&gt;Telegraf がメトリクスを InfluxDB に記録する際、ホスト名も記録されますが、Docker コンテナのホスト名はデフォルトだとランダムな値となり、このままでよくわからないので、設定します。&lt;br&gt;
ここではホストマシンと同じホスト名を指定しました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hostname: ${HOSTNAME:?}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これについては以下の記事を参照してください。&lt;/p&gt;
&lt;h3 id="influxdb-について"&gt;&lt;a href="#influxdb-%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6" class="header-anchor"&gt;&lt;/a&gt;InfluxDB について
&lt;/h3&gt;&lt;p&gt;初回起動時にデフォルトのリテンションポリシーを設定するために以下を指定しています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_INFLUXDB_INIT_MODE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;setup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_INFLUXDB_INIT_RETENTION&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;10d&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>docker-compose のアップデート方法</title><link>https://blog.ponkotools.com/posts/2022/09/12/docker-compose/</link><pubDate>Mon, 12 Sep 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/09/12/docker-compose/</guid><description>&lt;p&gt;apt でインストールした docker-compose のバージョンが古いので、手動でアップデートする方法です。&lt;/p&gt;
&lt;p&gt;docker-compose のリリースビルド一覧は以下で確認できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/docker/compose/releases" target="_blank" rel="noopener"
 &gt;https://github.com/docker/compose/releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在インストールされている docker-compose をアンインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compose&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# カーネル名を小文字にするため一度変数 kernel に代入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;=$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uname&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ダウンロード&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;wget&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compose&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;compose&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;releases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;10.2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compose&lt;/span&gt;&lt;span class="o"&gt;-$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;,,}&lt;/span&gt;&lt;span class="o"&gt;-$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uname&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 実行権限の付与&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;chmod&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compose&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一応これで intel 系と arm 系で上手くいくことは確認しました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/docker/compose/releases" target="_blank" rel="noopener"
 &gt;https://github.com/docker/compose/releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] コンテナ内の実行ユーザーをホストのユーザーと合わせる</title><link>https://blog.ponkotools.com/posts/2022/08/30/docker/</link><pubDate>Tue, 30 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/30/docker/</guid><description>&lt;p&gt;Docker コンテナにホストのディレクトリをマウントしている場合、コンテナ内の実行ユーザーとホストのユーザーが一致していないと、コンテナ内で作成されたファイルにアクセス権限がなくて困ることがあります。&lt;/p&gt;
&lt;p&gt;これはコンテナ内の実行ユーザーをホストのユーザーと合わせることで解決できますが、じゃあユーザーの指定はどうするのが一番良いか？
ということで、以下の記事がとても参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yohm/items/047b2e68d008ebb0f001" target="_blank" rel="noopener"
 &gt;https://qiita.com/yohm/items/047b2e68d008ebb0f001&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ほとんどの場合、以下で上手く行くそうです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /etc/group:/etc/group:ro &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /etc/passwd:/etc/passwd:ro &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -u &lt;span class="k"&gt;$(&lt;/span&gt;id -u &lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;:&lt;span class="k"&gt;$(&lt;/span&gt;id -g &lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ubuntu bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;私の場合もこれで上手く行きました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/yohm/items/047b2e68d008ebb0f001" target="_blank" rel="noopener"
 &gt;https://qiita.com/yohm/items/047b2e68d008ebb0f001&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Telegraf で CPU の温度を取得する</title><link>https://blog.ponkotools.com/posts/2022/08/24/telegraf/</link><pubDate>Wed, 24 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/24/telegraf/</guid><description>&lt;p&gt;タイトルの通りです。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cpu-の温度観測プローブを調べる"&gt;&lt;a href="#cpu-%e3%81%ae%e6%b8%a9%e5%ba%a6%e8%a6%b3%e6%b8%ac%e3%83%97%e3%83%ad%e3%83%bc%e3%83%96%e3%82%92%e8%aa%bf%e3%81%b9%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;CPU の温度観測プローブを調べる
&lt;/h2&gt;&lt;p&gt;以下の記事が参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/koara-local/items/1fac13704123717f5cc8" target="_blank" rel="noopener"
 &gt;https://qiita.com/koara-local/items/1fac13704123717f5cc8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;/sys/class/thermal&lt;/code&gt; に &lt;code&gt;thermal_zone0&lt;/code&gt; 〜 &lt;code&gt;thermal_zone3&lt;/code&gt; の４つのディレクトリがあり、このうちのどれかが CPU の温度観測用のファイルのようです。&lt;br&gt;
これらの中にある &lt;code&gt;type&lt;/code&gt; ファイルを見ることで、何の温度を表しているかが分かるようです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /sys/class/thermal/thermal_zone0/type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acpitz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /sys/class/thermal/thermal_zone1/type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acpitz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /sys/class/thermal/thermal_zone2/type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pch_skylake
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /sys/class/thermal/thermal_zone3/type
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_pkg_temp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;どうやら私の環境では &lt;code&gt;thermal_zone3&lt;/code&gt; が CPU の温度のようです。&lt;br&gt;
なので、&lt;code&gt;/sys/class/thermal/thermal_zone3/temp&lt;/code&gt; を見ることで CPU の温度が取得できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /sys/class/thermal/thermal_zone3/temp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;35000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;1000 倍された値が表示されるので、上記の場合 35℃ です。&lt;/p&gt;
&lt;h2 id="telegraf-の設定"&gt;&lt;a href="#telegraf-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Telegraf の設定
&lt;/h2&gt;&lt;p&gt;上記のファイルを監視するように、&lt;code&gt;telegraf.conf&lt;/code&gt; に以下を記述するだけです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[[&lt;/span&gt;inputs.file&lt;span class="o"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/sys/class/thermal/thermal_zone3/temp&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;name_override&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cpu_temperature&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;data_format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;data_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;integer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/koara-local/items/1fac13704123717f5cc8" target="_blank" rel="noopener"
 &gt;https://qiita.com/koara-local/items/1fac13704123717f5cc8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://goozenlab.github.io/blog/2019/08/telegraf-pi-install/" target="_blank" rel="noopener"
 &gt;https://goozenlab.github.io/blog/2019/08/telegraf-pi-install/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.htkyama.org/telegraf_influxdb_grafana" target="_blank" rel="noopener"
 &gt;https://blog.htkyama.org/telegraf_influxdb_grafana&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>overlayroot 環境内で docker を使う方法</title><link>https://blog.ponkotools.com/posts/2022/08/19/overlayroot/</link><pubDate>Fri, 19 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/19/overlayroot/</guid><description>&lt;p&gt;overlayroot でルートファイルシステムを読み取り専用にしたところ、docker が使えなくなりました。&lt;/p&gt;
&lt;p&gt;OS は Ubuntu 20.04 です。&lt;br&gt;
overlayroot を有効にする方法などについては以前の記事を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="問題点"&gt;&lt;a href="#%e5%95%8f%e9%a1%8c%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;問題点
&lt;/h2&gt;&lt;p&gt;Docker がインストールされている環境で、overlayroot でルートファイルシステムを読み取り専用にした場合、docker コマンドを実行すると以下のようなエラーが発生します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いろいろ調べてみた結果、基本的に overlayroot が有効な状態では docker は使えないようです。&lt;br&gt;
一応以下にあるやり方で docker コンテナを立ち上げるところまではできました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link" target="_blank" rel="noopener"
 &gt;https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/docker/for-linux/issues/775" target="_blank" rel="noopener"
 &gt;https://github.com/docker/for-linux/issues/775&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;しかし、そもそも Docker ボリュームには DB のデータなどを逐次格納していっているので、tmpfs 上（＝メモリ上）だとメモリがすぐ枯渇してしまいそうです。&lt;br&gt;
また、Docker コンテナ・イメージをアップデートしたい場合にも困ります。&lt;/p&gt;
&lt;p&gt;というわけで、少なくとも &lt;code&gt;/var/lib/docker&lt;/code&gt; の領域はパーティションを分けるしかないじゃないかというところに行き着きました。&lt;br&gt;
以下のページでも書き込み可能としたい場合はパーティションを分ける方法が紹介されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://armadillo.atmark-techno.com/index.php/blog/10899/8648" target="_blank" rel="noopener"
 &gt;https://armadillo.atmark-techno.com/index.php/blog/10899/8648&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、Docker に関するベストプラクティスでも、コンテナ用にパーティションを分けるとあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.creationline.com/lab/aquasecurity/43087" target="_blank" rel="noopener"
 &gt;https://www.creationline.com/lab/aquasecurity/43087&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その上で、Docker コンテナも read-only で起動すれば、ルートファイルシステムだけでなく Docker コンテナも保護できそうです。&lt;/p&gt;
&lt;h2 id="対処方法"&gt;&lt;a href="#%e5%af%be%e5%87%a6%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;対処方法
&lt;/h2&gt;&lt;p&gt;とりあえず以下のようにパーティションを分けることで overlayroot と docker の共存ができました。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;パス&lt;/th&gt;
 &lt;th&gt;マウントポイント&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;/dev/sda1&lt;/td&gt;
 &lt;td&gt;EFI システムパーティション&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;/dev/sda2&lt;/td&gt;
 &lt;td&gt;/&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;/dev/sda3&lt;/td&gt;
 &lt;td&gt;/var&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この状態で overlayroot をインストールし、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に &lt;code&gt;overlayroot=&amp;quot;tmpfs:recurse=0&amp;quot;&lt;/code&gt; を記載します。
コマンド一発でやる場合は以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;overlayroot のインストールや設定については以前の記事を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はルートファイルシステムのみを読み取り専用にするので、&lt;code&gt;tmpfs:recurse=0&lt;/code&gt; を指定するらしいです。&lt;br&gt;
以下が参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これで再起動すれば、ルートファイルシステムのみが読み取り専用となり、&lt;code&gt;/var&lt;/code&gt; は読み書き可能な状態となります。&lt;br&gt;
docker も普通に使えました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link" target="_blank" rel="noopener"
 &gt;https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/docker/for-linux/issues/775" target="_blank" rel="noopener"
 &gt;https://github.com/docker/for-linux/issues/775&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://armadillo.atmark-techno.com/index.php/blog/10899/8648" target="_blank" rel="noopener"
 &gt;https://armadillo.atmark-techno.com/index.php/blog/10899/8648&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://armadillo.atmark-techno.com/forum/armadillo/7894" target="_blank" rel="noopener"
 &gt;https://armadillo.atmark-techno.com/forum/armadillo/7894&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://spin.atomicobject.com/2015/03/10/protecting-ubuntu-root-filesystem/" target="_blank" rel="noopener"
 &gt;https://spin.atomicobject.com/2015/03/10/protecting-ubuntu-root-filesystem/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kurosute.com/raspberrypi-overlayroot/" target="_blank" rel="noopener"
 &gt;https://kurosute.com/raspberrypi-overlayroot/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kakkie/items/c4a9a2f2a9e4e802ca0b" target="_blank" rel="noopener"
 &gt;https://qiita.com/kakkie/items/c4a9a2f2a9e4e802ca0b&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Rocket.Chat の REST API でダイレクトメッセージを送る</title><link>https://blog.ponkotools.com/posts/2022/08/17/rocketchat/</link><pubDate>Wed, 17 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/17/rocketchat/</guid><description>&lt;p&gt;アプリケーションから Rocket.Chat のユーザーに対してダイレクトメッセージを送りたかったので、調べてみたら、REST API を使うことでできました。&lt;/p&gt;
&lt;p&gt;使用した API の仕様は以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.rocket.chat/reference/api/rest-api/endpoints/core-endpoints/chat-endpoints/postmessage" target="_blank" rel="noopener"
 &gt;https://developer.rocket.chat/reference/api/rest-api/endpoints/core-endpoints/chat-endpoints/postmessage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば Windows の場合、以下のようなコマンドで動作を確認できました。&lt;br&gt;
（ユーザー名の部分だけ変更してください。）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl.exe -X POST^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &amp;#34;X-Auth-Token: &amp;lt;Token&amp;gt;&amp;#34;^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &amp;#34;X-User-Id: &amp;lt;User-Id&amp;gt;&amp;#34;^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &amp;#34;Content-type:application/json&amp;#34;^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; http://rocketchat-url/api/v1/chat.postMessage^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &amp;#34;{\&amp;#34;channel\&amp;#34;: \&amp;#34;@ユーザー名\&amp;#34;, \&amp;#34;msg\&amp;#34;: \&amp;#34;This is a direct message!\&amp;#34; }&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Token&lt;/code&gt; と &lt;code&gt;User-Id&lt;/code&gt; は、マイアカウント &amp;gt; パーソナルアクセストークン から作成できます。&lt;br&gt;
REST API の実行権限のあるアカウントで作成する必要があります。&lt;/p&gt;
&lt;p&gt;メッセージの内容については上記の API 仕様を参照してください。&lt;br&gt;
例えば、以下のようにして通知者名とアイコンを変更することができます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl.exe -X POST^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &amp;#34;X-Auth-Token: &amp;lt;Token&amp;gt;&amp;#34;^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &amp;#34;X-User-Id: &amp;lt;User-Id&amp;gt;&amp;#34;^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &amp;#34;Content-type:application/json&amp;#34;^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; http://rocketchat-url/api/v1/chat.postMessage^
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &amp;#34;{\&amp;#34;channel\&amp;#34;: \&amp;#34;@ユーザー名\&amp;#34;, \&amp;#34;msg\&amp;#34;: \&amp;#34;This is a direct message!\&amp;#34;, \&amp;#34;alias\&amp;#34;: \&amp;#34;ほげ\&amp;#34;, \&amp;#34;emoji\&amp;#34;: \&amp;#34;:thumbsup:\&amp;#34; }&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.rocket.chat/reference/api/rest-api/endpoints/core-endpoints/chat-endpoints/postmessage" target="_blank" rel="noopener"
 &gt;https://developer.rocket.chat/reference/api/rest-api/endpoints/core-endpoints/chat-endpoints/postmessage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/RocketChat/Rocket.Chat/issues/9113" target="_blank" rel="noopener"
 &gt;https://github.com/RocketChat/Rocket.Chat/issues/9113&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>InfluxDB のコンテナ作成時にデータベースとリテンションポリシーの作成を行う</title><link>https://blog.ponkotools.com/posts/2022/08/09/influxdb/</link><pubDate>Tue, 09 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/09/influxdb/</guid><description>&lt;p&gt;Docker を使って InfluxDB を動かしているのですが、データベースとリテンションポリシーをコンテナ起動時に作成できないかなと思い、調べてみたらやり方を見つけました。&lt;/p&gt;
&lt;p&gt;以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.easydevguide.com/posts/docker_influxdb_init" target="_blank" rel="noopener"
 &gt;https://www.easydevguide.com/posts/docker_influxdb_init&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;InfluxDB: 1.8.10&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="作成方法"&gt;&lt;a href="#%e4%bd%9c%e6%88%90%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;作成方法
&lt;/h2&gt;&lt;p&gt;まず適当な名前（ここでは &lt;code&gt;setup_influxdb.sh&lt;/code&gt;）でシェルスクリプトファイルを作成し、以下のような内容で記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# create database&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;influx -execute &lt;span class="s2"&gt;&amp;#34;CREATE DATABASE dbname&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# create retention policy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;influx -execute &lt;span class="s2"&gt;&amp;#34;CREATE RETENTION POLICY rpname ON dbname DURATION 30d REPLICATION 1 DEFAULT&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;dbname&lt;/code&gt;, &lt;code&gt;rpname&lt;/code&gt;, 保存期間などは適当に置き換えてください。&lt;/p&gt;
&lt;p&gt;これを、InfluxDB のコンテナ内の &lt;code&gt;/docker-entrypoint-initdb.d/&lt;/code&gt; に配置します。&lt;br&gt;
例えば、私の場合は docker-compse を使っているので、以下のようにマウントしました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;influxdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;influxdb:1.8.10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;influxdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expose&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;8086&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;influxdb:/var/lib/influxdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./setup_influxdb.sh:/docker-entrypoint-initdb.d/setup_influxdb.sh:ro&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;influxdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでコンテナ起動時にスクリプトが実行され、データベースとリテンションポリシーが作成されます。&lt;/p&gt;
&lt;h2 id="確認方法"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;確認方法
&lt;/h2&gt;&lt;p&gt;まずコンテナに入ります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it influxdb bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;データベースの一覧は以下で確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# influx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; show databases
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;リテンションポリシーの一覧は以下で確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# influx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; use dbname
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; show retention policies
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.easydevguide.com/posts/docker_influxdb_init" target="_blank" rel="noopener"
 &gt;https://www.easydevguide.com/posts/docker_influxdb_init&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.magata.net/memo/index.php?InfluxDB%C6%FE%CC%E7" target="_blank" rel="noopener"
 &gt;https://www.magata.net/memo/index.php?InfluxDB%C6%FE%CC%E7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu に nginx を入れてリバースプロキシとして使用する</title><link>https://blog.ponkotools.com/posts/2022/08/05/ubuntu-nginx/</link><pubDate>Fri, 05 Aug 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/08/05/ubuntu-nginx/</guid><description>&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;http://localhost にアクセスして nginx が起動していることを確認します。&lt;/p&gt;
&lt;h2 id="設定"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;設定
&lt;/h2&gt;&lt;p&gt;nginx の設定ファイルは &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt; ですが、この中を見ると、http ディレクティブの中に以下の記述があります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;##
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Virtual Host Configs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;##
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;include /etc/nginx/conf.d/*.conf;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;include /etc/nginx/sites-enabled/*;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;conf.d&lt;/code&gt; と &lt;code&gt;sites-enabled&lt;/code&gt; の中に置いた設定ファイルが読み込まれるようになっています。&lt;br&gt;
２つの使い分けについては以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/tomokon/items/e782636c1e5ec6b5dfdc" target="_blank" rel="noopener"
 &gt;https://qiita.com/tomokon/items/e782636c1e5ec6b5dfdc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というわけで、&lt;code&gt;sites-available&lt;/code&gt; に設定ファイルを作成して、&lt;code&gt;sites-enabled&lt;/code&gt; にシンボリックリンクを作成します。&lt;/p&gt;
&lt;h3 id="conf-ファイルの追加"&gt;&lt;a href="#conf-%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e8%bf%bd%e5%8a%a0" class="header-anchor"&gt;&lt;/a&gt;conf ファイルの追加
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/nginx/sites-available/sample.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80 default_server;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name _;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://localhost:5000;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_http_version 1.1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Upgrade $http_upgrade;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Connection keep-alive;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Host $host;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_cache_bypass $http_upgrade;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header X-Forwarded-Proto $scheme;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;server_name&lt;/code&gt; の &lt;code&gt;_;&lt;/code&gt; は catch-all の意味らしく、任意の URL に対して有効になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://nginx.org/en/docs/http/server_names.html" target="_blank" rel="noopener"
 &gt;http://nginx.org/en/docs/http/server_names.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;proxy_pass&lt;/code&gt; が遷移先の URL です。&lt;br&gt;
その他の設定については以下を参考にさせてもらいました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://lh182051.hateblo.jp/entry/2019/11/22/010641" target="_blank" rel="noopener"
 &gt;https://lh182051.hateblo.jp/entry/2019/11/22/010641&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="デフォルトの設定の削除"&gt;&lt;a href="#%e3%83%87%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%81%ae%e5%89%8a%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;デフォルトの設定の削除
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;sites-enabled&lt;/code&gt; の中には最初から &lt;code&gt;default&lt;/code&gt; という設定へのシンボリックリンクがあります。&lt;br&gt;
設定内容次第ではこの default の設定が邪魔になることもあるので、そのような場合は削除しておきます。&lt;/p&gt;
&lt;p&gt;今回の場合は &lt;code&gt;default_server&lt;/code&gt; と &lt;code&gt;server_name _;&lt;/code&gt; が重複しているので、削除しておかないと上手くルーティングできません。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo rm /etc/nginx/sites-enabled/default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="シンボリックリンクの作成"&gt;&lt;a href="#%e3%82%b7%e3%83%b3%e3%83%9c%e3%83%aa%e3%83%83%e3%82%af%e3%83%aa%e3%83%b3%e3%82%af%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;シンボリックリンクの作成
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo ln -s /etc/nginx/sites-available/sample.conf /etc/nginx/sites-enabled/sample
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;nginx を再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl restart nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上で完了です。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/ja-jp/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/2-2-install-nginx-configure-it-reverse-proxy" target="_blank" rel="noopener"
 &gt;https://docs.microsoft.com/ja-jp/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/2-2-install-nginx-configure-it-reverse-proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gist.github.com/kenjiskywalker/4698573" target="_blank" rel="noopener"
 &gt;https://gist.github.com/kenjiskywalker/4698573&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Rocket.Chat の読み取りチャンネルで絵文字の追加を許可する</title><link>https://blog.ponkotools.com/posts/2022/07/15/rocketchat/</link><pubDate>Fri, 15 Jul 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/07/15/rocketchat/</guid><description>&lt;p&gt;デフォルトだと読み込み専用チャンネルでは絵文字（リアクション）の追加ができませんが、設定を変更すればできるようになります。&lt;/p&gt;
&lt;p&gt;チャンネルの設定画面で「反応を許可する」を ON にすればいいだけですが、これを設定できるのはデフォルトだと Admin または Owner 権限を持つユーザーのみです。&lt;/p&gt;
&lt;p&gt;他のロールにもこの権限を付与したい場合は、root でログインし、「管理 &amp;gt; 権限」を選択し、「ReadOnly時の反応を設定する」にチェックを入れます。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://martinschoeler.github.io/docs/administrator-guides/permissions/" target="_blank" rel="noopener"
 &gt;https://martinschoeler.github.io/docs/administrator-guides/permissions/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Telegraf が docker.sock にアクセスできない</title><link>https://blog.ponkotools.com/posts/2022/07/02/telegraf/</link><pubDate>Sat, 02 Jul 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/07/02/telegraf/</guid><description>&lt;p&gt;Docker コンテナ内で Telegraf を動かして、Docker の情報を収集するには &lt;code&gt;/var/run/docker.sock&lt;/code&gt; をマウントする必要がありますが、それだけでは以下のように &lt;code&gt;Got permission denied&lt;/code&gt; のエラーが表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;E! &lt;span class="o"&gt;[&lt;/span&gt;inputs.docker&lt;span class="o"&gt;]&lt;/span&gt; Error in plugin: Got permission denied &lt;span class="k"&gt;while&lt;/span&gt; trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get &lt;span class="s2"&gt;&amp;#34;http://%2Fvar%2Frun%2Fdocker.sock/v1.24/info&amp;#34;&lt;/span&gt;: dial unix /var/run/docker.sock: connect: permission denied
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;E! &lt;span class="o"&gt;[&lt;/span&gt;inputs.docker&lt;span class="o"&gt;]&lt;/span&gt; Error in plugin: Got permission denied &lt;span class="k"&gt;while&lt;/span&gt; trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get &lt;span class="s2"&gt;&amp;#34;http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?filters=%7B%22status%22%3A%7B%22running%22%3Atrue%7D%7D&amp;amp;limit=0&amp;#34;&lt;/span&gt;: dial unix /var/run/docker.sock: connect: permission denied
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Telegraf の 1.20.3 以降、Telegraf の実行ユーザーは &lt;code&gt;telegraf&lt;/code&gt; という非 root ユーザーに変わったらしいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.influxdata.com/blog/docker-run-telegraf-as-non-root/" target="_blank" rel="noopener"
 &gt;https://www.influxdata.com/blog/docker-run-telegraf-as-non-root/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なので、Telegraf の実行ユーザーが docker コマンドを実行できるように、以下のように &lt;code&gt;user&lt;/code&gt; を指定する必要があるそうです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%g&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-compose-の場合"&gt;&lt;a href="#docker-compose-%e3%81%ae%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;docker-compose の場合
&lt;/h2&gt;&lt;p&gt;yml 内ではシェル変数を参照できないので、あらかじめ環境変数を設定しておくなど、少し工夫が必要です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;TELEGRAF_UID_GID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;telegraf:&lt;span class="k"&gt;$(&lt;/span&gt;stat -c &lt;span class="s1"&gt;&amp;#39;%g&amp;#39;&lt;/span&gt; /var/run/docker.sock&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; で環境変数を参照します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${TELEGRAF_UID_GID}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここらへんについては以下の記事が参考になると思います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/06/docker-composeyml-hostname.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/06/docker-composeyml-hostname.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.influxdata.com/blog/docker-run-telegraf-as-non-root/" target="_blank" rel="noopener"
 &gt;https://www.influxdata.com/blog/docker-run-telegraf-as-non-root/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>docker-compose.yml での環境変数の参照とデフォルト値の設定</title><link>https://blog.ponkotools.com/posts/2022/07/01/docker-compose/</link><pubDate>Fri, 01 Jul 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/07/01/docker-compose/</guid><description>&lt;p&gt;公式ドキュメントを見ていろいろ設定方法があることを知ったのでメモです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/compose/compose-file/#interpolation" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/compose/compose-file/#interpolation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下、ほぼ訳しただけです。&lt;/p&gt;
&lt;h2 id="環境変数の参照"&gt;&lt;a href="#%e7%92%b0%e5%a2%83%e5%a4%89%e6%95%b0%e3%81%ae%e5%8f%82%e7%85%a7" class="header-anchor"&gt;&lt;/a&gt;環境変数の参照
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;$VARIABLE&lt;/code&gt; または &lt;code&gt;${VARIABLE}&lt;/code&gt; で参照できます。&lt;br&gt;
もし &lt;code&gt;VARIABLE&lt;/code&gt; が定義されていなければ、空文字に置換されます。&lt;/p&gt;
&lt;h2 id="補間-interpolation"&gt;&lt;a href="#%e8%a3%9c%e9%96%93-interpolation" class="header-anchor"&gt;&lt;/a&gt;補間 (interpolation)
&lt;/h2&gt;&lt;p&gt;以下のようにして、環境変数が設定されていない場合のデフォルト値を指定できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;${VARIABLE:-default}&lt;/code&gt; とすると、環境変数 &lt;code&gt;VARIABLE&lt;/code&gt; が定義されていないか空の場合に &lt;code&gt;default&lt;/code&gt; に置換されます。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${VARIABLE-default}&lt;/code&gt; とすると、環境変数 &lt;code&gt;VARIABLE&lt;/code&gt; が定義されていない場合に &lt;code&gt;default&lt;/code&gt; に置換されます。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同様に、以下のように必須変数を指定できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;${VARIABLE:?err}&lt;/code&gt; とすると、環境変数 &lt;code&gt;VARIABLE&lt;/code&gt; が定義されていないか空の場合にエラーとなります。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;${VARIABLE?err}&lt;/code&gt; とすると、環境変数 &lt;code&gt;VARIABLE&lt;/code&gt; が定義されていない場合にエラーとなります。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="yaml-のアンカーエイリアス機能"&gt;&lt;a href="#yaml-%e3%81%ae%e3%82%a2%e3%83%b3%e3%82%ab%e3%83%bc%e3%82%a8%e3%82%a4%e3%83%aa%e3%82%a2%e3%82%b9%e6%a9%9f%e8%83%bd" class="header-anchor"&gt;&lt;/a&gt;yaml のアンカー/エイリアス機能
&lt;/h2&gt;&lt;p&gt;以下の記事で初めて知ったのですが、&lt;code&gt;x-&lt;/code&gt; で始まるキーを書くことで、docker-compose で無視されるようになるそうです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://techracho.bpsinc.jp/hachi8833/2020_02_07/87447" target="_blank" rel="noopener"
 &gt;https://techracho.bpsinc.jp/hachi8833/2020_02_07/87447&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/compose/compose-file/#interpolation" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/compose/compose-file/#interpolation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/JhonnyBravo/items/588bf82dcd34c081e326" target="_blank" rel="noopener"
 &gt;https://qiita.com/JhonnyBravo/items/588bf82dcd34c081e326&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://techracho.bpsinc.jp/hachi8833/2020_02_07/87447" target="_blank" rel="noopener"
 &gt;https://techracho.bpsinc.jp/hachi8833/2020_02_07/87447&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>docker-compose.yml で HOSTNAME が参照できない？</title><link>https://blog.ponkotools.com/posts/2022/06/30/docker-compose/</link><pubDate>Thu, 30 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/30/docker-compose/</guid><description>&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; で &lt;code&gt;$HOSTNAME&lt;/code&gt; と記述すると以下のようなエラーが表示され、かなりはまってしまいました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The HOSTNAME variable is not set. Defaulting to a blank string
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ubuntu では &lt;code&gt;HOSTNAME&lt;/code&gt; が export されていないそうなので、環境変数として参照できないようです。&lt;br&gt;
どうやらかなり昔からの仕様のようですが、Ubuntu 20.04 でも状況は変わっていません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ubuntuforums.org/archive/index.php/t-898924.html" target="_blank" rel="noopener"
 &gt;https://ubuntuforums.org/archive/index.php/t-898924.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;私は誤解していましたが、&lt;code&gt;HOSTNAME&lt;/code&gt; は環境変数ではなくシェル変数です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/blueskyarea/items/7e8bd6efcc538746a569" target="_blank" rel="noopener"
 &gt;https://qiita.com/blueskyarea/items/7e8bd6efcc538746a569&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.linux-beginner.com/linux_kihon170.html" target="_blank" rel="noopener"
 &gt;http://www.linux-beginner.com/linux_kihon170.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そして、export されていないから環境変数として yml からは参照できないと。&lt;br&gt;
なので、以下のようにすれば参照できるようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; HOSTNAME &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker-compose up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;毎回 export するのが面倒な場合は &lt;code&gt;.bashrc&lt;/code&gt; に書いておくのがいいかもしれません。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ubuntuforums.org/archive/index.php/t-898924.html" target="_blank" rel="noopener"
 &gt;https://ubuntuforums.org/archive/index.php/t-898924.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/blueskyarea/items/7e8bd6efcc538746a569" target="_blank" rel="noopener"
 &gt;https://qiita.com/blueskyarea/items/7e8bd6efcc538746a569&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.linux-beginner.com/linux_kihon170.html" target="_blank" rel="noopener"
 &gt;http://www.linux-beginner.com/linux_kihon170.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Portainer API を使って Docker Engine API を叩いてみる</title><link>https://blog.ponkotools.com/posts/2022/06/27/portainer/</link><pubDate>Mon, 27 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/27/portainer/</guid><description>&lt;p&gt;Docker を WebUI で操作できる Portainer には API が用意されており、これを使えば Portainer の UI でできることを全て自動化できます。また、Portainer API を介して Docker Engine API も叩くことができるので試してみました。&lt;/p&gt;
&lt;p&gt;Portainer の API のドキュメントは以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.portainer.io/api/docs" target="_blank" rel="noopener"
 &gt;https://docs.portainer.io/api/docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker Engine API のドキュメントは以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/engine/api/v1.41/" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/engine/api/v1.41/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python + aiohttp で実装してみました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker 20.10.12&lt;/li&gt;
&lt;li&gt;Portainer 2.13.1&lt;/li&gt;
&lt;li&gt;Python 3.8.10&lt;/li&gt;
&lt;li&gt;aiohttp 3.8.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="サンプルコード"&gt;&lt;a href="#%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%82%b3%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;サンプルコード
&lt;/h2&gt;&lt;p&gt;細かい解説は後にして、先にコード全体を載せます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;asyncio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;aiohttp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PORTAINER_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://portainer_url&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientSession&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# トークンを取得&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PORTAINER_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;/api/auth&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Admin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;AdminPassword&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;jwt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;jwt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ヘッダー&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Authorization&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;jwt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#headers={ &amp;#39;X-API-Key&amp;#39;: &amp;#39;token&amp;#39; }&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# EnvironmentID を取得&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PORTAINER_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;/api/endpoint_groups&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;environments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;environments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# コンテナ一覧の取得&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PORTAINER_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;/api/endpoints/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;/docker/containers/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;all&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;true&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;containers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="トークンの取得"&gt;&lt;a href="#%e3%83%88%e3%83%bc%e3%82%af%e3%83%b3%e3%81%ae%e5%8f%96%e5%be%97" class="header-anchor"&gt;&lt;/a&gt;トークンの取得
&lt;/h3&gt;&lt;p&gt;Portainer のアカウントを使って JWT トークンを取得します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PORTAINER_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;/api/auth&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Admin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;AdminPassword&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;jwt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;jwt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このトークンは8時間の間だけ有効だそうです。&lt;br&gt;
または、Portainer の myaccount 画面からでも API トークンを発行できます。&lt;br&gt;
それぞれヘッダーの書き方が少し異なります。&lt;/p&gt;
&lt;p&gt;前者の場合は&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Authorization&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;jwt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;後者の場合は&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;X-API-Key&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;token&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のように記述します。&lt;/p&gt;
&lt;h3 id="environmentendpoint-id-の取得"&gt;&lt;a href="#environmentendpoint-id-%e3%81%ae%e5%8f%96%e5%be%97" class="header-anchor"&gt;&lt;/a&gt;Environment(endpoint) ID の取得
&lt;/h3&gt;&lt;p&gt;Portainer は複数の Docker ホストを管理できるので、Docker Engine API を叩く際にはどのホストの Docker に対する操作かを指定する必要があります。　　　　
なので、Docker Engine API を叩く前に Environment の一覧を取得します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://app.swaggerhub.com/apis/portainer/portainer-ce/2.13.1#/endpoint_groups/EndpointGroupList" target="_blank" rel="noopener"
 &gt;https://app.swaggerhub.com/apis/portainer/portainer-ce/2.13.1#/endpoint_groups/EndpointGroupList&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PORTAINER_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;/api/endpoint_groups&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;environments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;environments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="コンテナの一覧を取得"&gt;&lt;a href="#%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%81%ae%e4%b8%80%e8%a6%a7%e3%82%92%e5%8f%96%e5%be%97" class="header-anchor"&gt;&lt;/a&gt;コンテナの一覧を取得
&lt;/h3&gt;&lt;p&gt;コンテナの一覧を取得してみます。&lt;br&gt;
API の仕様は以下を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/engine/api/v1.41/#tag/Container" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/engine/api/v1.41/#tag/Container&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Portainer のエンドポイント &lt;code&gt;/api/endpoints/{id}/docker&lt;/code&gt; より後ろが docker のエンドポイントと同じになるみたいですね。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PORTAINER_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;/api/endpoints/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;/docker/containers/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;all&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;true&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;containers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここまでやれば、後は大体のことができるんじゃないかと思います。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.portainer.io/api/docs" target="_blank" rel="noopener"
 &gt;https://docs.portainer.io/api/docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/engine/api/v1.41/" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/engine/api/v1.41/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>リバースプロキシの背後で Grafana を動かす</title><link>https://blog.ponkotools.com/posts/2022/06/24/grafana/</link><pubDate>Fri, 24 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/24/grafana/</guid><description>&lt;p&gt;サーバー側だけでなく Grafana 側の設定も行う必要があったのでメモです。&lt;/p&gt;
&lt;p&gt;一応公式ドキュメントに方法が載っています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/tutorials/run-grafana-behind-a-proxy/" target="_blank" rel="noopener"
 &gt;https://grafana.com/tutorials/run-grafana-behind-a-proxy/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はサブディレクトリで設定したかったのと、Grafana を docker-compose で動かしていたので、&lt;code&gt;docker-compose.yml&lt;/code&gt; の環境変数で以下のように設定しました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/grafana/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;GF_SERVER_SERVE_FROM_SUB_PATH=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;サーバー側の設定は普通にリバースプロキシの設定を行うだけなので省略します。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/tutorials/run-grafana-behind-a-proxy/" target="_blank" rel="noopener"
 &gt;https://grafana.com/tutorials/run-grafana-behind-a-proxy/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ryotaro76/items/22fa5e877eaab8b567e1" target="_blank" rel="noopener"
 &gt;https://qiita.com/ryotaro76/items/22fa5e877eaab8b567e1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] ログドライバーでログの出力先を syslog に設定する</title><link>https://blog.ponkotools.com/posts/2022/06/23/docker/</link><pubDate>Thu, 23 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/23/docker/</guid><description>&lt;p&gt;Docker コンテナで標準出力されているログを syslog に記録するようにログドライバーを設定します。&lt;/p&gt;
&lt;p&gt;Docker のログドライバーで設定できるものには他にもいろいろあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/logging/configure/" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/logging/configure/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;オプションはログドライバーによって異なるようで、syslog の場合は以下になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/logging/syslog/" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/logging/syslog/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上を踏まえ、docker-compose でログドライバーを設定する例が以下になります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;syslog&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;my-app-name&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;デフォルトでは &lt;code&gt;appname&lt;/code&gt; がコンテナIDになって分かりづらいので、&lt;code&gt;tag&lt;/code&gt; で設定しています。&lt;/p&gt;
&lt;h2 id="余談"&gt;&lt;a href="#%e4%bd%99%e8%ab%87" class="header-anchor"&gt;&lt;/a&gt;余談
&lt;/h2&gt;&lt;p&gt;コンテナ内で動かしている Python のアプリケーションでは、もともと logging モジュールで syslog に記録するよう設定していました。&lt;br&gt;
これを標準出力にし、Docker のログドライバーで設定できるようにすれば、コンテナを使う側が出力先を決められて便利かなと思いました。&lt;/p&gt;
&lt;p&gt;しかし、Python 側では5段階に分けられていたログレベルが、標準出力を介すことで、Info (stdout) と Error (stderr) の2レベルに平坦化されてしまうことが分かり、結局 Python 側で syslog に記録するようにしました。&lt;/p&gt;
&lt;p&gt;もしかしたから何か上手いやり方があるのかもしれませんが・・・。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/Esfahan/items/5e5a9ae7882bb0eaaf5f" target="_blank" rel="noopener"
 &gt;https://qiita.com/Esfahan/items/5e5a9ae7882bb0eaaf5f&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] OpenCV + python のマルチステージビルドを行う</title><link>https://blog.ponkotools.com/posts/2022/06/20/docker/</link><pubDate>Mon, 20 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/20/docker/</guid><description>&lt;p&gt;Python の OpenCV で GStreamer を使う場合、自前でビルドする必要があり、そのための Dockerfile を以前作成しました。&lt;/p&gt;
&lt;p&gt;その時の記事が以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2021/11/opencv-gstreamer.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2021/11/opencv-gstreamer.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただ、これで作成した Docker イメージのサイズが 2.5GB くらいあり、もっとサイズを小さくできないかなと考えていました。&lt;/p&gt;
&lt;p&gt;その過程でマルチステージビルドというものを知ったのですが、OpenCV のビルドの成果物をどうやって最後のステージに持ってきたらよいか分からず悩んでいたら、以下のページを見つけました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/NVIDIA/nvidia-docker/issues/806" target="_blank" rel="noopener"
 &gt;https://github.com/NVIDIA/nvidia-docker/issues/806&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/NVIDIA/gpu-rest-engine/blob/master/Dockerfile.caffe_server#L26-L41" target="_blank" rel="noopener"
 &gt;https://github.com/NVIDIA/gpu-rest-engine/blob/master/Dockerfile.caffe_server#L26-L41&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/63592138/opencv-docker-multistage-build-cannot-install-prebuilt-source" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/63592138/opencv-docker-multistage-build-cannot-install-prebuilt-source&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ビルドステージでは、&lt;code&gt;make install&lt;/code&gt; の後、&lt;code&gt;ldconfig&lt;/code&gt; で共有リンクを作成しています。&lt;br&gt;
リリースステージでは &lt;code&gt;/usr/local/lib&lt;/code&gt; 以下を全てコピーし、&lt;code&gt;ldconfig&lt;/code&gt; で共有リンクを作成しています。&lt;/p&gt;
&lt;p&gt;というわけで、これを参考にマルチステージビルドを行ってみました。
ただ、私の場合、&lt;code&gt;/usr/local/lib&lt;/code&gt; のコピーだけでは依存パッケージが不足していて動かなかったので、&lt;code&gt;/usr/lib&lt;/code&gt; と &lt;code&gt;/usr/share&lt;/code&gt; の中身も全部コピーしたら動くようになりました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;COPY --from=build /usr/lib /usr/lib
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;COPY --from=build /usr/share /usr/share
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;COPY --from=build /usr/local/lib /usr/local/lib
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RUN ldconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上で、イメージサイズを 1.9GB まで減らせました。&lt;br&gt;
ここらへん、本当に依存しているパッケージだけをコピーするようにできれば、まだまだサイズを小さくできそうではあります。&lt;/p&gt;
&lt;p&gt;以下、Dockerfile のサンプルです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Stage1: build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;20.04&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# tzdataのタイムゾーン入力を求められないようにする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://tmyoda.hatenablog.com/entry/20210124/1611416396&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ENV&lt;/span&gt; &lt;span class="n"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Asia&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Tokyo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;ln&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;snf&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;zoneinfo&lt;/span&gt;&lt;span class="o"&gt;/$&lt;/span&gt;&lt;span class="n"&gt;TZ&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;localtime&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;TZ&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;recommends&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;software&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;certificates&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 必要なパッケージをインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libgl1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mesa&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libsm6&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;git&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wget&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;unzip&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# OpenCV: Required build dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# https://docs.opencv.org/4.x/d2/de6/tutorial_py_setup_in_ubuntu.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cmake&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libavcodec&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libavformat&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libswscale&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libgtk2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libgtk&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# OpenCV: Optional Dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libpng&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libjpeg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libopenexr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libtiff&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libwebp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# OpenCV のビルド時に -D WITH_QT=ON を設定するために以下が必要だった&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;qtbase5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;qtdeclarative5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# gstreamer のインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# https://gstreamer.freedesktop.org/documentation/installing/on-linux.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libgstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libgstreamer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;base1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;libgstreamer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bad1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;good&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bad&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ugly&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;libav&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;alsa&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gl&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gtk3&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;qt5&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gstreamer1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pulseaudio&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# aptのクリア&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;autoremove&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;rm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rf&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;/*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# OpenCV のビルドとインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://docs.opencv.org/master/d2/de6/tutorial_py_setup_in_ubuntu.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://toriten1024.hatenablog.com/entry/2018/09/29/012205&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://dlrecord.hatenablog.com/entry/2017/12/15/145356&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://atmarkit.itmedia.co.jp/ait/articles/1704/10/news134.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="n"&gt;opencv&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opencv&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# OpenCV のダウンロード&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wget&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opencv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opencv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;archive&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;certificate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;unzip&lt;/span&gt; &lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# OpenCV の cmake&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opencv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opencv&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opencv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opencv&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cmake&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="n"&gt;CMAKE_BUILD_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RELEASE&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="n"&gt;BUILD_DOCS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OFF&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="n"&gt;BUILD_EXAMPLES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OFF&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="n"&gt;BUILD_TESTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OFF&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="n"&gt;WITH_1394&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OFF&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="n"&gt;WITH_GSTREAMER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ON&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="n"&gt;WITH_FFMPEG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ON&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# cv2.waitKey() を使うためには WITH_QT=ON にする必要があった&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="n"&gt;WITH_QT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ON&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# OpenCV のビルド ※ $(nproc) はコア数を返す、make を並列処理させて高速化したい場合は指定する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#make -j${nproc} &amp;amp;&amp;amp; \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#make -j2 &amp;amp;&amp;amp; \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ldconfig&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 後始末&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rf&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opencv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Stage2: release&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;20.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# tzdataのタイムゾーン入力を求められないようにする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://tmyoda.hatenablog.com/entry/20210124/1611416396&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ENV&lt;/span&gt; &lt;span class="n"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Asia&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Tokyo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;ln&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;snf&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;zoneinfo&lt;/span&gt;&lt;span class="o"&gt;/$&lt;/span&gt;&lt;span class="n"&gt;TZ&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;localtime&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;TZ&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 必要なパッケージをインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;recommends&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# aptのクリア&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;autoremove&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;rm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rf&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;/*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Copy binary and dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;COPY&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;COPY&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;COPY&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;ldconfig&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 必要なプラグインをインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;pip3&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rich&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ruamel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaml&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pymongo&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.12&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;influxdb&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;flask&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;flask&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cors&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pytest&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mock&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mongomock&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;websockets&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;trusted&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;pypi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;trusted&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pythonhosted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# bash起動&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CMD&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/bin/bash&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/NVIDIA/nvidia-docker/issues/806" target="_blank" rel="noopener"
 &gt;https://github.com/NVIDIA/nvidia-docker/issues/806&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/NVIDIA/gpu-rest-engine/blob/master/Dockerfile.caffe_server#L26-L41" target="_blank" rel="noopener"
 &gt;https://github.com/NVIDIA/gpu-rest-engine/blob/master/Dockerfile.caffe_server#L26-L41&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/63592138/opencv-docker-multistage-build-cannot-install-prebuilt-source" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/63592138/opencv-docker-multistage-build-cannot-install-prebuilt-source&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] コンテナ内からホストにアクセスする</title><link>https://blog.ponkotools.com/posts/2022/06/17/docker/</link><pubDate>Fri, 17 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/17/docker/</guid><description>&lt;p&gt;コンテナ内では &lt;code&gt;localhost&lt;/code&gt; はコンテナ自身を指すので使えません。&lt;br&gt;
かといってホストの IP アドレスを直接参照すると、IP アドレスが変わったときに困ります。&lt;/p&gt;
&lt;p&gt;このような場合、&lt;code&gt;host.docker.internal&lt;/code&gt; を使います。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;host.docker.internal&lt;/code&gt; はもともと Windows と Mac でしか使えなかったようですが、Docker 20.10 からLinux でも使えるようになったそうです。&lt;br&gt;
この機能を有効化するには &lt;code&gt;--add-host&lt;/code&gt; で &lt;code&gt;host.docker.internal:host-gateway&lt;/code&gt; を指定する必要があるようです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it --rm &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --add-host&lt;span class="o"&gt;=&lt;/span&gt;host.docker.internal:host-gateway &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;docker-compose の場合は &lt;code&gt;extra_hosts&lt;/code&gt; で指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;extra_hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;host.docker.internal:host-gateway&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/skobaken/items/03a8b9d0e443745862ac" target="_blank" rel="noopener"
 &gt;https://qiita.com/skobaken/items/03a8b9d0e443745862ac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://medium.com/@TimvanBaarsen/how-to-connect-to-the-docker-host-from-inside-a-docker-container-112b4c71bc66" target="_blank" rel="noopener"
 &gt;https://medium.com/@TimvanBaarsen/how-to-connect-to-the-docker-host-from-inside-a-docker-container-112b4c71bc66&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://uepon.hatenadiary.com/entry/2021/06/02/002613" target="_blank" rel="noopener"
 &gt;https://uepon.hatenadiary.com/entry/2021/06/02/002613&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%2Fdocker%2F%E8%A6%9A%E6%9B%B8" target="_blank" rel="noopener"
 &gt;https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%2Fdocker%2F%E8%A6%9A%E6%9B%B8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] コンテナ内からホストにアクセスする</title><link>https://blog.ponkotools.com/posts/2022/06/16/docker-traefik/</link><pubDate>Thu, 16 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/16/docker-traefik/</guid><description>&lt;p&gt;ググってもなかなかサンプルが見当たらずかなりはまりました。&lt;/p&gt;
&lt;p&gt;最終的には以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52" target="_blank" rel="noopener"
 &gt;https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker + Traefik の基本的な設定は以前の記事をご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/06/docker-traefik.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/06/docker-traefik.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker 20.10.12&lt;/li&gt;
&lt;li&gt;Traefik v2.7&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="イメージ図"&gt;&lt;a href="#%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e5%9b%b3" class="header-anchor"&gt;&lt;/a&gt;イメージ図
&lt;/h2&gt;&lt;p&gt;やりたいことは以下のような感じです。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1007px" data-flex-grow="419" height="121" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2022/06/16/docker-traefik/image.png" width="508"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;ホストのURL&amp;gt;/api1/&lt;/code&gt; へのアクセスはポート3000へ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;ホストのURL&amp;gt;/api2/&lt;/code&gt; へのアクセスはポート4000へ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="サンプル"&gt;&lt;a href="#%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;サンプル
&lt;/h2&gt;&lt;p&gt;簡単な解説をコメントに書いています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;4000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.enable=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#------------------------------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo という名前のルーターを定義し、エントリーポイント http と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.entrypoints=http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# リクエストパス /api1 とマッチするよう指定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.rule=PathPrefix(`/api1{regex:$$|/.*}`)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo-middleware という名前のミドルウェアを定義し、ルーター foo と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.middlewares=foo-middleware&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# サービスにリクエストを行う前にリクエストパスの先頭の /api1 を取り除くように指定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.middlewares.foo-middleware.stripprefix.prefixes=/api1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo-service という名前のサービスを定義し、ルーター foo と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.service=foo-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo-service へのアクセスをポート3000 へ飛ばす&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.services.foo-service.loadbalancer.server.port=3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#------------------------------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.entrypoints=http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.rule=PathPrefix(`/api2{regex:$$|/.*}`)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.middlewares=bar-middleware&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.middlewares.bar-middleware.stripprefix.prefixes=/api2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.service=bar-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.services.bar-service.loadbalancer.server.port=4000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ports&lt;/code&gt; でホストのポートとマッピングしていますが、実際には &lt;code&gt;expose&lt;/code&gt; でコンテナ側のポートを開けるだけのほうがよいと思います。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52" target="_blank" rel="noopener"
 &gt;https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2" target="_blank" rel="noopener"
 &gt;https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker + Traefik で複数のポートを公開しているコンテナのルーティングを行う</title><link>https://blog.ponkotools.com/posts/2022/06/15/docker-traefik/</link><pubDate>Wed, 15 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/15/docker-traefik/</guid><description>&lt;p&gt;ググってもなかなかサンプルが見当たらずかなりはまりました。&lt;/p&gt;
&lt;p&gt;最終的には以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2" target="_blank" rel="noopener"
 &gt;https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker + Traefik の基本的な設定は以前の記事をご覧ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/06/docker-traefik.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/06/docker-traefik.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker 20.10.12&lt;/li&gt;
&lt;li&gt;Traefik v2.7&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="イメージ図"&gt;&lt;a href="#%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e5%9b%b3" class="header-anchor"&gt;&lt;/a&gt;イメージ図
&lt;/h2&gt;&lt;p&gt;やりたいことは以下のような感じです。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1007px" data-flex-grow="419" height="121" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2022/06/15/docker-traefik/image.png" width="508"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;api1.localhost&lt;/code&gt; へのアクセスはポート3000へ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api2.localhost&lt;/code&gt; へのアクセスはポート4000へ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="サンプル"&gt;&lt;a href="#%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;サンプル
&lt;/h2&gt;&lt;p&gt;簡単な解説をコメントに書いています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;4000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.enable=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#------------------------------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo という名前のルーターを定義し、&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# エントリーポイント http (traefik側で設定した任意の名前) と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.entrypoints=http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ルーター foo のホスト名を &amp;#34;api1.localhost&amp;#34; に設定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.rule=Host(`api1.localhost`)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo-service という名前のサービスを定義し、ルーター foo と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.foo.service=foo-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# foo-service へのアクセスをポート3000 へ飛ばす&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.services.foo-service.loadbalancer.server.port=3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#------------------------------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.entrypoints=http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.rule=Host(`api2.localhost`)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.bar.service=bar-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.services.bar-service.loadbalancer.server.port=4000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ports&lt;/code&gt; でホストのポートとマッピングしていますが、実際には &lt;code&gt;expose&lt;/code&gt; でコンテナ側のポートを開けるだけのほうがよいと思います。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2" target="_blank" rel="noopener"
 &gt;https://community.traefik.io/t/docker-container-with-multiple-ports/4657/2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52" target="_blank" rel="noopener"
 &gt;https://qiita.com/shiitake256/items/a9cd1f525fd97c224f52&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker + Traefik でリバースプロキシサーバーを立てる</title><link>https://blog.ponkotools.com/posts/2022/06/14/docker-traefik/</link><pubDate>Tue, 14 Jun 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/06/14/docker-traefik/</guid><description>&lt;p&gt;最初 nginx でリバースプロキシサーバーを構築していたのですが、いろいろ調べていく中で Traefik というサーバーの存在を知りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://doc.traefik.io/traefik/" target="_blank" rel="noopener"
 &gt;https://doc.traefik.io/traefik/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;公式ではエッジルーターという言い方がされていますが、要はリバースプロキシ＋ロードバランサーという感じらしいです。&lt;br&gt;
nginx より後発で、Docker との親和性が高いとのことで試しに使ってみました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker: 20.10.12&lt;/li&gt;
&lt;li&gt;Traefik: v2.7&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Traefik 自身も Docker で動かします。&lt;/p&gt;
&lt;h2 id="docker-network-の作成"&gt;&lt;a href="#docker-network-%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;docker network の作成
&lt;/h2&gt;&lt;p&gt;アプリと Traefik で共通で使用するネットワークを作成しておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker network create sample-network
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="traefik-の設定"&gt;&lt;a href="#traefik-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Traefik の設定
&lt;/h2&gt;&lt;p&gt;Traefik の設定は &lt;code&gt;/etc/traefik/traefik.yml&lt;/code&gt; に記述する方法と、&lt;code&gt;docker-compose.yml&lt;/code&gt; で指定する方法があるようです。&lt;br&gt;
前者の例が多いですが、後者の方が &lt;code&gt;docker-compose.yml&lt;/code&gt; 一つで設定が完結して良いと思うのは私だけでしょうか？&lt;/p&gt;
&lt;h3 id="設定ファイルに記述する例"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ab%e8%a8%98%e8%bf%b0%e3%81%99%e3%82%8b%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;設定ファイルに記述する例
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;traefik.yml&lt;/code&gt; というファイルを作成して、以下のように記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Providers config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Docker との連携を有効にする&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# false に指定することで Label 付けしていない docker コンテナを Traefik が無視するようになる&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;exposedByDefault&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 使用するネットワーク&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sample-network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;entryPoints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# http という任意の名前のエントリーポイントを定義し、80番ポートをリッスンするよう指定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:80&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# API/Dashboard config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;api&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# WebUI にアクセスできるように設定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;insecure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Trafik を起動します。&lt;br&gt;
ネットには docker-compose を使った例が多いですが、とりあえず &lt;code&gt;docker run&lt;/code&gt; で動かしてみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it --rm &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name reverse-proxy &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --network sample-network &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;/traefik.yml:/etc/traefik/traefik.yml &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 80:80 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 8080:8080 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; traefik:v2.7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とりあえずこれで、http://localhost:8080 にアクセスすると Traefik の WebUI が表示されるかと思います。&lt;/p&gt;
&lt;h3 id="docker-composeyml-で設定する例"&gt;&lt;a href="#docker-composeyml-%e3%81%a7%e8%a8%ad%e5%ae%9a%e3%81%99%e3%82%8b%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml で設定する例
&lt;/h3&gt;&lt;p&gt;上記の設定を &lt;code&gt;docker-compose.yml&lt;/code&gt; のみで行った場合の例です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.9&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;reverse-proxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;traefik:v2.7&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ファイルで設定する場合は以下&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#- type: bind&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# source: ./traefik.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# target: /etc/traefik/traefik.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;sample-network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# traefik.yml の代わりに command で設定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;providers.docker.exposedByDefault=false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;providers.docker.network=sample-network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entryPoints.http.address=:80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entryPoints.https.address=:443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;api.insecure=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sample-network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;external&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アプリケーション側の設定"&gt;&lt;a href="#%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e5%81%b4%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;アプリケーション側の設定
&lt;/h2&gt;&lt;p&gt;ルーティングの設定などは全てコンテナのラベルで設定します。
他のサーバーだとサーバー側の設定を変更する必要がありますが、 Traefik+Docker だとコンテナの増減に対して対応しやすいなと思いました。&lt;/p&gt;
&lt;p&gt;とりあえず &lt;code&gt;docker run&lt;/code&gt; で動かしてみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -it --rm &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --network sample-network &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -l &lt;span class="s2"&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -l &lt;span class="s2"&gt;&amp;#34;traefik.http.routers.api.entrypoints=http&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -l &lt;span class="s2"&gt;&amp;#34;traefik.http.routers.api.rule=Host(\&amp;#34;api.localhost\&amp;#34;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sample_app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで &lt;a class="link" href="http://api.localhost/" target="_blank" rel="noopener"
 &gt;http://api.localhost/&lt;/a&gt; に該当のアプリにアクセスすれば繋がると思います。&lt;br&gt;
解説は次に書いてあります。&lt;/p&gt;
&lt;h3 id="docker-compose-での例"&gt;&lt;a href="#docker-compose-%e3%81%a7%e3%81%ae%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;docker-compose での例
&lt;/h3&gt;&lt;p&gt;上記の設定は、&lt;code&gt;docker-compose.yml&lt;/code&gt; で以下のように設定します。&lt;br&gt;
コメントで簡単な解説をつけておきました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Traefik の有効化(exposedByDefault:false に設定した場合に必要)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.enable=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# api という名前のルーターを定義し、&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# エントリーポイント http (traefik.yml で定義した名前) と関連付け&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.api.entrypoints=http&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ルーター api のホスト名を &amp;#34;api.localhost&amp;#34; に設定&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;traefik.http.routers.api.rule=Host(`api.localhost`)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;基本は以上です。&lt;br&gt;
他の詳細な設定については追々記事を書こうかなと思っています。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://coders-shelf.com/traefik-intro/" target="_blank" rel="noopener"
 &gt;https://coders-shelf.com/traefik-intro/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/adwin/items/ccc34ef5f4c88d8fa02c" target="_blank" rel="noopener"
 &gt;https://qiita.com/adwin/items/ccc34ef5f4c88d8fa02c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/navitime_tech/items/7566bdf80b5a34a86ca8" target="_blank" rel="noopener"
 &gt;https://qiita.com/navitime_tech/items/7566bdf80b5a34a86ca8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://big.tm.land.to/tips/traefik/setup/" target="_blank" rel="noopener"
 &gt;http://big.tm.land.to/tips/traefik/setup/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Portainer を Docker Swarm で動かす</title><link>https://blog.ponkotools.com/posts/2022/05/27/portainer-docker-swarm/</link><pubDate>Fri, 27 May 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/05/27/portainer-docker-swarm/</guid><description>&lt;p&gt;以前 Portainer を docker-compose で動かしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/portainer-docker-compose.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/portainer-docker-compose.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はこの Portainer を Docker Swarm が有効になっている環境で動かしてみます。&lt;br&gt;
クラスタを構成している全ノードが Portainer で管理できるようになります。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker 20.10.12&lt;/li&gt;
&lt;li&gt;Portainer 2.13.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="docker-swarm-の有効化"&gt;&lt;a href="#docker-swarm-%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;Docker Swarm の有効化
&lt;/h2&gt;&lt;p&gt;以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker swarm init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちょっと試すだけならばここまでで OK です。&lt;br&gt;
必要なら worker ノードの追加なども行ってください。&lt;/p&gt;
&lt;h2 id="portainer-の起動"&gt;&lt;a href="#portainer-%e3%81%ae%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;Portainer の起動
&lt;/h2&gt;&lt;p&gt;公式ドキュメントが以下になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.portainer.io/v/ce-2.9/start/install/agent/swarm/linux" target="_blank" rel="noopener"
 &gt;https://docs.portainer.io/v/ce-2.9/start/install/agent/swarm/linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こちらに yml ファイルの置き場所が記載されているので、Community Edition のほうのファイルをダウンロードします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -L https://downloads.portainer.io/ce2-13/portainer-agent-stack.yml -o portainer-agent-stack.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;中身はこんな感じです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;portainer/agent:2.13.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/lib/docker/volumes:/var/lib/docker/volumes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;agent_network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;global&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;placement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;constraints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;node.platform.os == linux]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;portainer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;portainer/portainer-ce:2.13.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="l"&gt;H tcp://tasks.agent:9001 --tlsskipverify&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;9443:9443&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;9000:9000&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;8000:8000&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;portainer_data:/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;agent_network&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;replicated&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;placement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;constraints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;node.role == manager]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;agent_network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;overlay&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;attachable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;portainer_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを &lt;code&gt;docker stack deploy&lt;/code&gt; で起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker stack deploy -c portainer-agent-stack.yml portainer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Creating network portainer_agent_network
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Creating service portainer_agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Creating service portainer_portainer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上で完了です。&lt;br&gt;
あとは http://localhost:9000 にアクセスすれば OK です。&lt;/p&gt;
&lt;p&gt;起動した portainer を停止・削除したい場合は以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker stack rm portainer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.portainer.io/v/ce-2.9/start/install/agent/swarm/linux" target="_blank" rel="noopener"
 &gt;https://docs.portainer.io/v/ce-2.9/start/install/agent/swarm/linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/polarbear08/items/931fe04ec228fad13092" target="_blank" rel="noopener"
 &gt;https://qiita.com/polarbear08/items/931fe04ec228fad13092&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker コンテナ内から Docker コマンドを使う</title><link>https://blog.ponkotools.com/posts/2022/05/26/docker/</link><pubDate>Thu, 26 May 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/05/26/docker/</guid><description>&lt;p&gt;Docker コンテナ内のアプリケーションから Docker コンテナの操作をしたかったので、やってみました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker 20.10.12&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dind-と-dood"&gt;&lt;a href="#dind-%e3%81%a8-dood" class="header-anchor"&gt;&lt;/a&gt;DinD と DooD
&lt;/h2&gt;&lt;p&gt;Docker コンテナ内から Docker を扱う方法としては以下の２つがあるようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DinD: Docker in Docker
&lt;ul&gt;
&lt;li&gt;Docker コンテナの中で Docker デーモンを動かす&lt;/li&gt;
&lt;li&gt;コンテナの中にコンテナを作成したりできる&lt;/li&gt;
&lt;li&gt;非推奨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DooD: Docker outside of Docker
&lt;ul&gt;
&lt;li&gt;ホストの docker.sock をコンテナにマウントし、Docker デーモンを共有する&lt;/li&gt;
&lt;li&gt;ホスト上の Docker コンテナを操作できる&lt;/li&gt;
&lt;li&gt;基本的にこちらを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここらへん以下のページが分かりやすかったです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/YukiMiyatake/items/2e68aa69a5ca3921d55d" target="_blank" rel="noopener"
 &gt;https://qiita.com/YukiMiyatake/items/2e68aa69a5ca3921d55d&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DinD は Docker の開発用途のためのものらしく、セキュリティリスクなどもあることから非推奨で、基本的には DooD のほうを使うべきだそうです。&lt;br&gt;
今回の用途的にも DooD のほうなので、DooD を試してみました。&lt;/p&gt;
&lt;h2 id="dood-サンプル"&gt;&lt;a href="#dood-%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;DooD サンプル
&lt;/h2&gt;&lt;p&gt;ググってみると以下のようなサンプルが多いです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it -v /var/run/docker.sock:/var/run/docker.sock docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;確かにこれでコンテナ内で docker コマンドが使えました。&lt;br&gt;
この場合では &lt;code&gt;docker&lt;/code&gt; という Docker 一式が入ったイメージを使っているので、&lt;code&gt;/var/run/docker.sock&lt;/code&gt; をマウントするだけで使えています。&lt;/p&gt;
&lt;p&gt;しかし、実際にはアプリケーションのランタイムイメージをベースとすることが多いと思います。&lt;br&gt;
試しに Ubuntu のイメージを使うと、以下のようにエラーになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:20.04
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# docker ps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash: docker: &lt;span class="nb"&gt;command&lt;/span&gt; not found
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker クライアントがインストールされていないからです。&lt;/p&gt;
&lt;p&gt;この場合、コンテナ内で &lt;code&gt;docker.io&lt;/code&gt; をインストールすれば docker コマンドが使えるようになります。&lt;br&gt;
ついでに &lt;code&gt;docker-compose&lt;/code&gt; もインストールしています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install -y docker.io docker-compose
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;というわけで、DooD では&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/var/run/docker.sock&lt;/code&gt; をマウント&lt;/li&gt;
&lt;li&gt;ベースイメージに Docker クライアントがインストールされていなければインストール&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;で、コンテナ内から Docker コマンドが使えるようになります。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/YukiMiyatake/items/2e68aa69a5ca3921d55d" target="_blank" rel="noopener"
 &gt;https://qiita.com/YukiMiyatake/items/2e68aa69a5ca3921d55d&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/minamijoyo/items/c937fb4f646dc1ff064a" target="_blank" rel="noopener"
 &gt;https://qiita.com/minamijoyo/items/c937fb4f646dc1ff064a&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.mtioutput.com/entry/docker-outside-of" target="_blank" rel="noopener"
 &gt;https://www.mtioutput.com/entry/docker-outside-of&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://devblog.pirika.org/entry/2021/10/05/113000" target="_blank" rel="noopener"
 &gt;https://devblog.pirika.org/entry/2021/10/05/113000&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu の IP アドレスを固定化する</title><link>https://blog.ponkotools.com/posts/2022/05/20/ubuntu/</link><pubDate>Fri, 20 May 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/05/20/ubuntu/</guid><description>&lt;p&gt;いつもは GUI で設定するのですが、あるとき IP アドレスを変更しても再起動後に元に戻ってしまうという現象が発生して悩んでいました。&lt;br&gt;
調べたら他の人が IP アドレスを固定化してたのが原因だとわかったので、ついでにそのやり方をメモしておきます。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="設定方法"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;設定方法
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;/etc/netplan/&lt;/code&gt; に yaml ファイルを作成します。&lt;/p&gt;
&lt;p&gt;ここに作成したファイルが名前順に読み込まれ、後に読み込まれた内容のほうが優先されるようです。&lt;/p&gt;
&lt;p&gt;Ubuntu Desktop の場合、デフォルトで &lt;code&gt;01-network-manager-all.yaml&lt;/code&gt; があり、ネットワークマネージャーでの設定が反映されるようになっています。&lt;/p&gt;
&lt;p&gt;IP アドレスを固定化したい場合は、&lt;code&gt;/etc/netplan/99_config.yaml&lt;/code&gt; など、後に読み込まれるようなファイル名でファイルを作成し、設定を上書きしてやるそうです。&lt;br&gt;
yaml ファイルの書き方なども含め、公式ドキュメントは以下になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ubuntu.com/server/docs/network-configuration" target="_blank" rel="noopener"
 &gt;https://ubuntu.com/server/docs/network-configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば以下のような感じです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;192.168.1.10&lt;/span&gt;&lt;span class="l"&gt;/24&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;gateway4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192.168.1.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ubuntu.com/server/docs/network-configuration" target="_blank" rel="noopener"
 &gt;https://ubuntu.com/server/docs/network-configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tarufu.info/how_to_assign_static_ip_address_on_ubuntu/" target="_blank" rel="noopener"
 &gt;https://tarufu.info/how_to_assign_static_ip_address_on_ubuntu/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=%E8%87%AA%E4%BD%9C%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E8%A8%88%E7%AE%97%E6%A9%9F:%E5%9B%BA%E5%AE%9Aip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A" target="_blank" rel="noopener"
 &gt;http://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=%E8%87%AA%E4%BD%9C%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E8%A8%88%E7%AE%97%E6%A9%9F:%E5%9B%BA%E5%AE%9Aip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Jetson Xavier NX を触ってみた</title><link>https://blog.ponkotools.com/posts/2022/04/28/jetson/</link><pubDate>Thu, 28 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/28/jetson/</guid><description>&lt;p&gt;Jetson Xavier NX を搭載したボックスコンピューターを触る機会があったのでメモです。&lt;/p&gt;
&lt;p&gt;ボックスコンピューターは以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.aaeon.com/jp/p/nvidia-jetson-xavier-nx-ai-edge-poe-boxer-8253ai" target="_blank" rel="noopener"
 &gt;https://www.aaeon.com/jp/p/nvidia-jetson-xavier-nx-ai-edge-poe-boxer-8253ai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CUDA や Docker は最初からインストールされていました。&lt;/p&gt;
&lt;p&gt;ゴールとしては Docker コンテナ上で GPU を使って推論を行うことです。&lt;/p&gt;
&lt;p&gt;先に結論を書いておくと、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU アーキテクチャが arm なので、arm に対応したベースイメージを使う必要がある&lt;/li&gt;
&lt;li&gt;Jetson は GPU ドライバーの都合上、現時点で CUDA 11 以降に対応していない
&lt;ul&gt;
&lt;li&gt;インストールされているバージョンは 10.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;つまり、arm で CUDA 10.2 のイメージを使う必要があるが、Docker Hub にはその組み合わせの公式イメージがない&lt;/li&gt;
&lt;li&gt;NVIDIA GPU CLOUD (NGC) にある &lt;code&gt;l4t-ml:r32.5.0-py3&lt;/code&gt; のイメージを使えばいいとのこと
&lt;ul&gt;
&lt;li&gt;これが Jetson Xavier NX にインストールされている JetPack と同等のイメージになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="jetson-jetpack-l4t-について調べてみた"&gt;&lt;a href="#jetson-jetpack-l4t-%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e8%aa%bf%e3%81%b9%e3%81%a6%e3%81%bf%e3%81%9f" class="header-anchor"&gt;&lt;/a&gt;Jetson, JetPack, L4T について調べてみた
&lt;/h2&gt;&lt;p&gt;ここらへんの関係がよくわからなかったので、少し調べてみました。&lt;/p&gt;
&lt;p&gt;NVIDIA Jetson シリーズは JetPack という形で、OS、NVIDIA ドライバー、CUDA や cuDNN などのフレームワークも含めた形で提供されているらしいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.nvidia.com/ja-jp/embedded/jetpack" target="_blank" rel="noopener"
 &gt;https://developer.nvidia.com/ja-jp/embedded/jetpack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ja.wikipedia.org/wiki/NVIDIA_Jetson#Xavier" target="_blank" rel="noopener"
 &gt;https://ja.wikipedia.org/wiki/NVIDIA_Jetson#Xavier&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;インストールされている JetPack と OS のバージョンは以下の方法で確認できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://senooken.jp/post/2020/12/04/" target="_blank" rel="noopener"
 &gt;https://senooken.jp/post/2020/12/04/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ dpkg-query --show nvidia-l4t-core
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvidia-l4t-core 32.5.0-20210115151051
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インストールされている OS は L4T 32.5 でしたが、これは JetPack 4.5 になるっぽいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.nvidia.com/embedded/jetpack-archive" target="_blank" rel="noopener"
 &gt;https://developer.nvidia.com/embedded/jetpack-archive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;尚、最新の JetPack 4.6 でも CUDA は 10.2 らしいですが、これは GPU ドライバーの都合上みたいです（後述）。&lt;/p&gt;
&lt;h2 id="nvidia-smi-がない"&gt;&lt;a href="#nvidia-smi-%e3%81%8c%e3%81%aa%e3%81%84" class="header-anchor"&gt;&lt;/a&gt;nvidia-smi がない？
&lt;/h2&gt;&lt;p&gt;GPU の状況を確認するためによく使う &lt;code&gt;nvidia-smi&lt;/code&gt; が Jetson にはありませんでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://senooken.jp/post/2020/11/19/" target="_blank" rel="noopener"
 &gt;https://senooken.jp/post/2020/11/19/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代わりに &lt;code&gt;tegrastats&lt;/code&gt; で確認できました。&lt;/p&gt;
&lt;h2 id="ストレージ容量が少ない"&gt;&lt;a href="#%e3%82%b9%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b8%e5%ae%b9%e9%87%8f%e3%81%8c%e5%b0%91%e3%81%aa%e3%81%84" class="header-anchor"&gt;&lt;/a&gt;ストレージ容量が少ない
&lt;/h2&gt;&lt;p&gt;ストレージ容量が 16GB しかなく、空き容量もほとんどないので、このままでは Docker イメージが入りません。&lt;br&gt;
なので、外部ストレージとして 2.5 インチの SSD を用意して、そちらに Docker イメージを保存するように設定変更しました。&lt;br&gt;
これについては以下を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/ubuntu-ssd.html" target="_blank" rel="noopener"
 &gt;Ubuntu に SSD をマウント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/docker.html" target="_blank" rel="noopener"
 &gt;Docker イメージの保存先を変更&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cuda-バージョン"&gt;&lt;a href="#cuda-%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3" class="header-anchor"&gt;&lt;/a&gt;CUDA バージョン
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;nvidia-container-cli&lt;/code&gt; が使えたので、何もしなくても Docker から GPU を使うことはできそうでした。&lt;br&gt;
インストールされている CUDA のバージョンなどは以下でした。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvidia-container-cli info
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NVRM version: &lt;span class="o"&gt;(&lt;/span&gt;null&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CUDA version: 10.2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device Index: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device Minor: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Model: Xavier
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Brand: &lt;span class="o"&gt;(&lt;/span&gt;null&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GPU UUID: &lt;span class="o"&gt;(&lt;/span&gt;null&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Bus Location: &lt;span class="o"&gt;(&lt;/span&gt;null&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Architecture: 7.2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結構古かったです。&lt;/p&gt;
&lt;p&gt;んで、CUDA のバージョンを上げられないかなぁと思って調べてみると、以下のページが見つかりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.developer.nvidia.com/t/manually-installing-cuda-11-0-2-on-jetson-xavier-nx-help/191909" target="_blank" rel="noopener"
 &gt;https://forums.developer.nvidia.com/t/manually-installing-cuda-11-0-2-on-jetson-xavier-nx-help/191909&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.developer.nvidia.com/t/installing-cuda-11-x-on-jetson-nano/169109" target="_blank" rel="noopener"
 &gt;https://forums.developer.nvidia.com/t/installing-cuda-11-x-on-jetson-nano/169109&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやら Jetson は GPU ドライバーの都合上、現時点では CUDA 11 以降に対応していないとのこと。&lt;br&gt;
なので、Dockerfile のイメージは CUDA 10.2 のものを使う必要がありそうです。&lt;/p&gt;
&lt;h2 id="cpu-が-arm"&gt;&lt;a href="#cpu-%e3%81%8c-arm" class="header-anchor"&gt;&lt;/a&gt;CPU が arm
&lt;/h2&gt;&lt;p&gt;CUDA 云々の前に、そもそも CPU アーキテクチャが arm なので、今まで他のマシンで使っていた Dockerfile のビルドを行うとすぐに失敗しました。&lt;br&gt;
ベースとする Docker イメージを arm 系のものにする必要がありそうです。&lt;/p&gt;
&lt;p&gt;Docker Hub に &lt;code&gt;nvidia/cuda-arm64&lt;/code&gt; というイメージがあるのでこれっぽいですが、現在ではもうサポートされておらず 11.1 でバージョンが止まっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://hub.docker.com/r/nvidia/cuda-arm64" target="_blank" rel="noopener"
 &gt;https://hub.docker.com/r/nvidia/cuda-arm64&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ドキュメントを追ってみると、現在では &lt;code&gt;nvidia/cuda&lt;/code&gt; のイメージで複数のアーキテクチャをサポートできるっぽいので、上記はもうサポートされないとのこと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gitlab.com/nvidia/container-images/cuda/-/blob/master/README.md" target="_blank" rel="noopener"
 &gt;https://gitlab.com/nvidia/container-images/cuda/-/blob/master/README.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;しかし、&lt;code&gt;nvidia/cuda&lt;/code&gt; にある CUDA 10.2 のイメージの &lt;code&gt;OS/ARCH&lt;/code&gt; には &lt;code&gt;linux/arm64&lt;/code&gt; が含まれていません。
仕方ないので &lt;code&gt;nvidia/cuda-arm64&lt;/code&gt; 内で探してみますが、今度は CUDA 10.2 のイメージがなく、11 以降のイメージしかありません。&lt;/p&gt;
&lt;p&gt;つまり、Docker Hub にある NVIDIA の公式イメージには、arm アーキテクチャで CUDA が 10.2 のイメージがないということがわかりました。&lt;/p&gt;
&lt;h2 id="nvidia-gpu-cloud-ngc-のイメージを使えばいいらしい"&gt;&lt;a href="#nvidia-gpu-cloud-ngc-%e3%81%ae%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e3%82%92%e4%bd%bf%e3%81%88%e3%81%b0%e3%81%84%e3%81%84%e3%82%89%e3%81%97%e3%81%84" class="header-anchor"&gt;&lt;/a&gt;NVIDIA GPU CLOUD (NGC) のイメージを使えばいいらしい
&lt;/h2&gt;&lt;p&gt;さてどうしたもんかと悩んでいたら、同じようなことを質問している人がいました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.developer.nvidia.com/t/cuda-10-2-and-cublas10-deb-package-to-install-on-arm64-docker-container/177030" target="_blank" rel="noopener"
 &gt;https://forums.developer.nvidia.com/t/cuda-10-2-and-cublas10-deb-package-to-install-on-arm64-docker-container/177030&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これに対する回答として、&lt;code&gt;l4t-ml:r32.5.0-py3&lt;/code&gt; を使ってみてとのこと。&lt;br&gt;
このイメージは Docker Hub ではなく NVIDIA GPU CLOUD (NGC) からプルできるそうです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-ml" target="_blank" rel="noopener"
 &gt;https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-ml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;見ての通り、これは JetPack 4.5 と同等の Docker イメージらしいです。&lt;br&gt;
ちなみに、Docker Hub からのプルではないため、イメージ名は以下のように指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker pull nvcr.io/nvidia/l4t-ml:r32.5.0-py3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一応プルできるところまでは確認できました。&lt;/p&gt;
&lt;h2 id="opencv-のインストールに失敗する"&gt;&lt;a href="#opencv-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%ab%e5%a4%b1%e6%95%97%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;OpenCV のインストールに失敗する
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;nvcr.io/nvidia/l4t-ml:r32.5.0-py3&lt;/code&gt; のイメージを使うことでようやく Dockerfile のビルドを開始できるところまで漕ぎ着けましたが、OpenCV のインストールに失敗しました。&lt;/p&gt;
&lt;p&gt;調べてみると以下のページが見つかりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://nisshingeppo.com/ai/jetson-opencv/" target="_blank" rel="noopener"
 &gt;https://nisshingeppo.com/ai/jetson-opencv/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやら pip ではインストールできないようなので、ソースコードからビルドを行う必要がありそうですが、OpenCV に依存するライブラリも pip でインストールできなくなります。&lt;/p&gt;
&lt;p&gt;尚、Ubuntu 20.04 のベースイメージだと OpenCV のインストールは pip でできました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://senooken.jp/post/2020/11/19/" target="_blank" rel="noopener"
 &gt;https://senooken.jp/post/2020/11/19/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/tsutof/items/363e0f705bbcdc42f95c" target="_blank" rel="noopener"
 &gt;https://qiita.com/tsutof/items/363e0f705bbcdc42f95c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://nisshingeppo.com/ai/jetson-opencv/" target="_blank" rel="noopener"
 &gt;https://nisshingeppo.com/ai/jetson-opencv/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] Swarm を WebUI で管理できる Swarmpit を動かしてみる</title><link>https://blog.ponkotools.com/posts/2022/04/27/docker-swarmpit/</link><pubDate>Wed, 27 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/27/docker-swarmpit/</guid><description>&lt;p&gt;Docker Swarm モードにおけるクラスタ構成を Web で確認できる Swarmpit というのを知ったので、動かしてみました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;Docker 20.7&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="動かし方"&gt;&lt;a href="#%e5%8b%95%e3%81%8b%e3%81%97%e6%96%b9" class="header-anchor"&gt;&lt;/a&gt;動かし方
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/swarmpit/swarmpit" target="_blank" rel="noopener"
 &gt;GitHub&lt;/a&gt; に Swarm 用の &lt;code&gt;docker-compose.yml&lt;/code&gt; が公開されているので、クローンしてデプロイするだけで使えます。&lt;br&gt;
なので、Swarm モードが有効になっていることが前提となります。&lt;/p&gt;
&lt;p&gt;Swarm モードが有効になっていれば、以下のコマンドを実行するだけで OK です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone https://github.com/swarmpit/swarmpit -b master
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker stack deploy -c swarmpit/docker-compose.yml swarmpit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;特に何も変更することなく動きました。&lt;br&gt;
起動するまで結構時間がかかりました。&lt;/p&gt;
&lt;h2 id="ログイン"&gt;&lt;a href="#%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3" class="header-anchor"&gt;&lt;/a&gt;ログイン
&lt;/h2&gt;&lt;p&gt;http://localhost:888/ にアクセスすると初期アカウントの設定画面が表示されます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="268px" data-flex-grow="111" height="423" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2022/04/27/docker-swarmpit/01.webp" width="473"&gt;&lt;/p&gt;
&lt;p&gt;適当にアカウントを作成すると、以下のようにダッシュボードが表示されます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="407px" data-flex-grow="169" height="721" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2022/04/27/docker-swarmpit/02.webp" srcset="https://blog.ponkotools.com/posts/2022/04/27/docker-swarmpit/02_hu_efed5127ec421201.webp 800w, https://blog.ponkotools.com/posts/2022/04/27/docker-swarmpit/02.webp 1224w" width="1224"&gt;&lt;/p&gt;
&lt;p&gt;Swarmpit 自身が４つのサービスからなるスタックで動作しているので、それが表示されているのが確認できます。&lt;/p&gt;
&lt;p&gt;まだ全然使っていませんが、気が向いたら使い方なども書いていこうかと思います。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/swarmpit/swarmpit" target="_blank" rel="noopener"
 &gt;https://github.com/swarmpit/swarmpit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] Image, Container, Node, Service, Stack などの概念</title><link>https://blog.ponkotools.com/posts/2022/04/26/docker/</link><pubDate>Tue, 26 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/26/docker/</guid><description>&lt;p&gt;Docker について、特に Swarm モードを使い始めるとここらへんの概念がややこしくなってきたので、整理してみました。&lt;/p&gt;
&lt;p&gt;ただ当ブログ全般に言えますが、私自身が正しく理解できているかどうかは自信がないので、あくまで参考ということで、内容の保証はいたしかねます。&lt;/p&gt;
&lt;h2 id="概念図"&gt;&lt;a href="#%e6%a6%82%e5%bf%b5%e5%9b%b3" class="header-anchor"&gt;&lt;/a&gt;概念図
&lt;/h2&gt;&lt;p&gt;以下のページの図がわかりやすかったです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://betterprogramming.pub/how-to-differentiate-between-docker-images-containers-stacks-machine-nodes-and-swarms-fd5f7e34eb9f" target="_blank" rel="noopener"
 &gt;https://betterprogramming.pub/how-to-differentiate-between-docker-images-containers-stacks-machine-nodes-and-swarms-fd5f7e34eb9f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://babyron64.hatenablog.com/entry/2017/11/14/193242" target="_blank" rel="noopener"
 &gt;https://babyron64.hatenablog.com/entry/2017/11/14/193242&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これを踏まえつつ、とりあえず簡単に理解するためには以下のような感じでよいのかなと思います。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="375px" data-flex-grow="156" height="301" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2022/04/26/docker/01.webp" width="471"&gt;&lt;/p&gt;
&lt;h2 id="docker-イメージ"&gt;&lt;a href="#docker-%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8" class="header-anchor"&gt;&lt;/a&gt;Docker イメージ
&lt;/h2&gt;&lt;p&gt;イメージは、アプリケーションのコード、ランタイム、ライブラリ、環境変数、構成ファイルなど、アプリケーションの実行に必要なすべてのものを含んだ、実行可能パッケージです。&lt;br&gt;
このイメージを動作させるためにインスタンス化したものがコンテナと言えます。&lt;/p&gt;
&lt;h2 id="docker-コンテナ"&gt;&lt;a href="#docker-%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a" class="header-anchor"&gt;&lt;/a&gt;Docker コンテナ
&lt;/h2&gt;&lt;p&gt;コンテナは Docker における最小の動作単位です。&lt;br&gt;
コンテナはイメージから作成されます。&lt;br&gt;
上述のページでは、コンテナはイメージのランタイムインスタンスである、という言い方をしていますが、イメージを実際に動作可能にしたものがコンテナである、と言ってもいいかもしれません。&lt;/p&gt;
&lt;p&gt;コンテナを動作させると、ホストからは一つのプロセスとして認識されます。&lt;br&gt;
カーネルはホストと共有しています。&lt;/p&gt;
&lt;p&gt;尚、イメージおよびコンテナはレイヤー構造となっており、各レイヤーはベースレイヤーとの差分情報を持っています。&lt;br&gt;
ここらへん、以下のページがわかりやすかったです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/okmtz/items/f8231c83134a6363647b" target="_blank" rel="noopener"
 &gt;https://qiita.com/okmtz/items/f8231c83134a6363647b&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、コンテナ内で動かすアプリケーションは１つにするのが基本だそうです。&lt;br&gt;
理由などは以下を見ていただくのが早いです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/get-started/07_multi_container/" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/get-started/07_multi_container/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="データボリューム"&gt;&lt;a href="#%e3%83%87%e3%83%bc%e3%82%bf%e3%83%9c%e3%83%aa%e3%83%a5%e3%83%bc%e3%83%a0" class="header-anchor"&gt;&lt;/a&gt;データボリューム
&lt;/h2&gt;&lt;p&gt;コンテナ内にデータを保存した場合、コンテナの破棄とともにそのデータも消えてしまいます。&lt;br&gt;
そのため、データが消えてしまわないように永続化する際に使うのがデータボリュームです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.jp/engine/userguide/dockervolumes.html" target="_blank" rel="noopener"
 &gt;https://docs.docker.jp/engine/userguide/dockervolumes.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;データボリュームはコンテナ内の指定したパスにマウントして使います。&lt;/p&gt;
&lt;h2 id="docker-compose"&gt;&lt;a href="#docker-compose" class="header-anchor"&gt;&lt;/a&gt;docker-compose
&lt;/h2&gt;&lt;p&gt;前述したとおり、Docker では１つのコンテナで１つのアプリケーションを動かすのが基本です。&lt;br&gt;
しかし、実際のシステムでは複数のアプリケーションが連携して動作するものが多いと思います。&lt;br&gt;
そういった複数のコンテナ（アプリケーション）が連携して動作するシステムについて、イメージのビルドや依存関係を考慮して各コンテナの起動・停止などを簡単に行えるようにできるツールが docker-compose です。&lt;/p&gt;
&lt;h2 id="swarm-モード"&gt;&lt;a href="#swarm-%e3%83%a2%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;Swarm モード
&lt;/h2&gt;&lt;p&gt;Swarm モードは Docker 自体に含まれるオーケストレーション機能です。&lt;br&gt;
複数の Docker ホストをまとめて、クラスタを構成することができます。&lt;/p&gt;
&lt;h2 id="ノード"&gt;&lt;a href="#%e3%83%8e%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;ノード
&lt;/h2&gt;&lt;p&gt;ノードは Swarm モードによるクラスタを構成する単位で、Docker ホスト１つにつきノードを１つ作成することになります。&lt;/p&gt;
&lt;p&gt;例えば、２つの物理マシン上でそれぞれ Docker を使っている場合は、各マシンにノードを作成してクラスタを構成します。&lt;br&gt;
ただし、VirtualBox や WSL などの仮想環境を使うと一つの物理マシン上で複数の Docker ホストが存在することもあるので、必ずしも「ノードの数＝マシンの数」となるわけではありません。&lt;/p&gt;
&lt;p&gt;尚、ノードにはクラスタ全体を管理する manager ノードと、コンテナを実行する worker ノードがあります。&lt;/p&gt;
&lt;h2 id="サービスとタスク"&gt;&lt;a href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%a8%e3%82%bf%e3%82%b9%e3%82%af" class="header-anchor"&gt;&lt;/a&gt;サービスとタスク
&lt;/h2&gt;&lt;p&gt;Swarm モードにおいて、ノードの作成の次はサービスの作成を行います。
サービスを作成すると、タスク（コンテナ）が作成されて、各ノードに配置されます。
タスクというのはコンテナを起動したりするやつで、よくわからなければ基本的にタスク≒コンテナと考えてよさそうです。&lt;/p&gt;
&lt;p&gt;つまり、サービスを作成するとは、同じ機能を持ったタスク（コンテナ）を複数作成して（レプリカセット）、各ノードに配置するということになります。
この各ノードに配置されたタスク（コンテナ）のレプリカセットがサービスです。&lt;/p&gt;
&lt;p&gt;非 Swarm モードにおけるコンテナ作成（つまり普通にコンテナを作成する場合）が、Swarm モード有効時ではサービスを作成することに相当する、と考えればわかりやすいかもしれません。&lt;/p&gt;
&lt;p&gt;従って、１つのコンテナでは基本的に１つのアプリケーションしか動いていないのと同様に、１つサービスでは基本的に１つの機能しか持っていません。&lt;br&gt;
レプリカがあるためタスク（コンテナ）自体は複数ありますがが（冗長化）、機能としてはタスク（コンテナ）１つ分しかありません。&lt;br&gt;
そのため、複数のサービスが連携して動作するシステムの場合、次のスタックを使うことになります。&lt;/p&gt;
&lt;h2 id="スタック"&gt;&lt;a href="#%e3%82%b9%e3%82%bf%e3%83%83%e3%82%af" class="header-anchor"&gt;&lt;/a&gt;スタック
&lt;/h2&gt;&lt;p&gt;サービスの集合体がスタックです。&lt;br&gt;
非 Swarm モードで依存関係のあるコンテナを一度に起動・終了したりする場合、前述したように docker-compose を使ったりしますが、これが Swarm モードではスタックに相当します。
非 Swarm モードにおける コンテナと docker-compose の関係が、Swarm モードではサービスとスタックの関係になる、といえばわかりやすいかもしれません。&lt;/p&gt;
&lt;p&gt;スタックでは基本的に &lt;code&gt;docker-compose.yml&lt;/code&gt; がそのまま使えますが、一部使えない項目や、逆に必要となる項目などもあるので、こちらはまた別途記事を作成したいと思います。&lt;/p&gt;
&lt;h2 id="オーバーレイネットワーク"&gt;&lt;a href="#%e3%82%aa%e3%83%bc%e3%83%90%e3%83%bc%e3%83%ac%e3%82%a4%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af" class="header-anchor"&gt;&lt;/a&gt;オーバーレイネットワーク
&lt;/h2&gt;&lt;p&gt;Swarm モードでは、Docker ホスト間を相互接続するために、オーバーレイネットワークが作成されます。&lt;br&gt;
デフォルトで Ingress という名前のオーバーレイネットワークが作成されます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/network/overlay/" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/network/overlay/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://blog.livedoor.jp/harukisan7/archives/17495300.html" target="_blank" rel="noopener"
 &gt;http://blog.livedoor.jp/harukisan7/archives/17495300.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://betterprogramming.pub/how-to-differentiate-between-docker-images-containers-stacks-machine-nodes-and-swarms-fd5f7e34eb9f" target="_blank" rel="noopener"
 &gt;https://betterprogramming.pub/how-to-differentiate-between-docker-images-containers-stacks-machine-nodes-and-swarms-fd5f7e34eb9f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://babyron64.hatenablog.com/entry/2017/11/14/193242" target="_blank" rel="noopener"
 &gt;https://babyron64.hatenablog.com/entry/2017/11/14/193242&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Jetson Xavier NX でルートファイルシステムを overlayroot で読み込み専用に設定する</title><link>https://blog.ponkotools.com/posts/2022/04/26/jetson-overlayroot/</link><pubDate>Tue, 26 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/26/jetson-overlayroot/</guid><description>&lt;p&gt;以前、Ubuntu で overlayroot を使ってルートファイルシステムを読み込み専用にしてみたのですが、Jetson Xavier NX で同じように試してみたところ、それだけではだめでした。&lt;/p&gt;
&lt;p&gt;恐らくですが、ブートローダーが EXTLINUX であることが原因のような気がしています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/uboot_guide.html#wwpID0E0YD0HA" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/uboot_guide.html#wwpID0E0YD0HA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jetson Xavier NX ではどうやってやればいいのかググってみると、NVIDIA のフォーラムで議論されているのが見つかりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.developer.nvidia.com/t/xavier-nx-filesystem-to-readonly/185605" target="_blank" rel="noopener"
 &gt;https://forums.developer.nvidia.com/t/xavier-nx-filesystem-to-readonly/185605&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.developer.nvidia.com/t/overlayfs-for-jetson/78540/29" target="_blank" rel="noopener"
 &gt;https://forums.developer.nvidia.com/t/overlayfs-for-jetson/78540/29&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その中で、解決策として提示されていたのが以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/negachov/overlayroot-jetpack" target="_blank" rel="noopener"
 &gt;https://github.com/negachov/overlayroot-jetpack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Jetson Xavior NX&lt;/li&gt;
&lt;li&gt;Ubuntu 18.04&lt;/li&gt;
&lt;li&gt;JetPack 4.5.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overlayroot-のインストールと有効化"&gt;&lt;a href="#overlayroot-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%a8%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;overlayroot のインストールと有効化
&lt;/h2&gt;&lt;p&gt;以下の記事を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/overlayroot-ubuntu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jetson Xavier NX ではこれに加え、次のことが必要でした。&lt;/p&gt;
&lt;h2 id="bootinitrd-の置き換え"&gt;&lt;a href="#bootinitrd-%e3%81%ae%e7%bd%ae%e3%81%8d%e6%8f%9b%e3%81%88" class="header-anchor"&gt;&lt;/a&gt;/boot/initrd の置き換え
&lt;/h2&gt;&lt;p&gt;GitHub にスクリプトが公開されているので、まずこれをクローンします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone https://github.com/negachov/overlayroot-jetpack
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは以下を実行するだけです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; overlayroot-jetpack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo ./update-initramfs-jetpack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで、再起動後に overlayroot が有効になっていました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.developer.nvidia.com/t/xavier-nx-filesystem-to-readonly/185605" target="_blank" rel="noopener"
 &gt;https://forums.developer.nvidia.com/t/xavier-nx-filesystem-to-readonly/185605&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.developer.nvidia.com/t/overlayfs-for-jetson/78540/29" target="_blank" rel="noopener"
 &gt;https://forums.developer.nvidia.com/t/overlayfs-for-jetson/78540/29&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/jetson/l4t/Tegra%20Linux%20Driver%20Package%20Development%20Guide/uboot_guide.html#wwpID0E0YD0HA" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/jetson/l4t/Tegra%20Linux%20Driver%20Package%20Development%20Guide/uboot_guide.html#wwpID0E0YD0HA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/tunefs/articles/288d3a069f0cb3" target="_blank" rel="noopener"
 &gt;https://zenn.dev/tunefs/articles/288d3a069f0cb3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu のファイルシステムを overlayroot で読み込み専用にする</title><link>https://blog.ponkotools.com/posts/2022/04/25/overlayroot/</link><pubDate>Mon, 25 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/25/overlayroot/</guid><description>&lt;p&gt;電源ブチ切り対策の一環として、overlayroot で Ubuntu の rootfs を read only にしてみました。&lt;/p&gt;
&lt;p&gt;やり方はいろいろググってみましたが、以下のサイトがとても参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/tunefs/articles/288d3a069f0cb3" target="_blank" rel="noopener"
 &gt;https://zenn.dev/tunefs/articles/288d3a069f0cb3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04 (デスクトップ版)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="現在の状態を確認"&gt;&lt;a href="#%e7%8f%be%e5%9c%a8%e3%81%ae%e7%8a%b6%e6%85%8b%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;現在の状態を確認
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;mount&lt;/code&gt; コマンドで確認してみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mount
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;抜粋ですが、以下の状態が確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda2 on / &lt;span class="nb"&gt;type&lt;/span&gt; ext4 &lt;span class="o"&gt;(&lt;/span&gt;rw,relatime,errors&lt;span class="o"&gt;=&lt;/span&gt;remount-ro&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="overlayroot-のインストール"&gt;&lt;a href="#overlayroot-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;overlayroot のインストール
&lt;/h2&gt;&lt;p&gt;サーバー版には最初からインストールされているそうですが、デスクトップ版にはインストールされていないので、apt でインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install overlayroot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="overlayroot-の有効化"&gt;&lt;a href="#overlayroot-%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;overlayroot の有効化
&lt;/h2&gt;&lt;p&gt;overlayroot を有効化するには、以下のいずれかの対応が必要だそうです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カーネルパラメーターに &lt;code&gt;overlayroot=XXX&lt;/code&gt; を指定する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に &lt;code&gt;overlayroot=&amp;quot;XXX&amp;quot;&lt;/code&gt; を指定する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/overlayroot.conf&lt;/code&gt; に &lt;code&gt;overlayroot=&amp;quot;XXX&amp;quot;&lt;/code&gt; を指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;設定内容は上位のほうが優先されるそうです。&lt;br&gt;
今回は &lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に設定を追加します。&lt;br&gt;
まずはエディタで開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gedit /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;overlayroot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tmpfs&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンド一発でやるなら以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;overlayroot=&amp;#34;tmpfs&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;tmpfs はメモリ上に作成ファイルシステムで、一時的にデータを格納するために使われます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://linuc.org/study/knowledge/441/" target="_blank" rel="noopener"
 &gt;https://linuc.org/study/knowledge/441/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Linux ではマウントするファイルシステムの情報が &lt;code&gt;/etc/fstab&lt;/code&gt; に書かれていますが、ここが overlayroot における下位レイヤーとなり、読み込み専用レイヤーとなります。&lt;br&gt;
そして、先ほど追記した &lt;code&gt;tempfs&lt;/code&gt; が上位レイヤーとなり、書き込み可能レイヤーとなります。&lt;br&gt;
ここらへんは後述するように &lt;code&gt;mount&lt;/code&gt; コマンドで確認可能です。&lt;/p&gt;
&lt;p&gt;ただし、tmpfs はメモリ上に作成されたファイルシステムなので、再起動時にはデータは消えます。&lt;/p&gt;
&lt;h3 id="ルートファイルシステムのみを読み取り専用にする"&gt;&lt;a href="#%e3%83%ab%e3%83%bc%e3%83%88%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%81%ae%e3%81%bf%e3%82%92%e8%aa%ad%e3%81%bf%e5%8f%96%e3%82%8a%e5%b0%82%e7%94%a8%e3%81%ab%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;ルートファイルシステムのみを読み取り専用にする
&lt;/h3&gt;&lt;p&gt;パーティションを分けている場合などで、ルートファイルシステムのみを読み取り専用にするためには、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; に &lt;code&gt;tmpfs:recurse=0&lt;/code&gt; を指定するらしいです。&lt;br&gt;
コマンド一発でやる場合は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo &amp;#39;overlayroot=&amp;#34;tmpfs:recurse=0&amp;#34;&amp;#39; | sudo tee -a /etc/overlayroot.local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで再起動すれば、ルートファイルシステムのみが読み取り専用となり、他のパーティションは読み書き可能な状態となります。&lt;/p&gt;
&lt;h2 id="確認"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h2&gt;&lt;p&gt;先ほどと同じように &lt;code&gt;mount&lt;/code&gt; コマンドで確認してみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mount
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;抜粋ですが、以下の状態が確認できました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda2 on /media/root-ro &lt;span class="nb"&gt;type&lt;/span&gt; ext4 &lt;span class="o"&gt;(&lt;/span&gt;ro,relatime&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmpfs-root on /media/root-rw &lt;span class="nb"&gt;type&lt;/span&gt; tmpfs &lt;span class="o"&gt;(&lt;/span&gt;rw,relatime,inode64&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overlayroot on / &lt;span class="nb"&gt;type&lt;/span&gt; overlay &lt;span class="o"&gt;(&lt;/span&gt;rw,relatime,lowerdir&lt;span class="o"&gt;=&lt;/span&gt;/media/root-ro,upperdir&lt;span class="o"&gt;=&lt;/span&gt;/media/root-rw/overlay,workdir&lt;span class="o"&gt;=&lt;/span&gt;/media/root-rw/overlay-workdir/_&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ルートファイルシステムが &lt;code&gt;/media/root-ro&lt;/code&gt; に読み込み専用(ro)の下位レイヤー(lowerdir) として設定され、tmpfs が &lt;code&gt;/media/root-rw/overlay&lt;/code&gt; に書き込み可能(rw)な上位レイヤー(upperdir) して設定されているのが確認できます。&lt;/p&gt;
&lt;h3 id="ファイルが消えることを確認"&gt;&lt;a href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%8c%e6%b6%88%e3%81%88%e3%82%8b%e3%81%93%e3%81%a8%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;ファイルが消えることを確認
&lt;/h3&gt;&lt;p&gt;ついでに、ホームディレクトリに適当にファイルを作成し、再起動時にファイルが消えていることを確認します。&lt;/p&gt;
&lt;h2 id="overlayroot-の無効化"&gt;&lt;a href="#overlayroot-%e3%81%ae%e7%84%a1%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;overlayroot の無効化
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を削除するか、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を編集して中身を &lt;code&gt;overlayroot=&amp;quot;&amp;quot;&lt;/code&gt; に変更すれば、overlayroot の無効化されます。&lt;/p&gt;
&lt;p&gt;しかし、現在は overlayroot が有効化になっている状況なので、このまま変更しても再起動後にはまた元に戻ってしまいます。&lt;br&gt;
そのため、この変更は一時的に書き込みを許可した状態で行う必要があります。&lt;br&gt;
一時的に書き込み可能な状態にするには以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo overlayroot-chroot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を削除するか、&lt;code&gt;/etc/overlayroot.local.conf&lt;/code&gt; を編集して中身を &lt;code&gt;overlayroot=&amp;quot;&amp;quot;&lt;/code&gt; に変更します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# rm /etc/overlayroot.local.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;exit&lt;/code&gt; でシェルから抜ければ書き込み可能状態は終了します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再起動後、overlayroot が無効状態になっています。&lt;/p&gt;
&lt;h2 id="grub-メニューで時間がかかることの対策"&gt;&lt;a href="#grub-%e3%83%a1%e3%83%8b%e3%83%a5%e3%83%bc%e3%81%a7%e6%99%82%e9%96%93%e3%81%8c%e3%81%8b%e3%81%8b%e3%82%8b%e3%81%93%e3%81%a8%e3%81%ae%e5%af%be%e7%ad%96" class="header-anchor"&gt;&lt;/a&gt;GRUB メニューで時間がかかることの対策
&lt;/h2&gt;&lt;p&gt;overlayroot を有効にした状態で再起動すると、GRUB メニューが表示され、30秒ほど待たされるようになります。&lt;br&gt;
詳細は以下をご参照ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;起動が30秒も遅くなるのは困るので、以下を参考にして GRUB の設定を変更しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout" target="_blank" rel="noopener"
 &gt;https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/" target="_blank" rel="noopener"
 &gt;https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/" target="_blank" rel="noopener"
 &gt;https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;※以下は overlayroot を無効にした状態で行う必要があります！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/default/grub&lt;/code&gt; をエディタで開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/default/grub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GRUB_RECORDFAIL_TIMEOUT=$GRUB_TIMEOUT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定を反映するために以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo grub-mkconfig -o /boot/grub/grub.cfg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで overlayroot を有効にしても起動時間は変わらなくなりました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568" target="_blank" rel="noopener"
 &gt;https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout" target="_blank" rel="noopener"
 &gt;https://askubuntu.com/questions/754974/grub-defaulting-to-30-second-timeout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/" target="_blank" rel="noopener"
 &gt;https://plaza.rakuten.co.jp/ftechworks/diary/202005130001/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/" target="_blank" rel="noopener"
 &gt;https://www.hiroom2.com/2018/04/30/ubuntu-1804-serial-console-ja/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] Swarm モードのローリングアップデートを試してみた</title><link>https://blog.ponkotools.com/posts/2022/04/24/docker-swarm/</link><pubDate>Sun, 24 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/24/docker-swarm/</guid><description>&lt;p&gt;Docker Swarm のチュートリアルの続きで、ローリングアップデートを試してみました。&lt;/p&gt;
&lt;p&gt;前回の記事は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/docker-swarm_22.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/docker-swarm_22.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="準備"&gt;&lt;a href="#%e6%ba%96%e5%82%99" class="header-anchor"&gt;&lt;/a&gt;準備
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;redis:3.0.6&lt;/code&gt; のイメージでサービスを開始します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service create --replicas &lt;span class="m"&gt;3&lt;/span&gt; --name redis --update-delay 10s redis:3.0.6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zzbrzxvmf40nt9jj8dw0upfqf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overall progress: &lt;span class="m"&gt;3&lt;/span&gt; out of &lt;span class="m"&gt;3&lt;/span&gt; tasks 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1/3: running &lt;span class="o"&gt;[==================================================&lt;/span&gt;&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2/3: running &lt;span class="o"&gt;[==================================================&lt;/span&gt;&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3/3: running &lt;span class="o"&gt;[==================================================&lt;/span&gt;&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;verify: Service converged 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--replicas 3&lt;/code&gt; を指定しているので、タスク（コンテナ）が３つ作成されます。&lt;/p&gt;
&lt;p&gt;これを今から &lt;code&gt;redis:3.0.7&lt;/code&gt; のイメージを使うようにアップデートします。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--update-parallelism&lt;/code&gt; で同時に更新するタスクの数を指定できるようですが、今回は指定していないので、１つずつ更新されていきます。&lt;br&gt;
また、&lt;code&gt;--update-delay 10s&lt;/code&gt; を指定しているので、各タスクの更新は10秒の間隔を空けて行われます。&lt;/p&gt;
&lt;h3 id="確認"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h3&gt;&lt;p&gt;アップデートの前に先に現状を確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service inspect --pretty redis
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID:		zzbrzxvmf40nt9jj8dw0upfqf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name:		redis
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Service Mode:	Replicated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Replicas:	&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Placement:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;UpdateConfig:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Parallelism:	&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Delay:		10s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; On failure:	pause
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Monitoring Period: 5s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Max failure ratio: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Update order: stop-first
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RollbackConfig:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Parallelism:	&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; On failure:	pause
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Monitoring Period: 5s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Max failure ratio: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Rollback order: stop-first
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ContainerSpec:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Image:		redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Init:		&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Resources:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Endpoint Mode:	vip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下はチュートリアルにはありませんが、もう少しサービスの状況を確認しておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID NAME MODE REPLICAS IMAGE PORTS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zzbrzxvmf40n redis replicated 3/3 redis:3.0.6 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service ps redis
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;78sw528i15lh redis.1 redis:3.0.6 worker1 Running Running &lt;span class="m"&gt;2&lt;/span&gt; minutes ago 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ryj86p3my9v4 redis.2 redis:3.0.6 manager1 Running Running about a minute ago 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cwoso93243ra redis.3 redis:3.0.6 worker1 Running Running &lt;span class="m"&gt;2&lt;/span&gt; minutes ago 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;redis&lt;/code&gt; というサービスが２つのノード上で合計３つ動作しているのが確認できます。&lt;/p&gt;
&lt;h2 id="アップデート"&gt;&lt;a href="#%e3%82%a2%e3%83%83%e3%83%97%e3%83%87%e3%83%bc%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;アップデート
&lt;/h2&gt;&lt;p&gt;以下のコマンドで、&lt;code&gt;redis:3.0.7&lt;/code&gt; にアップデートを開始します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service update --image redis:3.0.7 redis
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;別の端末で &lt;code&gt;docker service ps&lt;/code&gt; を実行すれば、タスク（コンテナ）が順にアップデートされていくのが確認できます。&lt;/p&gt;
&lt;h3 id="確認-1"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d-1" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h3&gt;&lt;p&gt;アップデートが全て完了したら、以下のように各タスク（コンテナ）が &lt;code&gt;redis:3.0.6&lt;/code&gt; から &lt;code&gt;redis:3.0.7&lt;/code&gt; にアップデートされているのが確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service ps redis
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;9zedj7hcwbsk redis.1 redis:3.0.7 manager1 Running Running &lt;span class="m"&gt;12&lt;/span&gt; seconds ago 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yy3ov31879rx &lt;span class="se"&gt;\_&lt;/span&gt; redis.1 redis:3.0.6 manager1 Shutdown Shutdown &lt;span class="m"&gt;13&lt;/span&gt; seconds ago 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fize7rde390v redis.2 redis:3.0.7 worker1 Running Running &lt;span class="m"&gt;59&lt;/span&gt; seconds ago 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tn49red4crkq &lt;span class="se"&gt;\_&lt;/span&gt; redis.2 redis:3.0.6 worker1 Shutdown Shutdown about a minute ago 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;os380kdgnmfg redis.3 redis:3.0.7 manager1 Running Running &lt;span class="m"&gt;37&lt;/span&gt; seconds ago 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3scdfazrhn6z &lt;span class="se"&gt;\_&lt;/span&gt; redis.3 redis:3.0.6 Pworker1 Shutdown Shutdown about a minute ago
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="アップデートに失敗した場合"&gt;&lt;a href="#%e3%82%a2%e3%83%83%e3%83%97%e3%83%87%e3%83%bc%e3%83%88%e3%81%ab%e5%a4%b1%e6%95%97%e3%81%97%e3%81%9f%e5%a0%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;アップデートに失敗した場合
&lt;/h3&gt;&lt;p&gt;アップデートに失敗した場合は処理が一時停止状態になるようです。&lt;br&gt;
&lt;code&gt;docker service inspect&lt;/code&gt; でアップデートの状況を確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service inspect --pretty redis
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一時停止した更新を再開するには、 &lt;code&gt;docker service update &amp;lt;サービス ID&amp;gt;&lt;/code&gt; を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service update redis
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/Brutus/items/99f59eefca4ff9ebb79e#%E3%83%93%E3%83%AB%E3%83%89%E4%BD%9C%E6%A5%AD" target="_blank" rel="noopener"
 &gt;https://qiita.com/Brutus/items/99f59eefca4ff9ebb79e#%E3%83%93%E3%83%AB%E3%83%89%E4%BD%9C%E6%A5%AD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/kiida/items/6dac109dcd063609b064" target="_blank" rel="noopener"
 &gt;https://qiita.com/kiida/items/6dac109dcd063609b064&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] Swarm モードに入門してみた</title><link>https://blog.ponkotools.com/posts/2022/04/22/docker-swarm/</link><pubDate>Fri, 22 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/22/docker-swarm/</guid><description>&lt;p&gt;Docker をプロダクションで使っていくにあたり、コンテナの管理やアップデートをどうしようかと考えていました。&lt;br&gt;
最初はこれを機に Kubernetes を使ってみようかと思ったのですが、学習コストが高いうえに、対象が小さなシステムなのでちょっと大仰すぎるなぁと思ってたところ、Docker 自体に Swarm モードというオーケストレーション機能が含まれていることを知ったので、そちらを試しに使ってみることにしました。&lt;/p&gt;
&lt;p&gt;というわけで、以下のチュートリアルを少しやってみました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://docs.docker.jp/engine/swarm/swarm-tutorial/toc.html" target="_blank" rel="noopener"
 &gt;http://docs.docker.jp/engine/swarm/swarm-tutorial/toc.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;手順としては上記をなぞるだけになるかもしれませんが、自分にとってわかりにくかったところや、他のサイトで調べたりしたことなどを補足しながら書いていこうと思います。&lt;br&gt;
一応、Swarm のドキュメントは以下になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://docs.docker.jp/engine/swarm/toc.html" target="_blank" rel="noopener"
 &gt;http://docs.docker.jp/engine/swarm/toc.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちなみに Kubernetes と Docker Swarm の比較は以下のページがとても参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://circleci.com/ja/blog/docker-swarm-vs-kubernetes/" target="_blank" rel="noopener"
 &gt;https://circleci.com/ja/blog/docker-swarm-vs-kubernetes/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04
&lt;ul&gt;
&lt;li&gt;Docker 20.10.7&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ubuntu 20.04 on WSL2 on Windows10
&lt;ul&gt;
&lt;li&gt;Docker 20.10.10&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker はインストール済みの前提です。&lt;br&gt;
Docker がインストールされていれば Swarm モードも使えます。&lt;/p&gt;
&lt;p&gt;チュートリアルでは Docker ホストは３つありますが、用意できなかったので Ubuntu と WSL2 上の Ubuntu の２つでやりました。&lt;/p&gt;
&lt;h2 id="概要"&gt;&lt;a href="#%e6%a6%82%e8%a6%81" class="header-anchor"&gt;&lt;/a&gt;概要
&lt;/h2&gt;&lt;p&gt;Docker Swarm モードは &lt;code&gt;manager&lt;/code&gt; ノードと &lt;code&gt;worker&lt;/code&gt; ノードから構成されます。&lt;br&gt;
ノードというのは Docker のホスト（Docker エンジンが動作している環境）の単位になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;manager ノードはクラスタを管理するノード&lt;/li&gt;
&lt;li&gt;worker ノードはコンテナを稼働させるノード&lt;/li&gt;
&lt;li&gt;manager ノードは worker ノードを兼ねることもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="swarm-モードの有効化"&gt;&lt;a href="#swarm-%e3%83%a2%e3%83%bc%e3%83%89%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;Swarm モードの有効化
&lt;/h2&gt;&lt;p&gt;Swarm モードを有効化するには &lt;code&gt;docker swarm init&lt;/code&gt; を実行します。&lt;br&gt;
このコマンドを実行すると manager ノードが作成されるので、manager ノードを作成したいマシン上で実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker swarm init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swarm initialized: current node &lt;span class="o"&gt;(&lt;/span&gt;z9voajpw84i4jk2fomqwsmnc7&lt;span class="o"&gt;)&lt;/span&gt; is now a manager.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;To add a worker to this swarm, run the following command:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker swarm join --token SWMTKN-1-23t6ldii7xxyyol2ulu0qddlqgwp3i1xpckiij2yjpintebbjq-bw598idhl229sykrhyiykviiw 192.168.1.10:2377
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;To add a manager to this swarm, run &lt;span class="s1"&gt;&amp;#39;docker swarm join-token manager&amp;#39;&lt;/span&gt; and follow the instructions.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;出力結果には worker ノードを manager ノードに登録するためのコマンドが表示されます（後述）。&lt;/p&gt;
&lt;p&gt;また、１つのマシンに複数のIPアドレスが割り当てられている場合、以下のように &lt;code&gt;--advertise-addr&lt;/code&gt; オプションで他のノードとの通信に使用するIPアドレスを指定することもできます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker swarm init --advertise-addr 192.168.1.10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="確認"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h3&gt;&lt;p&gt;Swarm モードが有効になっているかどうかは &lt;code&gt;docker info&lt;/code&gt; で確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker info
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;抜粋ですが、以下のような出力が確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Swarm: active
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NodeID: z9voajpw84i4jk2fomqwsmnc7
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Is Manager: &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ClusterID: 61lmt9ptc8jyphn725cj96vxj
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Managers: &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Nodes: &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ノードに関する情報は &lt;code&gt;docker node ls&lt;/code&gt; で確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker node ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;z9voajpw84i4jk2fomqwsmnc7 * manager1 Ready Active Leader 20.10.7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="worker-ノードの作成"&gt;&lt;a href="#worker-%e3%83%8e%e3%83%bc%e3%83%89%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;worker ノードの作成
&lt;/h2&gt;&lt;p&gt;worker ノードの作成には &lt;code&gt;docker swarm init&lt;/code&gt; を実行したときの出力結果に表示されたコマンドを使います。&lt;br&gt;
manager ノードを作成したマシンとは別のマシンで以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker swarm join --token SWMTKN-1-23t6ldii7xxyyol2ulu0qddlqgwp3i1xpckiij2yjpintebbjq-bw598idhl229sykrhyiykviiw 192.168.1.10:2377
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This node joined a swarm as a worker.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もし上記のコマンドが分からない場合は、&lt;code&gt;docker swarm join-token worker&lt;/code&gt; で確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker swarm join-token worker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;To add a worker to this swarm, run the following command:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker swarm join --token SWMTKN-1-23t6ldii7xxyyol2ulu0qddlqgwp3i1xpckiij2yjpintebbjq-bw598idhl229sykrhyiykviiw 192.168.1.10:2377
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;尚、既に worker ノードを作成済みであったり、manager ノードを作成しているマシンで &lt;code&gt;docker swarm join&lt;/code&gt; を実行した場合、以下のエラーが表示されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error response from daemon: This node is already part of a swarm. Use &lt;span class="s2"&gt;&amp;#34;docker swarm leave&amp;#34;&lt;/span&gt; to leave this swarm and join another one.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="確認-1"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d-1" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h3&gt;&lt;p&gt;先ほどと同じように &lt;code&gt;docker node ls&lt;/code&gt; で確認できます。&lt;br&gt;
尚、このような Swarm を管理するコマンドは manager ノードが動作しているマシンでのみ実行可能です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker node ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hqi4gtcdh4a7ya8myg0x0my37 worker1 Ready Active 20.10.12
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;z9voajpw84i4jk2fomqwsmnc7 * manager1 Ready Active Leader 20.10.7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="サービスのデプロイ"&gt;&lt;a href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e3%83%87%e3%83%97%e3%83%ad%e3%82%a4" class="header-anchor"&gt;&lt;/a&gt;サービスのデプロイ
&lt;/h2&gt;&lt;p&gt;ノードを作成したので、そこにサービスを追加していきます。&lt;br&gt;
まずは manager ノードにサービスを追加します。&lt;br&gt;
上述したように、manager ノードは worker ノードも兼ねることができるので、サービスを動かすこともできます。&lt;/p&gt;
&lt;p&gt;manager ノードが動作しているマシンで &lt;code&gt;docker service create&lt;/code&gt; を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service create --replicas &lt;span class="m"&gt;1&lt;/span&gt; --name helloworld alpine ping docker.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;84aq1iszx44xq2f3cmohfl2tu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;verall progress: &lt;span class="m"&gt;1&lt;/span&gt; out of &lt;span class="m"&gt;1&lt;/span&gt; tasks 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1/1: running &lt;span class="o"&gt;[==================================================&lt;/span&gt;&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;verify: Service converged
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでは、&lt;code&gt;alpine&lt;/code&gt; のベースイメージで &lt;code&gt;helloworld&lt;/code&gt; という名前のコンテナを作成し、コンテナ内で &lt;code&gt;ping docker.com&lt;/code&gt; というコマンドを実行しています。&lt;br&gt;
&lt;code&gt;--replicas 1&lt;/code&gt; はコンテナの数です。&lt;/p&gt;
&lt;h3 id="確認-2"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d-2" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;docker service ls&lt;/code&gt; で実行中のサービスを確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID NAME MODE REPLICAS IMAGE PORTS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;84aq1iszx44x helloworld replicated 1/1 alpine:latest 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="サービスの詳細を調べる"&gt;&lt;a href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e8%a9%b3%e7%b4%b0%e3%82%92%e8%aa%bf%e3%81%b9%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;サービスの詳細を調べる
&lt;/h3&gt;&lt;p&gt;別記事に書きました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/docker-swarm.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/docker-swarm.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="サービスのスケール"&gt;&lt;a href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e3%82%b9%e3%82%b1%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;サービスのスケール
&lt;/h2&gt;&lt;p&gt;Swarm で実行しているサービスをスケールするには、&lt;code&gt;docker service scale &amp;lt;サービスID&amp;gt;=&amp;lt;タスク数&amp;gt;&lt;/code&gt; を実行します。&lt;br&gt;
尚、サービス内で実行中のコンテナを「タスク」（task）と呼ぶそうです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service scale &lt;span class="nv"&gt;helloworld&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helloworld scaled to &lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overall progress: &lt;span class="m"&gt;5&lt;/span&gt; out of &lt;span class="m"&gt;5&lt;/span&gt; tasks 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1/5: running &lt;span class="o"&gt;[==================================================&lt;/span&gt;&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2/5: running &lt;span class="o"&gt;[==================================================&lt;/span&gt;&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3/5: running &lt;span class="o"&gt;[==================================================&lt;/span&gt;&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4/5: running &lt;span class="o"&gt;[==================================================&lt;/span&gt;&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5/5: running &lt;span class="o"&gt;[==================================================&lt;/span&gt;&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;verify: Service converged 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="確認-3"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d-3" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;docker service ps &amp;lt;サービスID&amp;gt;&lt;/code&gt; で確認すると、インスタンスが合計５つになったのが分かります。&lt;br&gt;
タスク（コンテナ）は Swarm のノード間で分散されています。&lt;/p&gt;
&lt;p&gt;また、各ノードで &lt;code&gt;docker ps&lt;/code&gt; を実行することでコンテナの情報が確認できます。&lt;/p&gt;
&lt;h2 id="サービスの削除"&gt;&lt;a href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e5%89%8a%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;サービスの削除
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service rm helloworld
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helloworld
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="確認-4"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d-4" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;docker service ls&lt;/code&gt; で helloworld サービスが削除されたのを確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID NAME MODE REPLICAS IMAGE PORTS
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker service inspect&lt;/code&gt; で調べようとしてもそんなサービスはないと言われます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service inspect helloworld
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Status: Error: no such service: helloworld, Code: &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker ps&lt;/code&gt; でタスク（コンテナ）も削除されたことを確認できます。&lt;/p&gt;
&lt;h2 id="ノードの削除"&gt;&lt;a href="#%e3%83%8e%e3%83%bc%e3%83%89%e3%81%ae%e5%89%8a%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;ノードの削除
&lt;/h2&gt;&lt;p&gt;とりあえずここまでやってみました。&lt;br&gt;
チュートリアルでは次はローリングアップデートとなっていますが、そこはまた今度にします。&lt;/p&gt;
&lt;p&gt;尚、上記サービスは削除しましたが、ノードは残ったままです。&lt;br&gt;
ノードの削除方法（Swarm モードの停止方法）を別記事に書きました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/04/docker-swarm_21.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/04/docker-swarm_21.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://knowledge.sakura.ad.jp/11072/" target="_blank" rel="noopener"
 &gt;https://knowledge.sakura.ad.jp/11072/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://circleci.com/ja/blog/docker-swarm-vs-kubernetes/" target="_blank" rel="noopener"
 &gt;https://circleci.com/ja/blog/docker-swarm-vs-kubernetes/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] Swarm モードの停止</title><link>https://blog.ponkotools.com/posts/2022/04/21/docker-swarm/</link><pubDate>Thu, 21 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/21/docker-swarm/</guid><description>&lt;p&gt;Docker Swarm モードを停止するには、Worker ノードと Manager ノードを削除します。&lt;/p&gt;
&lt;h2 id="worker-ノードの削除"&gt;&lt;a href="#worker-%e3%83%8e%e3%83%bc%e3%83%89%e3%81%ae%e5%89%8a%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;Worker ノードの削除
&lt;/h2&gt;&lt;h3 id="ノードの切り離し"&gt;&lt;a href="#%e3%83%8e%e3%83%bc%e3%83%89%e3%81%ae%e5%88%87%e3%82%8a%e9%9b%a2%e3%81%97" class="header-anchor"&gt;&lt;/a&gt;ノードの切り離し
&lt;/h3&gt;&lt;p&gt;Worker ノードで &lt;code&gt;docker swarm leave&lt;/code&gt; を実行すると、Worker ノードが Swarm から切り離されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker swarm leave
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Node left the swarm.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="確認"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h4&gt;&lt;p&gt;Manager ノードで &lt;code&gt;docker node ls&lt;/code&gt; を実行すると、Worker ノードの &lt;code&gt;STATUS&lt;/code&gt; が &lt;code&gt;Down&lt;/code&gt; になったのが確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker node ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hqi4gtcdh4a7ya8myg0x0my37 worker1 Down Active 20.10.12
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;z9voajpw84i4jk2fomqwsmnc7 * manager1 Ready Active Leader 20.10.7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ノードの削除"&gt;&lt;a href="#%e3%83%8e%e3%83%bc%e3%83%89%e3%81%ae%e5%89%8a%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;ノードの削除
&lt;/h3&gt;&lt;p&gt;次に Manager ノードで以下のコマンドを実行すれば、Manager ノードの管理上から Worker ノードが削除されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker node rm &amp;lt;ノードID or ホスト名&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="確認-1"&gt;&lt;a href="#%e7%a2%ba%e8%aa%8d-1" class="header-anchor"&gt;&lt;/a&gt;確認
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;docker node ls&lt;/code&gt; を実行すると、Worker ノードが削除されたのが確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker node ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;z9voajpw84i4jk2fomqwsmnc7 * manager1 Ready Active Leader 20.10.7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="manager-ノードの削除"&gt;&lt;a href="#manager-%e3%83%8e%e3%83%bc%e3%83%89%e3%81%ae%e5%89%8a%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;Manager ノードの削除
&lt;/h2&gt;&lt;p&gt;Manager ノードの削除でも &lt;code&gt;docker swarm leave&lt;/code&gt; を実行しますが、そのまま実行すると以下のようなメッセージが出力されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker swarm leave
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing the last manager erases all current state of the swarm. Use &lt;span class="sb"&gt;`&lt;/span&gt;--force&lt;span class="sb"&gt;`&lt;/span&gt; to ignore this message.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Manager ノードを削除するとSwarm の現在の状態がすべて消去されるために警告が表示されていますが、&lt;code&gt;--force&lt;/code&gt; を指定すれば削除できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker swarm leave --force
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Node left the swarm.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一応以下の公式ドキュメントを見ると、もう少し詳しく書いてあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/swarm_leave/" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/swarm_leave/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要約すると、Manager ノードが複数いる環境では、Manager ノードを Worker ノードに降格させてから削除するのが安全で、最後の Manager ノードの削除、つまり Manager ノード削除後にその Swarm をもう利用しない場合のみ &lt;code&gt;--force&lt;/code&gt; をつけて削除しろ、という感じでしょうか。&lt;/p&gt;
&lt;h2 id="swarm-が無効になったこを確認"&gt;&lt;a href="#swarm-%e3%81%8c%e7%84%a1%e5%8a%b9%e3%81%ab%e3%81%aa%e3%81%a3%e3%81%9f%e3%81%93%e3%82%92%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;Swarm が無効になったこを確認
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;docker info&lt;/code&gt; を実行すると、出力の中に &lt;code&gt;Swarm: inactive&lt;/code&gt; となっているのが確認できるかと思います。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/Brutus/items/b3dfe5957294caa82669" target="_blank" rel="noopener"
 &gt;https://qiita.com/Brutus/items/b3dfe5957294caa82669&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/engine/reference/commandline/swarm_leave/" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/engine/reference/commandline/swarm_leave/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/swarm_leave/" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/swarm_leave/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.oracle.com/cd/E39368_01/E75728/html/ch06s01s05.html" target="_blank" rel="noopener"
 &gt;https://docs.oracle.com/cd/E39368_01/E75728/html/ch06s01s05.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Portainer を docker-compose で動かす</title><link>https://blog.ponkotools.com/posts/2022/04/19/docker-swarm/</link><pubDate>Tue, 19 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/19/docker-swarm/</guid><description>&lt;p&gt;Docker の GUI 管理ツールである Portainer を docker-compose で動かしてみました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker 20.10.7&lt;/li&gt;
&lt;li&gt;portainer-ce 2.11&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="docker-composeyml"&gt;&lt;a href="#docker-composeyml" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yml
&lt;/h2&gt;&lt;p&gt;Docker での動かし方は公式ドキュメントに記載されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.portainer.io/v/ce-2.11/start/install/server/docker/linux" target="_blank" rel="noopener"
 &gt;https://docs.portainer.io/v/ce-2.11/start/install/server/docker/linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これを docker-compose に落とし込んだのが以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;portainer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;portainer/portainer-ce&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;portainer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;portainer_data:/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;9000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;9000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;9443&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;9443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;portainer_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通常 HTTPS で 9443 番ポートで アクセスしますが、HTTP でアクセスしたい場合は 9000 番ポートを使用します。&lt;br&gt;
8000 番ポートは Edge コンピュート機能を使用する場合にのみ必要とありますが、使っていないので詳細はわかりません。
それ以外には特筆すべき点はないかと思います。&lt;/p&gt;
&lt;p&gt;これで http://localhost:9000 にアクセスすれば画面が表示されます。&lt;/p&gt;
&lt;h2 id="portainer-agent-を追加する"&gt;&lt;a href="#portainer-agent-%e3%82%92%e8%bf%bd%e5%8a%a0%e3%81%99%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;Portainer Agent を追加する
&lt;/h2&gt;&lt;p&gt;以上で Portainer が使えるようになったのですが、Docker Volume の中が閲覧出来ませんでした。&lt;br&gt;
これを有効化するには、Docker Swarm または Portainer Agent を追加する必要があるようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.portainer.io/user/docker/volumes/browse" target="_blank" rel="noopener"
 &gt;https://docs.portainer.io/user/docker/volumes/browse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker Swarm はまた別記事にするとして、ここでは Portainer Agent を追加します。&lt;br&gt;
やり方については以下の記事が参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/64735377/install-portainer-portainer-agent-using-docker-compose" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/64735377/install-portainer-portainer-agent-using-docker-compose&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;portainer/agent&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/lib/docker/volumes:/var/lib/docker/volumes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;portainer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;portainer/portainer-ce&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="l"&gt;H tcp://agent:9001 --tlsskipverify&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;9000:9000&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;portainer_data:/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;portainer_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで Docker Volume の中を閲覧できるようになりました。&lt;/p&gt;
&lt;p&gt;Docker Swarm での動かし方は別記事に書きました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/05/portainer-docker-swarm.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/05/portainer-docker-swarm.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.portainer.io/v/ce-2.11/start/install/server/docker/linux" target="_blank" rel="noopener"
 &gt;https://docs.portainer.io/v/ce-2.11/start/install/server/docker/linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/polarbear08/items/931fe04ec228fad13092" target="_blank" rel="noopener"
 &gt;https://qiita.com/polarbear08/items/931fe04ec228fad13092&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/64735377/install-portainer-portainer-agent-using-docker-compose" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/64735377/install-portainer-portainer-agent-using-docker-compose&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Docker] Swarm モードで動作中のサービスについて調べる</title><link>https://blog.ponkotools.com/posts/2022/04/15/docker-swarm/</link><pubDate>Fri, 15 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/15/docker-swarm/</guid><description>&lt;p&gt;Docker Swarm モードで動作中のサービスについて調べる方法です。&lt;br&gt;
尚、Swarm の管理に関するコマンドは、manager ノード上でのみ実行可能です。&lt;/p&gt;
&lt;h2 id="サービスの一覧を調べる"&gt;&lt;a href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e4%b8%80%e8%a6%a7%e3%82%92%e8%aa%bf%e3%81%b9%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;サービスの一覧を調べる
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;docker service ls&lt;/code&gt; で取得できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID NAME MODE REPLICAS IMAGE PORTS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sgwdtal1gqc7 helloworld replicated 1/1 alpine:latest 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="サービスの詳細を調べる"&gt;&lt;a href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e8%a9%b3%e7%b4%b0%e3%82%92%e8%aa%bf%e3%81%b9%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;サービスの詳細を調べる
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;docker service inspect &amp;lt;サービスID or NAME&amp;gt;&lt;/code&gt; で調べられます。&lt;/p&gt;
&lt;p&gt;しかし、このままだと出力が JSON 形式で見づらいので、&lt;code&gt;--pretty&lt;/code&gt; を付けて見やすくしたほうが良いです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service inspect helloworld --pretty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID:		sgwdtal1gqc7j0ht0pgl6ehh6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name:		helloworld
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Service Mode:	Replicated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Replicas:	&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Placement:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;UpdateConfig:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Parallelism:	&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; On failure:	pause
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Monitoring Period: 5s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Max failure ratio: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Update order: stop-first
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RollbackConfig:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Parallelism:	&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; On failure:	pause
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Monitoring Period: 5s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Max failure ratio: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Rollback order: stop-first
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ContainerSpec:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Image:		alpine:latest@sha256:4edbd2beb5f78b1014028f4fbb99f3237d9561100b6881aabbf5acce2c4f9454
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Args:		ping 192.168.4.1 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Init:		&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Resources:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Endpoint Mode:	vip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="サービスがどのノードで動作しているか調べる"&gt;&lt;a href="#%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%8c%e3%81%a9%e3%81%ae%e3%83%8e%e3%83%bc%e3%83%89%e3%81%a7%e5%8b%95%e4%bd%9c%e3%81%97%e3%81%a6%e3%81%84%e3%82%8b%e3%81%8b%e8%aa%bf%e3%81%b9%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;サービスがどのノードで動作しているか調べる
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;docker service ps &amp;lt;サービスID or NAME&amp;gt;&lt;/code&gt; で調べられます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service ps helloworld 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aeg3t0tj1emt helloworld.1 alpine:latest manager1 Running Running about a minute ago 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例えば、１つのサービスが２つのノード上で５タスク動作している場合は以下のような出力になります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker service ps helloworld 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aeg3t0tj1emt helloworld.1 alpine:latest manager1 Running Running &lt;span class="m"&gt;13&lt;/span&gt; minutes ago 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rmf7xhyljero helloworld.2 alpine:latest worker1 Running Running &lt;span class="m"&gt;10&lt;/span&gt; minutes ago 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yfezzc46q7ua helloworld.3 alpine:latest worker1 Running Running &lt;span class="m"&gt;10&lt;/span&gt; minutes ago 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;c3kc1qowfj72 helloworld.4 alpine:latest worker1 Running Running &lt;span class="m"&gt;10&lt;/span&gt; minutes ago 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wudt0zzznt1d helloworld.5 alpine:latest manager1 Running Running &lt;span class="m"&gt;9&lt;/span&gt; minutes ago 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;helloworld&lt;/code&gt; というサービスが５つ動作しており、それが２つのノードに均等に割り振られているのが確認できます。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://docs.docker.jp/engine/swarm/swarm-tutorial/inspect-service.html" target="_blank" rel="noopener"
 &gt;http://docs.docker.jp/engine/swarm/swarm-tutorial/inspect-service.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ubuntu に GitLab-Runner を直接インストールする</title><link>https://blog.ponkotools.com/posts/2022/04/14/gitlab-runner/</link><pubDate>Thu, 14 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/14/gitlab-runner/</guid><description>&lt;p&gt;docker で GitLab-Runner を動かしたことはありましたが、今回初めてホストに直接インストールしました。&lt;/p&gt;
&lt;p&gt;公式ドキュメントは以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/install/" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/install/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h2&gt;&lt;h3 id="apt-でインストール"&gt;&lt;a href="#apt-%e3%81%a7%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;apt でインストール
&lt;/h3&gt;&lt;p&gt;まずはリポジトリを追加します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -L &lt;span class="s2"&gt;&amp;#34;https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;apt でインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install gitlab-runner
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、この方法でインストールしたら結構古いバージョン (11.2.0) がインストールされてしまいました。&lt;br&gt;
最新のバージョンは 14.9.1 のはずなんですが・・・。&lt;/p&gt;
&lt;p&gt;今動かしている GitLab と互換性がなく上手く動かなったので、最終的には次に示すように deb パッケージからインストールしました。&lt;/p&gt;
&lt;h3 id="deb-パッケージからインストール"&gt;&lt;a href="#deb-%e3%83%91%e3%83%83%e3%82%b1%e3%83%bc%e3%82%b8%e3%81%8b%e3%82%89%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;deb パッケージからインストール
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/install/linux-manually.html" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/install/linux-manually.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ドキュメントだと curl を使うようになっていますが、上手くダウンロードできなかったのと、環境変数 &lt;code&gt;arch&lt;/code&gt; が空だったので、以下のコマンドでダウンロードしました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wget &lt;span class="s2"&gt;&amp;#34;https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次のコマンドでインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ dpkg -i gitlab-runner_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="gitlab-への登録"&gt;&lt;a href="#gitlab-%e3%81%b8%e3%81%ae%e7%99%bb%e9%8c%b2" class="header-anchor"&gt;&lt;/a&gt;GitLab への登録
&lt;/h2&gt;&lt;p&gt;インストールが完了したら Gitlab-Runner を GitLab に登録します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/register/index.html#linux" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/register/index.html#linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gitlab-runner register
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;対話形式で入力していきます。&lt;/p&gt;
&lt;p&gt;まず、GitLab の URL を指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please enter the gitlab-ci coordinator URL &lt;span class="o"&gt;(&lt;/span&gt;e.g. https://gitlab.com/&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://gitlab.example
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次にトークンを入力します。&lt;br&gt;
トークンは GitLab に管理者でログインし、Menu &amp;gt; Admin &amp;gt; Runner で確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please enter the gitlab-ci token for this runner:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;U6YYzWyiQYzzfCdDH1dv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ランナーの詳細を入力します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please enter the gitlab-ci description &lt;span class="k"&gt;for&lt;/span&gt; this runner:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ランナーを識別するためのタグを指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please enter the gitlab-ci tags &lt;span class="k"&gt;for&lt;/span&gt; this runner &lt;span class="o"&gt;(&lt;/span&gt;comma separated&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次はオプションなので何も入力せず進みました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter optional maintenance note &lt;span class="k"&gt;for&lt;/span&gt; the runner:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最後にスクリプトの実行方法を指定します。&lt;br&gt;
今回はホスト上で直接実行させたかったので、&lt;code&gt;shell&lt;/code&gt; を指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please enter the executor: virtualbox, docker+machine, docker, docker-ssh, parallels, kubernetes, shell, ssh, docker-ssh+machine:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GitLab の Menu &amp;gt; Admin &amp;gt; Runner で登録されたことが確認できます。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/install/" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/install/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/install/linux-manually.html" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/install/linux-manually.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/register/index.html#linux" target="_blank" rel="noopener"
 &gt;https://docs.gitlab.com/runner/register/index.html#linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker イメージの保存先を変更</title><link>https://blog.ponkotools.com/posts/2022/04/08/docker/</link><pubDate>Fri, 08 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/08/docker/</guid><description>&lt;p&gt;ストレージの容量が少ない場合など、新たに SSD を接続し、そちらに Docker イメージを保存する方法です。&lt;/p&gt;
&lt;p&gt;以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/atinfinity/lab/wiki/change_docker_image_directory" target="_blank" rel="noopener"
 &gt;https://github.com/atinfinity/lab/wiki/change_docker_image_directory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 18.04&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="手順"&gt;&lt;a href="#%e6%89%8b%e9%a0%86" class="header-anchor"&gt;&lt;/a&gt;手順
&lt;/h2&gt;&lt;h3 id="docker-サービスの停止"&gt;&lt;a href="#docker-%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%81%ae%e5%81%9c%e6%ad%a2" class="header-anchor"&gt;&lt;/a&gt;Docker サービスの停止
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo service docker stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="既存データの退避"&gt;&lt;a href="#%e6%97%a2%e5%ad%98%e3%83%87%e3%83%bc%e3%82%bf%e3%81%ae%e9%80%80%e9%81%bf" class="header-anchor"&gt;&lt;/a&gt;既存データの退避
&lt;/h3&gt;&lt;p&gt;既存のデータは &lt;code&gt;/var/lib/docker&lt;/code&gt; にあるので、これを外部ストレージに移動します。&lt;br&gt;
SSD は &lt;code&gt;/mnt/ssd&lt;/code&gt; にマウントしており、そこに &lt;code&gt;docker&lt;/code&gt; というディレクトリを作成してデータを移動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo mkdir /mnt/ssd/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo rsync -aXS /var/lib/docker/. /mnt/ssd/docker/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="設定変更"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;設定変更
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; を開きます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo nano /etc/docker/daemon.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を記述して、保存先を &lt;code&gt;/mnt/ssd/docker&lt;/code&gt; に設定します．&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;graph&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/mnt/ssd/docker&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="設定の反映"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a%e3%81%ae%e5%8f%8d%e6%98%a0" class="header-anchor"&gt;&lt;/a&gt;設定の反映
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo service docker start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="動作確認"&gt;&lt;a href="#%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;動作確認
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker info &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;Docker Root Dir&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker Root Dir: /mnt/ssd/docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="古いデータを削除"&gt;&lt;a href="#%e5%8f%a4%e3%81%84%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e5%89%8a%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;古いデータを削除
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/var/lib/docker&lt;/code&gt; を削除します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo rm -rf /var/lib/docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="error-creating-overlay-mount-to-というエラーが表示される"&gt;&lt;a href="#error-creating-overlay-mount-to-%e3%81%a8%e3%81%84%e3%81%86%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%8c%e8%a1%a8%e7%a4%ba%e3%81%95%e3%82%8c%e3%82%8b" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;error creating overlay mount to&lt;/code&gt; というエラーが表示される
&lt;/h2&gt;&lt;p&gt;Docker コンテナを作成しようとした際に、&lt;code&gt;error creating overlay mount to&lt;/code&gt; みたいなエラーが表示されました。&lt;br&gt;
私の場合はファイルシステムが NTFS だったことが原因でした。&lt;br&gt;
EXT4 でフォーマットすれば正常にできました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/atinfinity/lab/wiki/change_docker_image_directory" target="_blank" rel="noopener"
 &gt;https://github.com/atinfinity/lab/wiki/change_docker_image_directory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GitLab の root の初期パスワードを調べる</title><link>https://blog.ponkotools.com/posts/2022/04/07/gitlab/</link><pubDate>Thu, 07 Apr 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/04/07/gitlab/</guid><description>&lt;p&gt;久しぶりに新規に GitLab を構築したら仕様が変わっていて困ったのでメモ。&lt;/p&gt;
&lt;p&gt;以前は初回アクセス時にパスワード変更の画面が表示されていたと思うのですが、GitLab 14.9 では表示されませんでした。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;p&gt;Docker で GitLab を動かしています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gitlab-ce:14.9.2-ce&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="root-の初期パスワードの確認"&gt;&lt;a href="#root-%e3%81%ae%e5%88%9d%e6%9c%9f%e3%83%91%e3%82%b9%e3%83%af%e3%83%bc%e3%83%89%e3%81%ae%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;root の初期パスワードの確認
&lt;/h2&gt;&lt;p&gt;root でログインするための初期パスワードは &lt;code&gt;/etc/gitlab/initial_root_password&lt;/code&gt; に記載されているそうです。&lt;/p&gt;
&lt;p&gt;今回 Docker で GitLab を動かしているので、以下のようにコンテナに入ってから確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it gitlab bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# cat /etc/gitlab/initial_root_password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;gitlab&lt;/code&gt; はコンテナ名です。&lt;/p&gt;
&lt;h2 id="root-の初期パスワードの変更"&gt;&lt;a href="#root-%e3%81%ae%e5%88%9d%e6%9c%9f%e3%83%91%e3%82%b9%e3%83%af%e3%83%bc%e3%83%89%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;root の初期パスワードの変更
&lt;/h2&gt;&lt;p&gt;初期パスワードは24時間経ったら削除されるとあるので、ログインできたらパスワードを変更しておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;右上のユーザーメニューから「Edit Profile」を選択&lt;/li&gt;
&lt;li&gt;サイドメニューより「Password」を選択&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/masa2223/items/78aaf76329637e6ca12d" target="_blank" rel="noopener"
 &gt;https://qiita.com/masa2223/items/78aaf76329637e6ca12d&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>nvidia-docker2 (nvidia-container-toolkit) のインストール</title><link>https://blog.ponkotools.com/posts/2022/03/31/nvidia-docker/</link><pubDate>Thu, 31 Mar 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/03/31/nvidia-docker/</guid><description>&lt;p&gt;Docker コンテナ内で GPU を使うためには NVIDIA Container Toolkit をインストールする必要があります。&lt;/p&gt;
&lt;p&gt;公式ドキュメントは以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html" target="_blank" rel="noopener"
 &gt;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール方法"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;インストール方法
&lt;/h2&gt;&lt;p&gt;上記のページにインストール手順も書いてあります。&lt;br&gt;
（以下は見やすくするためにコマンドを分割しています。）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;distribution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;. /etc/os-release&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$ID$VERSION_ID&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey &lt;span class="p"&gt;|&lt;/span&gt; sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -s -L https://nvidia.github.io/libnvidia-container/&lt;span class="nv"&gt;$distribution&lt;/span&gt;/libnvidia-container.list &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install -y nvidia-docker2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;nvidia-docker2&lt;/code&gt; がトップレベルのパッケージらしいので、インストールするときは &lt;code&gt;nvidia-container-toolkit&lt;/code&gt; ではなく &lt;code&gt;nvidia-docker2&lt;/code&gt; を指定するようです。&lt;br&gt;
ここらへん以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/tkusumi/items/f275f0737fb5b261a868" target="_blank" rel="noopener"
 &gt;https://qiita.com/tkusumi/items/f275f0737fb5b261a868&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まぁ公式ドキュメントが &lt;code&gt;nvidia-docker2&lt;/code&gt; をインストールするようになっていますし、それに従えばよいかと。&lt;/p&gt;
&lt;p&gt;また、古い記事では &lt;code&gt;nvidia-docker&lt;/code&gt; と書いてあったりしますが、ここらへんの変遷は以下が参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ksasaki/items/b20a785e1a0f610efa08" target="_blank" rel="noopener"
 &gt;https://qiita.com/ksasaki/items/b20a785e1a0f610efa08&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="動作確認"&gt;&lt;a href="#%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;動作確認
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;nvidia-container-cli&lt;/code&gt; で確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvidia-container-cli --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cli-version: 1.8.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lib-version: 1.8.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build date: 2022-02-14T12:02+00:00
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build revision: abd4e14d8cb923e2a70b7dcfee55fbc16bffa353
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build compiler: x86_64-linux-gnu-gcc-7 7.5.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build platform: x86_64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build flags: -D_GNU_SOURCE -D_FORTIFY_SOURCE&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; -DNDEBUG -std&lt;span class="o"&gt;=&lt;/span&gt;gnu11 -O2 -g -fdata-sections -ffunction-sections -fplan9-extensions -fstack-protector -fno-strict-aliasing -fvisibility&lt;span class="o"&gt;=&lt;/span&gt;hidden -Wall -Wextra -Wcast-align -Wpointer-arith -Wmissing-prototypes -Wnonnull -Wwrite-strings -Wlogical-op -Wformat&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; -Wmissing-format-attribute -Winit-self -Wshadow -Wstrict-prototypes -Wunreachable-code -Wconversion -Wsign-conversion -Wno-unknown-warning-option -Wno-format-extra-args -Wno-gnu-alignof-expression -Wl,-zrelro -Wl,-znow -Wl,-zdefs -Wl,--gc-sections
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvidia-container-cli info
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NVRM version: 470.103.01
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CUDA version: 11.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device Index: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device Minor: &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Model: NVIDIA GeForce RTX &lt;span class="m"&gt;3080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Brand: GeForce
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GPU UUID: GPU-565ac97c-fe71-f49b-1ac0-7ac93c7dab8d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Bus Location: 00000000:01:00.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Architecture: 8.6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://takake-blog.com/ubuntu-2004-install-nvidiacontainertoolkit/" target="_blank" rel="noopener"
 &gt;https://takake-blog.com/ubuntu-2004-install-nvidiacontainertoolkit/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/tkusumi/items/f275f0737fb5b261a868" target="_blank" rel="noopener"
 &gt;https://qiita.com/tkusumi/items/f275f0737fb5b261a868&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ksasaki/items/b20a785e1a0f610efa08" target="_blank" rel="noopener"
 &gt;https://qiita.com/ksasaki/items/b20a785e1a0f610efa08&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gangannikki.hatenadiary.jp/entry/2020/09/26/200000" target="_blank" rel="noopener"
 &gt;https://gangannikki.hatenadiary.jp/entry/2020/09/26/200000&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>docker イメージのファイル保存、読み込み</title><link>https://blog.ponkotools.com/posts/2022/03/29/docker/</link><pubDate>Tue, 29 Mar 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/03/29/docker/</guid><description>&lt;p&gt;ネットに繋がらない環境で docker コンテナを動かすために docker イメージをファイルから読み込むことがあったので、そのメモです。&lt;/p&gt;
&lt;h3 id="イメージをファイルに保存"&gt;&lt;a href="#%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e3%82%92%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ab%e4%bf%9d%e5%ad%98" class="header-anchor"&gt;&lt;/a&gt;イメージをファイルに保存
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker save イメージ名:タグ &amp;gt; filename.tar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ファイルをロードしてイメージを作成"&gt;&lt;a href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e3%83%ad%e3%83%bc%e3%83%89%e3%81%97%e3%81%a6%e3%82%a4%e3%83%a1%e3%83%bc%e3%82%b8%e3%82%92%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;ファイルをロードしてイメージを作成
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker load -i filename.tar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;または&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker load &amp;lt; filename.tar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;イメージ名とタグ名はもとのものと同じで読み込まれました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://uxmilk.jp/55512" target="_blank" rel="noopener"
 &gt;https://uxmilk.jp/55512&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Windows PC から NAS に接続できなくなった</title><link>https://blog.ponkotools.com/posts/2022/03/19/windows-nas/</link><pubDate>Sat, 19 Mar 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/03/19/windows-nas/</guid><description>&lt;p&gt;ちょっと古めの NAS を持っているのですが、Windows 10 の PC からアクセスできなくなりました。&lt;/p&gt;
&lt;p&gt;以前はアクセスできていたはずなのですが、いつの間にかアクセスできなくなっていました。
スマホからはアクセスできているので機器の故障ではなく、またネットワークに問題がないことも確認済みです。&lt;/p&gt;
&lt;p&gt;んで、いろいろ調べていたのですが、どうやらその NAS には SMB1 のプロトコルでアクセスする必要があるみたいで、Windows 10 では機能を有効化しないといけないようです。&lt;/p&gt;
&lt;p&gt;上述したように以前はアクセスできていたはずなんですけど・・・、Windows Update かなんかで設定が変わったんですかね？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;[スタート]-[Windows システム ツール]-[コントロール パネル] を開く&lt;/li&gt;
&lt;li&gt;[プログラム]-[プログラムと機能] を開く&lt;/li&gt;
&lt;li&gt;[Windows の機能の有効化または無効化] をクリック&lt;/li&gt;
&lt;li&gt;「SMB 1.0/CIFS ファイル共有のサポート」の「SMB 1.0/CIFS クライアント」にチェックを入れて [OK] をクリック&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvBkFniSF_x1RQXALeUAKTtCCXzOmuLyx44Dhabi8ZyiIgVTjqsAVhlsM_pOdUjUO-rdebPkwFXm9AXMC9MMVo14BAFM7Gx0U9tEQpYMTuHqxiCPy3xDHPuvLNyZIqMQWvwf9ALz-yDSR5dnelIov7m7xDRTZVJOytFEislqf6yM9TK7WWSxU5Ue08/s694/smb.png" style="display: block; padding: 1em 0; text-align: center; "&gt;&lt;img alt="" border="0" width="320" data-original-height="615" data-original-width="694" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvBkFniSF_x1RQXALeUAKTtCCXzOmuLyx44Dhabi8ZyiIgVTjqsAVhlsM_pOdUjUO-rdebPkwFXm9AXMC9MMVo14BAFM7Gx0U9tEQpYMTuHqxiCPy3xDHPuvLNyZIqMQWvwf9ALz-yDSR5dnelIov7m7xDRTZVJOytFEislqf6yM9TK7WWSxU5Ue08/s320/smb.png"/&gt;&lt;/a&gt;&lt;/div&gt;
1. [今すぐ再起動]をクリックする。
&lt;p&gt;再起動後にアクセスできるようになりました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.iodata.jp/support/qanda/answer/s30023.htm" target="_blank" rel="noopener"
 &gt;https://www.iodata.jp/support/qanda/answer/s30023.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.iodata.jp/support/qanda/answer/s30381.htm" target="_blank" rel="noopener"
 &gt;https://www.iodata.jp/support/qanda/answer/s30381.htm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>WSL2 の Ubuntu で Docker を動かす</title><link>https://blog.ponkotools.com/posts/2022/01/20/wsl-ubuntu-docker/</link><pubDate>Thu, 20 Jan 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/01/20/wsl-ubuntu-docker/</guid><description>&lt;p&gt;DockerDesktop が有償になったので、WSL2 の Ubuntu に Docker をインストールして動かすようにしてみました、&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Windows 10&lt;/li&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WSL2 および Ubuntu はインストール済みの前提です。&lt;br&gt;
以下のページに書いてあるので、まだの場合は参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/01/wsl2.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/01/wsl2.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="プロキシ設定"&gt;&lt;a href="#%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;プロキシ設定
&lt;/h2&gt;&lt;p&gt;環境に応じてプロキシの設定を行っておきます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.bashrc&lt;/code&gt; をエディタで開き、最後に以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;http_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://example.com:8080
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;https_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://example.com:8080
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;no_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;任意のIPアドレス
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="apt-のプロキシ設定"&gt;&lt;a href="#apt-%e3%81%ae%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;apt のプロキシ設定
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/etc/apt/apt.conf&lt;/code&gt; を作成して以下のように記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Acquire::http::proxy &lt;span class="s2"&gt;&amp;#34;http://example.com:8080/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Acquire::https::proxy &lt;span class="s2"&gt;&amp;#34;https://example.com:8080/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-のインストール"&gt;&lt;a href="#docker-%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;Docker のインストール
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/engine/install/ubuntu/" target="_blank" rel="noopener"
 &gt;公式ドキュメント&lt;/a&gt;に沿ってインストールします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get remove docker docker-engine docker.io containerd runc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ユーザーを-docker-グループに追加"&gt;&lt;a href="#%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%82%92-docker-%e3%82%b0%e3%83%ab%e3%83%bc%e3%83%97%e3%81%ab%e8%bf%bd%e5%8a%a0" class="header-anchor"&gt;&lt;/a&gt;ユーザーを docker グループに追加
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gpasswd -a &lt;span class="k"&gt;$(&lt;/span&gt;whoami&lt;span class="k"&gt;)&lt;/span&gt; docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで docker コマンド実行時に sudo が不要になります。&lt;/p&gt;
&lt;h3 id="docker-のプロキシ設定"&gt;&lt;a href="#docker-%e3%81%ae%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;docker のプロキシ設定
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/etc/default/docker&lt;/code&gt; をエディタで開いて以下を追加します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;http_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://example.com:8080
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;https_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://example.com:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、&lt;code&gt;~/.docker/config.json&lt;/code&gt; に以下を記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;proxies&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;httpProxy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://example.com:8080&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;httpsProxy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://example.com:8080&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-デーモンの起動"&gt;&lt;a href="#docker-%e3%83%87%e3%83%bc%e3%83%a2%e3%83%b3%e3%81%ae%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;docker デーモンの起動
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo service docker start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="動作確認"&gt;&lt;a href="#%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d" class="header-anchor"&gt;&lt;/a&gt;動作確認
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker info
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run hello-world
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すると、私の場合以下のエラーが表示されました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;docker デーモンが起動しているか確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo service docker status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* Docker is not running
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原因がわからず悩んでいたところ、以下の記事を見つけました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/neight0903/items/ef0e2170b712b194c3fc" target="_blank" rel="noopener"
 &gt;https://qiita.com/neight0903/items/ef0e2170b712b194c3fc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;私の場合、既に DockerDesktop はアンインストールしていました。&lt;br&gt;
もともとは DockerDesktop と WSL2 を使って動かしていたのですが、今回 DockerDesktop なしで動くようにしようとしているところで、
DockerDesktop だけでなく WSL2 も一度アンインストールして最初からやり直すと上手く行きました。&lt;/p&gt;
&lt;h2 id="docker-デーモンの自動起動"&gt;&lt;a href="#docker-%e3%83%87%e3%83%bc%e3%83%a2%e3%83%b3%e3%81%ae%e8%87%aa%e5%8b%95%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;docker デーモンの自動起動
&lt;/h2&gt;&lt;p&gt;このままでは WSL を起動する度に docker デーモンを手動で起動する必要がありますが、以下のページに自動起動させる方法があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/taiga533/articles/11f1b21ef4a5ff" target="_blank" rel="noopener"
 &gt;https://zenn.dev/taiga533/articles/11f1b21ef4a5ff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ko-zi/items/949d358163bbbad5a91e" target="_blank" rel="noopener"
 &gt;https://qiita.com/ko-zi/items/949d358163bbbad5a91e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zukucode.com/2021/11/wsl2-docker-startup.html" target="_blank" rel="noopener"
 &gt;https://zukucode.com/2021/11/wsl2-docker-startup.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まずは &lt;code&gt;sudo service docker start&lt;/code&gt; をパスワードなしで実行できるように設定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo visudo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ユーザー名 ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service docker start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは .bashrc に以下を追記します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nano .bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if [ $(service docker status | awk &amp;#39;{print $4}&amp;#39;) = &amp;#34;not&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo service docker start &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="windows-と-wsl2-のポートフォワーディングの設定"&gt;&lt;a href="#windows-%e3%81%a8-wsl2-%e3%81%ae%e3%83%9d%e3%83%bc%e3%83%88%e3%83%95%e3%82%a9%e3%83%af%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Windows と WSL2 のポートフォワーディングの設定
&lt;/h2&gt;&lt;p&gt;WSL2 上の Docker コンテナに外部からアクセスしたい場合、Windows と WSL2 のポートフォワーディングの設定が必要です。&lt;br&gt;
詳細は以下の記事を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/07/wsl2-docker.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/07/wsl2-docker.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://zenn.dev/taiga533/articles/11f1b21ef4a5ff" target="_blank" rel="noopener"
 &gt;https://zenn.dev/taiga533/articles/11f1b21ef4a5ff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/neight0903/items/ef0e2170b712b194c3fc" target="_blank" rel="noopener"
 &gt;https://qiita.com/neight0903/items/ef0e2170b712b194c3fc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker コンテナの内容を変更して、既存のイメージに上書きする</title><link>https://blog.ponkotools.com/posts/2022/01/13/docker/</link><pubDate>Thu, 13 Jan 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/01/13/docker/</guid><description>&lt;p&gt;&lt;code&gt;docker commit&lt;/code&gt; を行う際に忘れがちなのでメモです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker commit コンテナ名 使用中のイメージ名:タグ
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;例&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker commit hoge piyo:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;hoge&lt;/code&gt; というコンテナを &lt;code&gt;piyo:latest&lt;/code&gt; というイメージで保存します。&lt;br&gt;
そのイメージが既に存在する場合は上書きされます。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/mats16/items/712575dc50513dfdf0a2" target="_blank" rel="noopener"
 &gt;https://qiita.com/mats16/items/712575dc50513dfdf0a2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GPU を複数積んでいるマシンで、GPU を指定して Docker コンテナを動かす</title><link>https://blog.ponkotools.com/posts/2022/01/12/docker/</link><pubDate>Wed, 12 Jan 2022 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2022/01/12/docker/</guid><description>&lt;p&gt;タイトルの通りです。&lt;code&gt;docker run&lt;/code&gt; での指定方法と、docker-compose での指定方法です。&lt;/p&gt;
&lt;h2 id="docker-run-での指定方法"&gt;&lt;a href="#docker-run-%e3%81%a7%e3%81%ae%e6%8c%87%e5%ae%9a%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;docker run での指定方法
&lt;/h2&gt;&lt;p&gt;以下のページが参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://cocoinit23.com/docker-run-multi-gpu/" target="_blank" rel="noopener"
 &gt;https://cocoinit23.com/docker-run-multi-gpu/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;全ての GPU を指定する場合は &lt;code&gt;--gpus all&lt;/code&gt; を指定します。&lt;/p&gt;
&lt;p&gt;特定の GPU を指定する場合は &lt;code&gt;--gpus '&amp;quot;device=0&amp;quot;'&lt;/code&gt; のように指定します。&lt;/p&gt;
&lt;h2 id="docker-compose-での指定方法"&gt;&lt;a href="#docker-compose-%e3%81%a7%e3%81%ae%e6%8c%87%e5%ae%9a%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;docker-compose での指定方法
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;--gpus all&lt;/code&gt; に相当する書き方は以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;reservations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;gpu]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--gpus '&amp;quot;device=0&amp;quot;'&lt;/code&gt; に相当する書き方は以下です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;reservations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;gpu]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;device_ids&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;詳細は公式のドキュメントに書いてあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/compose/gpu-support/" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/compose/gpu-support/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="docker-compose-のアップデート"&gt;&lt;a href="#docker-compose-%e3%81%ae%e3%82%a2%e3%83%83%e3%83%97%e3%83%87%e3%83%bc%e3%83%88" class="header-anchor"&gt;&lt;/a&gt;docker-compose のアップデート
&lt;/h3&gt;&lt;p&gt;私の環境では docker-compose のバージョンは 1.25.0 でしたが、docker-compose で GPU を使えるようにするためには 1.28.0 以上でなければならないようなので、そのような場合にはアップデートが必要です。&lt;br&gt;
docker-compose のアップデート方法については以下を参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2022/09/docker-compose.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2022/09/docker-compose.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://cocoinit23.com/docker-run-multi-gpu/" target="_blank" rel="noopener"
 &gt;https://cocoinit23.com/docker-run-multi-gpu/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/compose/gpu-support/" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/compose/gpu-support/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Telegraf で Docker の情報を 取得して Grafana で可視化する</title><link>https://blog.ponkotools.com/posts/2021/12/27/telegraf-grafana/</link><pubDate>Mon, 27 Dec 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/12/27/telegraf-grafana/</guid><description>&lt;p&gt;サーバーリソースの可視化は以前やったので、今度は Docker の情報を可視化してみました。&lt;/p&gt;
&lt;p&gt;Grafana のダッシュボードは以下を使いました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/10585" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/10585&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これに書いてあることをやっただけですが・・・。&lt;/p&gt;
&lt;h2 id="telegrafconf-の設定"&gt;&lt;a href="#telegrafconf-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;telegraf.conf の設定
&lt;/h2&gt;&lt;p&gt;以下を追加します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;unix:///var/run/docker.sock&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gather_services&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;container_name_include&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;container_name_exclude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;docker_label_include&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;docker_label_exclude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;perdevice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-composeyaml-の設定"&gt;&lt;a href="#docker-composeyaml-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yaml の設定
&lt;/h2&gt;&lt;p&gt;Telegraf の volume に &lt;code&gt;/var/run/docker.sock&lt;/code&gt; を追加します。&lt;br&gt;
また、&lt;code&gt;/var/run/docker.sock&lt;/code&gt; にアクセスするためには Telegraf の実行ユーザーを Docker と同じにする必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.influxdata.com/blog/docker-run-telegraf-as-non-root/" target="_blank" rel="noopener"
 &gt;https://www.influxdata.com/blog/docker-run-telegraf-as-non-root/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;133&lt;/span&gt; &lt;span class="c1"&gt;# UID:GID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;さらに、情報を習得したい全サービスに以下を追加してグループ化します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;labels:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &amp;#34;docker.group=&amp;lt;some_name&amp;gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ラベルの名前は何でもいいようです。&lt;br&gt;
ラベルを設定しなかったサービスの情報は取得されませんでした。&lt;/p&gt;
&lt;h2 id="grafana-の設定"&gt;&lt;a href="#grafana-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Grafana の設定
&lt;/h2&gt;&lt;p&gt;以下から JSON ファイルをダウンロードし、Grafana でインポートします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/10585" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/10585&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上で以下のようなダッシュボードが表示されます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="515px" data-flex-grow="214" height="933" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2021/12/27/telegraf-grafana/01.webp" srcset="https://blog.ponkotools.com/posts/2021/12/27/telegraf-grafana/01_hu_3ea807a2ee27bfa9.webp 800w, https://blog.ponkotools.com/posts/2021/12/27/telegraf-grafana/01_hu_4a0caec175c09e8c.webp 1600w, https://blog.ponkotools.com/posts/2021/12/27/telegraf-grafana/01.webp 2005w" width="2005"&gt;&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/10585" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/10585&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.influxdata.com/blog/docker-run-telegraf-as-non-root/" target="_blank" rel="noopener"
 &gt;https://www.influxdata.com/blog/docker-run-telegraf-as-non-root/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Telegraf で GPU の情報を取得し、Grafana で可視化する</title><link>https://blog.ponkotools.com/posts/2021/12/26/telegraf-grafana/</link><pubDate>Sun, 26 Dec 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/12/26/telegraf-grafana/</guid><description>&lt;p&gt;Telegraf, InfluxDB, Grafana を使って GPU の情報を閲覧できるようにしました。&lt;/p&gt;
&lt;p&gt;以前、Telegraf, InfluxDB, Grafana を使ってサーバーリソースの情報を閲覧できるようにしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2021/12/telegraf-influxdb-garafana.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2021/12/telegraf-influxdb-garafana.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これを前提としたうえで、今回 GPU の情報も見れるようにしました。&lt;/p&gt;
&lt;p&gt;試したグラフィックボードは NVIDIA GeForce RTX 3080 です。&lt;br&gt;
グラフィックドライバーのインストールなどは完了している前提です。&lt;/p&gt;
&lt;h2 id="概要"&gt;&lt;a href="#%e6%a6%82%e8%a6%81" class="header-anchor"&gt;&lt;/a&gt;概要
&lt;/h2&gt;&lt;p&gt;Telegraf の nvidia_smi プラグインを使えば GPU の情報を取得できるようです。&lt;br&gt;
nvidia_smi のプラグインについては以下に説明があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nvidia_smi/README.md" target="_blank" rel="noopener"
 &gt;https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nvidia_smi/README.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記の記事に書いてありますが、Docker で動作させている Telegraf で GPU の情報を取得するには、以下の２つの方法があるようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nvidia/cuda&lt;/code&gt; の Docker イメージをベースに Telegraf をインストールしたカスタムイメージを作成する&lt;/li&gt;
&lt;li&gt;Volume のマウントバインディングを使用して nvidia-smi のバイナリを Docker コンテナに注入する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回は後者でいきます。&lt;/p&gt;
&lt;h2 id="telegraf-の設定"&gt;&lt;a href="#telegraf-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Telegraf の設定
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;telegraf.conf&lt;/code&gt; に以下を追加しました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[[inputs.nvidia_smi]]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; #bin_path = &amp;#34;/usr/bin/nvidia-smi&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;inputs.nvidia_smi&lt;/code&gt; を追加するだけでプラグインが有効になるようです。&lt;br&gt;
&lt;code&gt;bin_path&lt;/code&gt; は &lt;code&gt;nvidia-smi&lt;/code&gt; のある場所です。&lt;br&gt;
以下のコマンドで調べられます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ which nvidia-smi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/bin/nvidia-smi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Linux では通常 &lt;code&gt;/usr/bin/nvidia-smi&lt;/code&gt; にあるそうで、その場合は指定しなくてもよいそうです。&lt;/p&gt;
&lt;h2 id="docker-compose-の設定"&gt;&lt;a href="#docker-compose-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;docker-compose の設定
&lt;/h2&gt;&lt;p&gt;Telegraf を動作させている Docker コンテナから nvidia-smi と GPU にアクセスできるように設定します。&lt;br&gt;
例えば、以下のような感じです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: &amp;#39;3.5&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; telegraf:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; container_name: telegraf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: telegraf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - NVIDIA_VISIBLE_DEVICES=all
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - NVIDIA_DRIVER_CAPABILITIES=all
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; deploy:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; resources:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reservations:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; devices:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - capabilities: [gpu]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - /usr/bin/nvidia-smi:/usr/bin/nvidia-smi:ro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ホストの &lt;code&gt;/usr/bin/nvidia-smi&lt;/code&gt; をコンテナにマウントします。&lt;br&gt;
Docker コンテナでの GPU の使用については以下の記事にも書いているので、参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2021/11/docker-compose-gpu.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2021/11/docker-compose-gpu.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="grafana-の設定"&gt;&lt;a href="#grafana-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Grafana の設定
&lt;/h2&gt;&lt;p&gt;Docker コンテナを起動したら、Grafana で以下のダッシュボードのテンプレートをインストールします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/12225" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/12225&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これで閲覧できるようになると思ったのですが、&lt;code&gt;Hostname&lt;/code&gt; に &lt;code&gt;None&lt;/code&gt; しか表示されず、グラフに何も表示されない状態でした。&lt;br&gt;
どうもこのテンプレートが Windows を前提としているようですので、ダッシュボードの設定をちょっと修正しました。&lt;/p&gt;
&lt;p&gt;ダッシュボードの設定画面を開き Variables を選択します。&lt;br&gt;
&lt;code&gt;hostname&lt;/code&gt; の定義を以下のように変更します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;変更前&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SHOW TAG VALUES FROM &amp;#34;win_system&amp;#34; WITH KEY = &amp;#34;host&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;変更後&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SHOW TAG VALUES FROM system WITH KEY=host
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで以下のようにグラフが表示されるようになりました。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="394px" data-flex-grow="164" height="427" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2021/12/26/telegraf-grafana/01.webp" width="701"&gt;&lt;/p&gt;
&lt;p&gt;他に &lt;code&gt;CPU Usage&lt;/code&gt; と &lt;code&gt;Memory Free&lt;/code&gt; のメーター表示も Windows 前提となっているようなので、必要なら修正してください。&lt;br&gt;
私は CPU やメモリなどは他のダッシュボードで閲覧しており、ここでは GPU の情報だけで十分だったので、そこまで修正しませんでした。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nvidia_smi/README.md" target="_blank" rel="noopener"
 &gt;https://github.com/influxdata/telegraf/blob/master/plugins/inputs/nvidia_smi/README.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cristianpb.github.io/blog/grafana-dashboard" target="_blank" rel="noopener"
 &gt;https://cristianpb.github.io/blog/grafana-dashboard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Python] Docker コンテナ内のアプリのログをホストの Syslog に追加する</title><link>https://blog.ponkotools.com/posts/2021/12/24/docker-syslog/</link><pubDate>Fri, 24 Dec 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/12/24/docker-syslog/</guid><description>&lt;p&gt;docker コンテナ内で動作している python アプリのログをホストの syslog に追加します。&lt;/p&gt;
&lt;p&gt;Ubuntu 20.04 で作業しましたが、rsyslog は最初からインストールされていました。&lt;/p&gt;
&lt;h2 id="概要"&gt;&lt;a href="#%e6%a6%82%e8%a6%81" class="header-anchor"&gt;&lt;/a&gt;概要
&lt;/h2&gt;&lt;p&gt;Python 標準の logging モジュールに syslog 出力用のハンドラ &lt;code&gt;SysLogHandler&lt;/code&gt; があるので、アプリ側ではそれを指定するだけで OK です。&lt;/p&gt;
&lt;p&gt;Syslog はホストに対して UDP でログを送信して追加します。&lt;br&gt;
理由は以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;docker コンテナ内でアプリを動かしているので、今後コンテナが増えたときコンテナごとに rsyslog を設定してやるのが面倒そう&lt;/li&gt;
&lt;li&gt;各コンテナのログを一箇所に集約したい&lt;/li&gt;
&lt;li&gt;syslog の記録には TCP or UDP のポート 514 が使用されるらしいが、&lt;code&gt;SysLogHandler&lt;/code&gt; では UDP しか対応していないよう&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rsyslog-の設定変更"&gt;&lt;a href="#rsyslog-%e3%81%ae%e8%a8%ad%e5%ae%9a%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;rsyslog の設定変更
&lt;/h2&gt;&lt;p&gt;UDP のポート514 でログを待ち受けるように設定を変更します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/rsyslog.conf&lt;/code&gt; を編集します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gedit /etc/rsyslog.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下の２行のコメントを外します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;load&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;imudp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;imudp&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;514&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;変更後は再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl restart rsyslog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アプリ側の実装"&gt;&lt;a href="#%e3%82%a2%e3%83%97%e3%83%aa%e5%81%b4%e3%81%ae%e5%ae%9f%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;アプリ側の実装
&lt;/h2&gt;&lt;p&gt;ログに関する設定を &lt;code&gt;logging.yaml&lt;/code&gt; に切り出しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2021/12/python_21.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2021/12/python_21.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その前提のうえで、以下のように指定するだけでログが UDP で送信されるようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; level: DEBUG
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; handlers: [syslog]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;handlers:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; syslog:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; class: logging.handlers.SysLogHandler
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; formatter: syslog_format
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; address: [&amp;#39;host.docker.internal&amp;#39;, 514]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; #address: &amp;#39;/dev/log&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; level: INFO
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;formatters:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; syslog_format:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; format: &amp;#39;appname: %(module)s %(message)s&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;IPアドレスについては、docker コンテナからホストのIPアドレスを参照する必要があるので &lt;code&gt;host.docker.internal&lt;/code&gt; を指定します。&lt;br&gt;
（localhost はコンテナ自身を指すので使えない)&lt;br&gt;
ちなみに &lt;code&gt;host.docker.internal&lt;/code&gt; はもともと Windows と Mac でしか使えませんでしたが、最近 Linux でも使えるようになったそうです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/skobaken/items/03a8b9d0e443745862ac" target="_blank" rel="noopener"
 &gt;https://qiita.com/skobaken/items/03a8b9d0e443745862ac&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これ使えなかったら直接IPアドレスを指定しないといけなくなり、ホストのIPアドレスが変わるたびに修正しないといけなくてマジ困ります。
ってかこれを知るまでずっと困ってました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/Esfahan/items/7888914dca0e8d23eac3" target="_blank" rel="noopener"
 &gt;https://qiita.com/Esfahan/items/7888914dca0e8d23eac3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.alexgittings.com/capturing-syslog-with-the-tig-stack/" target="_blank" rel="noopener"
 &gt;https://blog.alexgittings.com/capturing-syslog-with-the-tig-stack/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>rsyslog から Telegraf への送信に時々失敗する</title><link>https://blog.ponkotools.com/posts/2021/12/22/rsyslog-telegraf/</link><pubDate>Wed, 22 Dec 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/12/22/rsyslog-telegraf/</guid><description>&lt;p&gt;rsyslog から Telegraf にログを TCP で転送するように設定してみましたが、Grafana で閲覧していると表示されないログがあり、送信に失敗しているようでした。&lt;/p&gt;
&lt;p&gt;ググてみると以下のページを見つけました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gist.github.com/froop/e3a1e7d14a8143f9951b85afff6b5469#file-rsyslog-bug4227-md" target="_blank" rel="noopener"
 &gt;https://gist.github.com/froop/e3a1e7d14a8143f9951b85afff6b5469#file-rsyslog-bug4227-md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやら rsyslog の不具合のようで、バージョン 8.2010.0 で修正されているようです。&lt;br&gt;
rsyslog のバージョンは以下で確認できます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rsyslogd -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;私の環境 (Ubuntu 20.04) の rsyslog のバージョンは 8.2001.0 でした。
なので、rsyslog をアップデートします。
アップデート方法は以下に書いてありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.rsyslog.com/ubuntu-repository/" target="_blank" rel="noopener"
 &gt;https://www.rsyslog.com/ubuntu-repository/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo add-apt-repository ppa:adiscon/v8-stable
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install rsyslog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;現在の &lt;code&gt;/etc/rsyslog.conf&lt;/code&gt; を最新のに差し替えるか残すかを聞かれますが、最新のに差し替えた後で再設定を行いました。
再設定後は rsyslog を再起動します。
尚、アップデート後のバージョンは 8.2021.0 でした。
アップデート後は、ざっと見た感じきちんと転送されているように見えます。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gist.github.com/froop/e3a1e7d14a8143f9951b85afff6b5469#file-rsyslog-bug4227-md" target="_blank" rel="noopener"
 &gt;https://gist.github.com/froop/e3a1e7d14a8143f9951b85afff6b5469#file-rsyslog-bug4227-md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.rsyslog.com/ubuntu-repository/" target="_blank" rel="noopener"
 &gt;https://www.rsyslog.com/ubuntu-repository/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Syslog を Telegraf に送り、Grafana で閲覧できるようにする</title><link>https://blog.ponkotools.com/posts/2021/12/20/syslog-telegraf-grafana/</link><pubDate>Mon, 20 Dec 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/12/20/syslog-telegraf-grafana/</guid><description>&lt;p&gt;以下に Syslog 用のテンプレートと解説があるので簡単にできるかと思ったんですが、結構苦労しました・・・。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/12433" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/12433&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="概要"&gt;&lt;a href="#%e6%a6%82%e8%a6%81" class="header-anchor"&gt;&lt;/a&gt;概要
&lt;/h2&gt;&lt;p&gt;ホストの Syslog から Telegraf にログを送り、Telegraf が InfluxDB に保存し、Grafana が InfluxDB から読み込んで可視化します。&lt;/p&gt;
&lt;p&gt;Telegraf、InfluxDB、Grafana は全て docker-compose で動かしています。&lt;br&gt;
これについては以下の記事で書いているので省略します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2021/12/telegraf-influxdb-garafana.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2021/12/telegraf-influxdb-garafana.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記記事からの変更点を以下に記述します。&lt;/p&gt;
&lt;h2 id="rsyslog-の設定"&gt;&lt;a href="#rsyslog-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;rsyslog の設定
&lt;/h2&gt;&lt;p&gt;まずは Syslog から Telegraf にログを送信するように設定します。&lt;br&gt;
&lt;code&gt;/etc/rsyslog.conf&lt;/code&gt; を編集します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gedit /etc/rsyslog.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下の設定を追加します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;WorkDirectory&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rsyslog&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;ActionQueueType&lt;/span&gt; &lt;span class="n"&gt;LinkedList&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;ActionQueueFileName&lt;/span&gt; &lt;span class="n"&gt;srvrfwd&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;ActionResumeRetryCount&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;ActionQueueSaveOnShutdown&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;ModLoad&lt;/span&gt; &lt;span class="n"&gt;imudp&lt;/span&gt; &lt;span class="c1"&gt;#loads the udp module &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;UDPServerAddress&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;UDPServerRun&lt;/span&gt; &lt;span class="mi"&gt;514&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;*.*&lt;/span&gt; &lt;span class="err"&gt;@@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6514&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;RSYSLOG_SyslogProtocol23Format&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;rsyslog を再起動します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl restart rsyslog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="telegraf-の設定"&gt;&lt;a href="#telegraf-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Telegraf の設定
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;telegraf.conf&lt;/code&gt; に以下の設定を追加します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[[inputs.syslog]]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server = &amp;#34;tcp://0.0.0.0:6514&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Syslog から TCP ポート 6514 で受信するように設定していますが、docker で動かしているので &lt;code&gt;localhost&lt;/code&gt; を指定すると上手く動作しません。&lt;br&gt;
とりあえず &lt;code&gt;0.0.0.0&lt;/code&gt; を指定しましたが、もしかしたら &lt;code&gt;host.docker.internal&lt;/code&gt; とかでもいけるのかもしれません（未確認）。&lt;/p&gt;
&lt;h2 id="docker-composeyaml-の変更"&gt;&lt;a href="#docker-composeyaml-%e3%81%ae%e5%a4%89%e6%9b%b4" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yaml の変更
&lt;/h2&gt;&lt;p&gt;ポート 6514 を使用できるようにします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; telegraf:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; container_name: telegraf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: telegraf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 6514:6514
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;docker コンテナを再起動します。&lt;/p&gt;
&lt;h2 id="grafana-の設定"&gt;&lt;a href="#grafana-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Grafana の設定
&lt;/h2&gt;&lt;p&gt;以下のページからダッシュボードの JSON ファイルをダウンロードしてインポートするだけです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/12433" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/12433&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これで以下のようなダッシュボードが完成します。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="338px" data-flex-grow="140" height="320" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2021/12/20/syslog-telegraf-grafana/01.webp" width="451"&gt;&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.htkyama.org/rsyslog_grafana" target="_blank" rel="noopener"
 &gt;https://blog.htkyama.org/rsyslog_grafana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/12433" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/12433&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/haccht/items/82e8694c57202135ae5e" target="_blank" rel="noopener"
 &gt;https://qiita.com/haccht/items/82e8694c57202135ae5e&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Telegraf + InfluxDB + Garafana でサーバーリソースを可視化する</title><link>https://blog.ponkotools.com/posts/2021/12/18/telegraf-influxdb-grafana/</link><pubDate>Sat, 18 Dec 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/12/18/telegraf-influxdb-grafana/</guid><description>&lt;p&gt;CPUやメモリなどのリソースを収集して閲覧したいなと思い、ググってみるとこの組み合わせが良さそうでした。&lt;br&gt;
Telegraf でデータを取得して InfluxDB に書き込み、Grafana で InfluxDB のデータを読み込んで可視化します。&lt;/p&gt;
&lt;p&gt;個人的に InfluxDB と Grafana は使ったことありますが、Telegraf は今回初めて使いました。&lt;/p&gt;
&lt;p&gt;尚、この３つの頭文字を取って TIG Stack と呼んでいるページもいくつか見かけました。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;Docker 20.10.7&lt;/li&gt;
&lt;li&gt;Telegraf 1.20.4&lt;/li&gt;
&lt;li&gt;InfluxDB 1.8.6&lt;/li&gt;
&lt;li&gt;Grafana 7.5.7&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Telegraf と Grafana は現時点の最新のバージョンですが、InfluxDB は 2.0 系ではなく 1.8.6 を使いました。&lt;br&gt;
InfluxDB 2.0 を使ったことがないのと、参考にした Telegraf の設定ファイルのサンプルが InfluxDB 2.0 ではないものばかりだったからです。&lt;/p&gt;
&lt;p&gt;また、Telegraf, InfluxDB, Grafana は全て Docker (docker-compose) を使って動かします。&lt;/p&gt;
&lt;h2 id="docker-composeyaml-のサンプル"&gt;&lt;a href="#docker-composeyaml-%e3%81%ae%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;docker-compose.yaml のサンプル
&lt;/h2&gt;&lt;p&gt;以下のような &lt;code&gt;docker-compose.yaml&lt;/code&gt; を作成しました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;3.1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;telegraf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;telegraf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ro&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;influxdb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;influxdb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;common&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;influxdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;influxdb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;influxdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;1.8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;8086&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8086&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;influxdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;influxdb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;common&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;grafana&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grafana&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grafana&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;grafana&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;influxdb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;grafana&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;grafana&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;common&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;external&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;influxdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;grafana&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;common&lt;/code&gt; というネットワークを共通で使っているので、あらかじめ &lt;code&gt;docker network create&lt;/code&gt; で作成しておく必要があります。&lt;/p&gt;
&lt;h2 id="telegraf-の設定"&gt;&lt;a href="#telegraf-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Telegraf の設定
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;telegraf.conf&lt;/code&gt; を作成します。&lt;/p&gt;
&lt;p&gt;以下のページにちょうど良いのがあるのでこれをそのまま使いました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/928" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/928&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;後述しますが、Grafana のダッシュボードのテンプレートもこれを使いました。&lt;br&gt;
上記の設定をコピーしたら最低限以下の設定だけ変更します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[agent]&lt;/code&gt; &amp;gt; &lt;code&gt;hostname&lt;/code&gt; にマシン名を設定
&lt;ul&gt;
&lt;li&gt;設定しないと自動で設定されますが、起動の度に変わるので設定しておいたほうがよいと思います。&lt;/li&gt;
&lt;li&gt;環境変数が使えるので、&lt;code&gt;hostname = &amp;quot;$HOSTNAME&amp;quot;&lt;/code&gt; のようにも書けます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[[outputs.influxdb]]&lt;/code&gt; &amp;gt; &lt;code&gt;urls&lt;/code&gt; を InfluxDB の URL に変更
&lt;ul&gt;
&lt;li&gt;上記の &lt;code&gt;docker-compose.yaml&lt;/code&gt; の場合、URL は &lt;code&gt;http://influxdb.common:8086&lt;/code&gt; のようにコンテナ名とネットワーク名を使っても指定できます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;他は必要に応じて設定します。&lt;/p&gt;
&lt;h2 id="起動"&gt;&lt;a href="#%e8%b5%b7%e5%8b%95" class="header-anchor"&gt;&lt;/a&gt;起動
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-compose up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;デーモン化したい場合は &lt;code&gt;-d&lt;/code&gt; を指定します。&lt;br&gt;
起動すると InfluxDB に Telegraf 用のデータベースを自動で作成してくれます。&lt;br&gt;
（データベース名は &lt;code&gt;telegraf.conf&lt;/code&gt; で設定できます。）&lt;/p&gt;
&lt;h2 id="grafana-の設定"&gt;&lt;a href="#grafana-%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;Grafana の設定
&lt;/h2&gt;&lt;p&gt;Grafana にアクセスし、ログインします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http://localhost:3000&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;初期 ID とパスワードはどちらも &lt;code&gt;admin&lt;/code&gt; です。&lt;/p&gt;
&lt;h3 id="db-の登録"&gt;&lt;a href="#db-%e3%81%ae%e7%99%bb%e9%8c%b2" class="header-anchor"&gt;&lt;/a&gt;DB の登録
&lt;/h3&gt;&lt;p&gt;Configuration &amp;gt; Data Sources &amp;gt; Add data source &amp;gt; InfluxDB を選択します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;URL&lt;/code&gt; と &lt;code&gt;Database&lt;/code&gt; の２つを設定します。&lt;br&gt;
今回の例では以下のように設定します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;URL&lt;/code&gt; に &lt;code&gt;http://influxdb.common:8086&lt;/code&gt; を設定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Database&lt;/code&gt; に &lt;code&gt;telegraf_metrics&lt;/code&gt; を設定&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ダッシュボードの作成"&gt;&lt;a href="#%e3%83%80%e3%83%83%e3%82%b7%e3%83%a5%e3%83%9c%e3%83%bc%e3%83%89%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;ダッシュボードの作成
&lt;/h3&gt;&lt;p&gt;Telegraf 用のテンプレートがあるので、それをインポートするのが楽です。&lt;br&gt;
テンプレートは以下のページで探せます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回は以下のテンプレートを使いました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/928" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/928&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記から JSON ファイルをダウンロードし、Grafana の左メニューの + ボタンからインポートします。&lt;br&gt;
インポートの際、データベースは &lt;code&gt;telegraf_metrics&lt;/code&gt; を選択します。&lt;/p&gt;
&lt;p&gt;ダッシュボードにアクセスすると以下のような画面が表示されます。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="377px" data-flex-grow="157" height="1275" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.ponkotools.com/posts/2021/12/18/telegraf-influxdb-grafana/01.webp" srcset="https://blog.ponkotools.com/posts/2021/12/18/telegraf-influxdb-grafana/01_hu_1c1df1dba5082846.webp 800w, https://blog.ponkotools.com/posts/2021/12/18/telegraf-influxdb-grafana/01_hu_a462fb49fe1c77e3.webp 1600w, https://blog.ponkotools.com/posts/2021/12/18/telegraf-influxdb-grafana/01.webp 2003w" width="2003"&gt;&lt;/p&gt;
&lt;p&gt;かっこいい画面が簡単に作成できました。&lt;/p&gt;
&lt;h2 id="リテンションポリシーの設定"&gt;&lt;a href="#%e3%83%aa%e3%83%86%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%b3%e3%83%9d%e3%83%aa%e3%82%b7%e3%83%bc%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;リテンションポリシーの設定
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;telegraf.conf&lt;/code&gt; の [[outputs.influxdb]] &amp;gt; retention_policy でリテンションポリシーを指定できますが、ここが未指定だとデフォルトの &lt;code&gt;autogen&lt;/code&gt; が使用され、データが無期限に保存されることになるので指定します。&lt;br&gt;
例えば、リテンションポリシー名に &lt;code&gt;hoge&lt;/code&gt; と指定します。&lt;/p&gt;
&lt;p&gt;この状態で動作させると、&lt;code&gt;hoge&lt;/code&gt; というリテンションポリシーが存在しないというエラーが出るので、InfluxDB のコンテナに入ってリテンションポリシーを作成します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker exec -it influxdb bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コンテナに入ったら以下のコマンドでリテンションポリシーを作成します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# influx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; CREATE RETENTION POLICY &amp;#34;リテンションポリシー名&amp;#34; ON &amp;#34;データベース名&amp;#34; DURATION &amp;#34;期間&amp;#34; REPLICATION 1 DEFAULT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例えば、今回は以下のように指定します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE RETENTION POLICY &amp;#34;hoge&amp;#34; ON &amp;#34;telegraf_metrics&amp;#34; DURATION 1h REPLICATION 1 DEFAULT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のコマンドではデータの保存期間を１時間に設定しています。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/sammrai/items/0c329ac7aa8b100b66a8" target="_blank" rel="noopener"
 &gt;https://qiita.com/sammrai/items/0c329ac7aa8b100b66a8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/influxdata/telegraf/blob/master/etc/telegraf.conf" target="_blank" rel="noopener"
 &gt;https://github.com/influxdata/telegraf/blob/master/etc/telegraf.conf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/928" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/928&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.htkyama.org/telegraf_influxdb_grafana" target="_blank" rel="noopener"
 &gt;https://blog.htkyama.org/telegraf_influxdb_grafana&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>docker デーモンが勝手に再起動する原因の調査と対策</title><link>https://blog.ponkotools.com/posts/2021/12/17/docker/</link><pubDate>Fri, 17 Dec 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/12/17/docker/</guid><description>&lt;p&gt;docker コンテナをずっと動作させていたのですが、次の日の朝に止まっていたことがありました。&lt;br&gt;
その原因の調査と対策方法についてのメモです。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Ubuntu 20.04&lt;/li&gt;
&lt;li&gt;Docker 20.10.7&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="原因の調査"&gt;&lt;a href="#%e5%8e%9f%e5%9b%a0%e3%81%ae%e8%aa%bf%e6%9f%bb" class="header-anchor"&gt;&lt;/a&gt;原因の調査
&lt;/h2&gt;&lt;p&gt;まずは docker のログを調べてみます。
syslog から docker に関するログを表示します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dockerd&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;syslog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="n"&gt;dockerd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1880&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2021-12-17T07:02:17.017091451+09:00&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Processing signal &amp;#39;terminated&amp;#39;&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;中略&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="n"&gt;dockerd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1880&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2021-12-17T07:02:27.985252607+09:00&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Daemon shutdown complete&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Succeeded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="n"&gt;dockerd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;327103&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2021-12-17T07:02:28.012481765+09:00&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Starting up&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;中略&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="n"&gt;dockerd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;327297&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2021-12-17T07:02:28.618499702+09:00&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Daemon has completed initialization&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="n"&gt;dockerd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;327297&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2021-12-17T07:02:28.627472728+09:00&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;API listen on /run/docker.sock&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;docker としては、終了指示を受けたから停止して、その後正しく再起動しているようです。&lt;/p&gt;
&lt;p&gt;じゃあ何で（誰が）終了したのかということで、今度はログ全部を表示して docker 再起動の少し前をログを見てみました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;syslog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;怪しいログとして以下がありました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Starting&lt;/span&gt; &lt;span class="n"&gt;Daily&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;download&lt;/span&gt; &lt;span class="n"&gt;activities&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;中略&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Stopping&lt;/span&gt; &lt;span class="n"&gt;Docker&lt;/span&gt; &lt;span class="n"&gt;Application&lt;/span&gt; &lt;span class="ne"&gt;Container&lt;/span&gt; &lt;span class="n"&gt;Engine&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;日次処理が走った後に docker を再起動している？&lt;br&gt;
また、ググってみたら以下のページが見つかりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/65090971/docker-daemon-unexpectedly-exits" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/65090971/docker-daemon-unexpectedly-exits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というわけで、ソフトウェアの自動アップデートが走った結果 docker が再起動したのが原因のようです。&lt;br&gt;
実際、ソフトウェアのアップデートの設定を確認したら、たしかに自動アップデートするようになっていました。&lt;br&gt;
自動アップデートを無効にしてもいいですが、とりあえずこれはこのままにしておきました。&lt;/p&gt;
&lt;h2 id="docker-コンテナの-restart-フラグ"&gt;&lt;a href="#docker-%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%81%ae-restart-%e3%83%95%e3%83%a9%e3%82%b0" class="header-anchor"&gt;&lt;/a&gt;docker コンテナの restart フラグ
&lt;/h2&gt;&lt;p&gt;今までも docker コンテナをサービス化するときには &lt;code&gt;restart&lt;/code&gt; フラグを設定していました。&lt;br&gt;
&lt;code&gt;restart&lt;/code&gt; については以下に記述があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/start-containers-automatically/#use-a-restart-policy" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/start-containers-automatically/#use-a-restart-policy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はエラーで Docker デーモンが再起動したわけではないので、今回のような場合でも Docker コンテナを再起動させるためには &lt;code&gt;unless-stopped&lt;/code&gt; ではなく &lt;code&gt;always&lt;/code&gt; を指定しないといけないっぽいですね。&lt;/p&gt;
&lt;p&gt;ちなみに、GUI アプリで &lt;code&gt;restart&lt;/code&gt; を &lt;code&gt;unless-stopped&lt;/code&gt; or &lt;code&gt;always&lt;/code&gt; に指定してサービス化した場合、 ×ボタンなどでアプリを終了してもすぐ再起動して GUI が立ち上がるようになるので、そこは注意が必要です。&lt;br&gt;
まぁ GUI アプリをサービス化なんてしませんね。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/65090971/docker-daemon-unexpectedly-exits" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/65090971/docker-daemon-unexpectedly-exits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/start-containers-automatically/#use-a-restart-policy" target="_blank" rel="noopener"
 &gt;https://matsuand.github.io/docs.docker.jp.onthefly/config/containers/start-containers-automatically/#use-a-restart-policy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Docker のディスク使用量を調べる</title><link>https://blog.ponkotools.com/posts/2021/12/02/docker/</link><pubDate>Thu, 02 Dec 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/12/02/docker/</guid><description>&lt;p&gt;Docker イメージ、コンテナ、ボリュームのサイズを調べる方法です。&lt;/p&gt;
&lt;p&gt;以下のコマンドでわかります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker system df
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;出力結果&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TYPE TOTAL ACTIVE SIZE RECLAIMABLE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Images &lt;span class="m"&gt;35&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; 26.48GB 24.36GB &lt;span class="o"&gt;(&lt;/span&gt;92%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Containers &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; 125.5MB 0B &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Local Volumes &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; 320.1MB 0B &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Build Cache &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 0B 0B
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;より詳細に（個別に）知りたい場合は &lt;code&gt;-v&lt;/code&gt; をつけます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker system df -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/57430694/is-there-a-way-to-determine-the-size-of-a-docker-volume-on-my-macos-machine" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/57430694/is-there-a-way-to-determine-the-size-of-a-docker-volume-on-my-macos-machine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GitLab でリストア後に 500 エラーが表示される</title><link>https://blog.ponkotools.com/posts/2021/11/19/gitlab/</link><pubDate>Fri, 19 Nov 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/11/19/gitlab/</guid><description>&lt;p&gt;GitLab でリストア自体は成功するのですが、特定のページにアクセスすると 500 エラーが表示されました。&lt;/p&gt;
&lt;p&gt;原因は以下と同じでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kuttsun.blogspot.com/2020/01/gitlab-admin-runners-500.html" target="_blank" rel="noopener"
 &gt;https://kuttsun.blogspot.com/2020/01/gitlab-admin-runners-500.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記と同じ方法で解決もしました。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://forum.gitlab.com/t/after-restoring-a-backup-project-page-is-not-loading-all-other-pages-are-loading-easily/41447" target="_blank" rel="noopener"
 &gt;https://forum.gitlab.com/t/after-restoring-a-backup-project-page-is-not-loading-all-other-pages-are-loading-easily/41447&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/69525251/when-i-click-a-project-500-whoops-something-went-wrong-on-our-end" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/69525251/when-i-click-a-project-500-whoops-something-went-wrong-on-our-end&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>docker-compose でアプリの起動を遅らせる</title><link>https://blog.ponkotools.com/posts/2021/11/08/docker-compose/</link><pubDate>Mon, 08 Nov 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/11/08/docker-compose/</guid><description>&lt;p&gt;docker-compose.yml の &lt;code&gt;depends_on&lt;/code&gt; はあくまでコンテナの依存関係だけであり、アプリの起動や初期化までは待ってくれません。&lt;/p&gt;
&lt;p&gt;現在の docker-compose には &lt;code&gt;condition&lt;/code&gt; というのがあり、コンテナの状態をチェックして起動を制御することが可能なようです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gotohayato.com/content/533/" target="_blank" rel="noopener"
 &gt;https://gotohayato.com/content/533/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/shiena/items/47437f4f7874bf70d664" target="_blank" rel="noopener"
 &gt;https://qiita.com/shiena/items/47437f4f7874bf70d664&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただ、そのために healthcheck の方法を定義しないといけないなどちょっと面倒だったので、今回は &lt;code&gt;sleep&lt;/code&gt; を入れて無理やり起動を遅らせる方法をとりました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sleep&lt;/code&gt; の入れ方ですが、以下の２つの方法を思いつきました。&lt;/p&gt;
&lt;h2 id="command-で指定する例"&gt;&lt;a href="#command-%e3%81%a7%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;command で指定する例
&lt;/h2&gt;&lt;p&gt;docker-compose.yml の &lt;code&gt;command&lt;/code&gt; で以下のように記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;command: bash -c &amp;#34;sleep 5 &amp;amp;&amp;amp; python3 sample.py&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="entrypoint-で指定"&gt;&lt;a href="#entrypoint-%e3%81%a7%e6%8c%87%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;entrypoint で指定
&lt;/h2&gt;&lt;p&gt;docker-compose.yml の &lt;code&gt;entrypoint&lt;/code&gt; で起動時に実行するスクリプトファイルを指定し、そのスクリプトファイルの中で &lt;code&gt;sleep&lt;/code&gt; を実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;entrypoint: &amp;#34;/hoge/entrypoint.sh&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gotohayato.com/content/533/" target="_blank" rel="noopener"
 &gt;https://gotohayato.com/content/533/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/shiena/items/47437f4f7874bf70d664" target="_blank" rel="noopener"
 &gt;https://qiita.com/shiena/items/47437f4f7874bf70d664&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.balena.io/t/docker-compose-startup-delay/100607" target="_blank" rel="noopener"
 &gt;https://forums.balena.io/t/docker-compose-startup-delay/100607&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>docker-compose で GPU を使う</title><link>https://blog.ponkotools.com/posts/2021/11/02/docker-compose/</link><pubDate>Tue, 02 Nov 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/11/02/docker-compose/</guid><description>&lt;p&gt;&lt;code&gt;docker run&lt;/code&gt; では &lt;code&gt;--gpus all&lt;/code&gt; としていたのですが、docker-compose ではどう指定すればいいのかわからなかったので調べてみました。&lt;/p&gt;
&lt;p&gt;基本的には以下に書かれている通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/compose/gpu-support/" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/compose/gpu-support/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;docker-compose では例えば以下のように記述します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deploy:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; resources:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; reservations:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; devices:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - capabilities: [gpu]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;environment: 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - NVIDIA_VISIBLE_DEVICES=all
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - NVIDIA_DRIVER_CAPABILITIES=all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/compose/gpu-support/" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/compose/gpu-support/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/66298638/devices-properties-is-not-allowed-while-creating-docker-compose-with-nvidia" target="_blank" rel="noopener"
 &gt;https://stackoverflow.com/questions/66298638/devices-properties-is-not-allowed-while-creating-docker-compose-with-nvidia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/1024chon/items/4aaf4c1493fc9200cadc" target="_blank" rel="noopener"
 &gt;https://qiita.com/1024chon/items/4aaf4c1493fc9200cadc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>docker-compose での環境変数の参照方法</title><link>https://blog.ponkotools.com/posts/2021/10/29/docker-compose/</link><pubDate>Fri, 29 Oct 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/10/29/docker-compose/</guid><description>&lt;p&gt;docker コンテナ内でホストと同じユーザーIDを指定するために、ホストの環境変数を参照していました。&lt;/p&gt;
&lt;p&gt;例えば、docker コンテナ内でホストと同じユーザーIDを指定するために以下のように記述していましたが、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -it \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e LOCAL_UID=$(id -u $USER) \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e LOCAL_GID=$(id -g $USER) \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hoge:0 bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを docker-compose.yml ではどう書けばいいのか？
結果的には以下のように記述することで上手くいきました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;environment: 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - LOCAL_UID=${id:-u ${USER}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - LOCAL_GID=${id:-g ${USER}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/reflet/items/a96752b4cd3838ea6932" target="_blank" rel="noopener"
 &gt;https://qiita.com/reflet/items/a96752b4cd3838ea6932&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Rocket.Chat で使用している MongoDB をアップグレードする</title><link>https://blog.ponkotools.com/posts/2021/10/20/rocketchat/</link><pubDate>Wed, 20 Oct 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/10/20/rocketchat/</guid><description>&lt;p&gt;Rocket.Chat をアップグレードしたら、MongoDB をアップグレードするように警告が表示されるようになったので、MongoDB もアップグレードしました。&lt;/p&gt;
&lt;p&gt;アップグレードについては、以下の記事が参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://linuxhandbook.com/mongodb-upgrade-rocket-chat/" target="_blank" rel="noopener"
 &gt;https://linuxhandbook.com/mongodb-upgrade-rocket-chat/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;h3 id="アップグレード前"&gt;&lt;a href="#%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89%e5%89%8d" class="header-anchor"&gt;&lt;/a&gt;アップグレード前
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Rocket.Chat 3.10.4&lt;/li&gt;
&lt;li&gt;MongoDB 4.0.22&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="アップグレード後"&gt;&lt;a href="#%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89%e5%be%8c" class="header-anchor"&gt;&lt;/a&gt;アップグレード後
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Rocket.Chat 4.0.3&lt;/li&gt;
&lt;li&gt;MongoDB 5.0.3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="やったこと"&gt;&lt;a href="#%e3%82%84%e3%81%a3%e3%81%9f%e3%81%93%e3%81%a8" class="header-anchor"&gt;&lt;/a&gt;やったこと
&lt;/h2&gt;&lt;h3 id="rocketchat-を-403-にアップグレード"&gt;&lt;a href="#rocketchat-%e3%82%92-403-%e3%81%ab%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;Rocket.Chat を 4.0.3 にアップグレード
&lt;/h3&gt;&lt;p&gt;3.10.4 から 4.0.3 へのアップグレードはバージョンを変更するだけでいけました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;docker コンテナ停止&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; の Rocket.Chat のバージョンを 4.0.3 に変更&lt;/li&gt;
&lt;li&gt;docker コンテナ起動&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この時点で Rocket.Chat 4.0.3、MongoDB 4.0.22 の組み合わせとなりましたが、以下のメッセージが表示されるようになりました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | +----------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | SERVER RUNNING |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | +----------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | Rocket.Chat Version: 4.0.3 |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | NodeJS Version: 12.22.1 - x64 |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | MongoDB Version: 4.0.27 |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | MongoDB Engine: wiredTiger |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | Platform: linux |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | Process Port: 3000 |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | Site URL: http://localhost:3000 |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | ReplicaSet OpLog: Enabled |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | Commit Hash: 6e49fc9466 |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | Commit Branch: HEAD |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | +----------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | +----------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | DEPRECATION |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | +----------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | YOUR CURRENT MONGODB VERSION (4.0.22) IS DEPRECATED. |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | IT WILL NOT BE SUPPORTED ON ROCKET.CHAT VERSION 5.0.0 AND GREATER, |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | PLEASE UPGRADE MONGODB TO VERSION 4.2 OR GREATER |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | | |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rocketchat_1 | +----------------------------------------------------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MongoDB version 4.0.22 is deprecated, please upgrade your installation.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MongoDB 4.0 は非推奨なので、4.2 以上へアップグレードするよう促されます。&lt;br&gt;
なので、ついでに最新の 5.0 までアップグレードします。&lt;/p&gt;
&lt;h3 id="mongodb-を-42-にアップグレード"&gt;&lt;a href="#mongodb-%e3%82%92-42-%e3%81%ab%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;MongoDB を 4.2 にアップグレード
&lt;/h3&gt;&lt;p&gt;4.0 から 4.2 へのアップグレードは &lt;code&gt;docker-compose.yml&lt;/code&gt; を修正して再起動するだけでいけました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;docker コンテナ停止&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; の MongoDB のバージョンを 4.0 に変更&lt;/li&gt;
&lt;li&gt;docker コンテナ起動&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mongodb-を-44-にアップグレード"&gt;&lt;a href="#mongodb-%e3%82%92-44-%e3%81%ab%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;MongoDB を 4.4 にアップグレード
&lt;/h3&gt;&lt;p&gt;4.2 から 4.4 へのアップグレードは &lt;code&gt;docker-compose.yml&lt;/code&gt; を修正して再起動するだけではだめでした。&lt;br&gt;
先に以下のコマンドを実行する必要があります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker exec mongo bash -c &amp;#39;mongo --eval &amp;#34;db.adminCommand( { setFeatureCompatibilityVersion: \&amp;#34;4.2\&amp;#34; } )&amp;#34;&amp;#39;`
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;流れとしては以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上記のコマンドを実行&lt;/li&gt;
&lt;li&gt;docker コンテナ停止&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; の MongoDB のバージョンを 4.4 に変更&lt;/li&gt;
&lt;li&gt;docker コンテナ起動&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mongodb-を-50-にアップグレード"&gt;&lt;a href="#mongodb-%e3%82%92-50-%e3%81%ab%e3%82%a2%e3%83%83%e3%83%97%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%89" class="header-anchor"&gt;&lt;/a&gt;MongoDB を 5.0 にアップグレード
&lt;/h3&gt;&lt;p&gt;先ほどと同じです。&lt;br&gt;
上記のコマンドのバージョンを 4.4 に変更して実行します&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker exec mongo bash -c &amp;#39;mongo --eval &amp;#34;db.adminCommand( { setFeatureCompatibilityVersion: \&amp;#34;4.4\&amp;#34; } )&amp;#34;&amp;#39;`
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;流れとしては以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上記のコマンドを実行&lt;/li&gt;
&lt;li&gt;docker コンテナ停止&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; の MongoDB のバージョンを 5.0 に変更&lt;/li&gt;
&lt;li&gt;docker コンテナ起動&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://linuxhandbook.com/mongodb-upgrade-rocket-chat/" target="_blank" rel="noopener"
 &gt;https://linuxhandbook.com/mongodb-upgrade-rocket-chat/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Linux で USB メモリをマウントする</title><link>https://blog.ponkotools.com/posts/2021/06/16/linux/</link><pubDate>Wed, 16 Jun 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/06/16/linux/</guid><description>&lt;p&gt;Ubuntu とかだと USB メモリを挿したら自動でマウントされるので何も意識しなくもいいのですが、いざ他の Linux で USB メモリを挿したときにマウントってどうやるんだっけ？となったのでメモしておきます。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Wind River Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="マウント方法"&gt;&lt;a href="#%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;マウント方法
&lt;/h2&gt;&lt;p&gt;USB メモリを挿すと、&lt;code&gt;/dev/sda&lt;/code&gt; とか &lt;code&gt;/dev/sdb&lt;/code&gt; とかいうファイル名で認識されます。&lt;br&gt;
これを &lt;code&gt;/mnt/usb&lt;/code&gt; にマウントしてやります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir /mnt/usb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mount /dev/sdb /mnt/usb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アンマウント方法"&gt;&lt;a href="#%e3%82%a2%e3%83%b3%e3%83%9e%e3%82%a6%e3%83%b3%e3%83%88%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;アンマウント方法
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ umount /mnt/usb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Grafana のダッシュボードをログインなしで閲覧できるようにする</title><link>https://blog.ponkotools.com/posts/2021/06/11/grafana/</link><pubDate>Fri, 11 Jun 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/06/11/grafana/</guid><description>&lt;p&gt;タイトルの通りです。&lt;/p&gt;
&lt;p&gt;Grafana には一応 Snapshot という機能がありますが、日時の範囲が固定で、範囲を変えても範囲外のデータは閲覧できなかったりと、その名の通りあくまでスナップショットです。&lt;/p&gt;
&lt;p&gt;なので、ログインしなくてもダッシュボードの閲覧だけは出来るように設定します。&lt;/p&gt;
&lt;h2 id="環境"&gt;&lt;a href="#%e7%92%b0%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;環境
&lt;/h2&gt;&lt;p&gt;docker および docker-compose を使って構築しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grafana v7.5.7&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="設定"&gt;&lt;a href="#%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;設定
&lt;/h2&gt;&lt;p&gt;設定方法は &lt;code&gt;grafana.ini&lt;/code&gt; を編集するか、環境変数を設定するかのどちらかで行います。&lt;/p&gt;
&lt;p&gt;今回は docker-compose.yml で環境変数を設定しました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GF_AUTH_ANONYMOUS_ENABLED&lt;/code&gt; を &lt;code&gt;true&lt;/code&gt; に設定すれば、ログインなしでもダッシュボードの閲覧ができるようになります。&lt;/p&gt;
&lt;p&gt;以下、設定例です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;influxdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;influxdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;influxdb:1.8.6&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;8086:8086&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;influxdb:/var/lib/influxdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;grafana&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;grafana&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;grafana/grafana&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;links&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;influxdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;3000:3000&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;GF_AUTH_ANONYMOUS_ENABLED=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;grafana:/var/lib/grafana&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;influxdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;grafana&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;尚、環境変数の一覧は Grafana の Server Admin &amp;gt; Settings で確認できます。&lt;/p&gt;
&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://uzimihsr.github.io/post/2020-05-08-grafana-anonymous-authentication/" target="_blank" rel="noopener"
 &gt;https://uzimihsr.github.io/post/2020-05-08-grafana-anonymous-authentication/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/ryotaro76/items/22fa5e877eaab8b567e1" target="_blank" rel="noopener"
 &gt;https://qiita.com/ryotaro76/items/22fa5e877eaab8b567e1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AWS CLI のインストールと認証情報の設定</title><link>https://blog.ponkotools.com/posts/2021/06/05/aws/</link><pubDate>Sat, 05 Jun 2021 00:00:00 +0900</pubDate><guid>https://blog.ponkotools.com/posts/2021/06/05/aws/</guid><description>&lt;p&gt;Windows と Ubuntu で設定しました。&lt;/p&gt;
&lt;h2 id="インストール"&gt;&lt;a href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="header-anchor"&gt;&lt;/a&gt;インストール
&lt;/h2&gt;&lt;h3 id="windows"&gt;&lt;a href="#windows" class="header-anchor"&gt;&lt;/a&gt;Windows
&lt;/h3&gt;&lt;p&gt;インストーラーをダウンロードしてインストールします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://awscli.amazonaws.com/AWSCLIV2.msi" target="_blank" rel="noopener"
 &gt;https://awscli.amazonaws.com/AWSCLIV2.msi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ubuntu-2004"&gt;&lt;a href="#ubuntu-2004" class="header-anchor"&gt;&lt;/a&gt;Ubuntu 20.04
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install awscli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="認証情報の設定"&gt;&lt;a href="#%e8%aa%8d%e8%a8%bc%e6%83%85%e5%a0%b1%e3%81%ae%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;認証情報の設定
&lt;/h2&gt;&lt;h3 id="アクセスキーの作成"&gt;&lt;a href="#%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%82%ad%e3%83%bc%e3%81%ae%e4%bd%9c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;アクセスキーの作成
&lt;/h3&gt;&lt;p&gt;AWS にログインし、IAM を選択します。&lt;br&gt;
メニューより &lt;code&gt;ユーザー&lt;/code&gt; を選択し、&lt;code&gt;認証情報&lt;/code&gt; タブより &lt;code&gt;アクセスキーの作成&lt;/code&gt; をクリックします。&lt;/p&gt;
&lt;p&gt;アクセスキーが作成されたら、ローカルで以下のコマンドを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws configure
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AWS Access Key ID [None]: &amp;lt;Access Key&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AWS Secret Access Key [None]: &amp;lt;Secret Access Key&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Default region name [None]: ap-northeast-1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Default output format [None]: json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考-url"&gt;&lt;a href="#%e5%8f%82%e8%80%83-url" class="header-anchor"&gt;&lt;/a&gt;参考 URL
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://dev.classmethod.jp/articles/how-to-install-aws-cli-v2-on-windows/" target="_blank" rel="noopener"
 &gt;https://dev.classmethod.jp/articles/how-to-install-aws-cli-v2-on-windows/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.trainocate.co.jp/blog/aws_auth_022" target="_blank" rel="noopener"
 &gt;https://blog.trainocate.co.jp/blog/aws_auth_022&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>