日記_20260324(甲状腺・黄疸)

甲状腺について

  • 以下の理由から子供の検診に行った。

    • 妻が甲状腺の値がもともと悪い
    • 甲状腺は遺伝しがち
    • 子の退院直前の血液検査の結果で甲状腺の結果が良くなかった
  • 甲状腺の結果は以下で検査される。(AI生成)

    • TSH(甲状腺刺激ホルモン)

      • 下垂体から分泌されるホルモンで、甲状腺に「もっとホルモンを作れ」と指示する。
      • 甲状腺機能を評価する上で最も重要かつ鋭敏な指標です。
      • FT3・FT4 が低い → TSH が上昇(甲状腺を頑張らせようとする)
      • FT3・FT4 が高い → TSH が低下(フィードバックで抑制される)
    • FT4(遊離サイロキシン)

      • 甲状腺が直接分泌するホルモンの主成分。
      • Free-T4とも。「遊離(Free)」とは血中でタンパク質に結合していない活性型のことを指す。
      • 甲状腺の分泌能力を直接反映する
      • 体内では FT4 → FT3 に変換されて使われる
    • FT3(遊離トリヨードサイロニン)

      • FT4 から変換された、実際に細胞に作用する活性型ホルモン。
      • 作用はFT4の約4倍強力。
      • 代謝・体温・心拍数・神経系の活動に直接影響する
  • 結果甲状腺は特に問題なかった。

    • 新生児は、生まれた瞬間にTSHの値が急増(に伴ってFT3,FT4の値も急増)して、その後1日程度でおさまる・・という現象がある。(TSHサージ)
      • 出生直後の急激な体温低下に対して熱産生を促進、肺の成熟・代謝の切り替えを促進する作用がある。
    • 生後4日目の測定(新生児マススクリーニング検査の一環?)で測定したところ、TSH, Free-T4の値が基準値より高かった。
    • この時点では、「正常だが値が下がり切っていない」のか、「甲状腺異常で本当に値が高い」のか判断がつかないため、3週開けて再度血液検査を実施。
    • 結果、3週開けた後の血液検査の結果(=TSH, Free-T4の値)は基準値に収まっており、問題ない、つまり前者だったと判定。

黄疸について

  • ついでに新生児の黄疸についても教えてもらった。
  • 赤血球について
    • 赤血球は、ヘモグロビンという酸素を掴む構造を持ったタンパク質を中に多数内包した構造を持つ。
      • 通常、酸素を掴んだ状態のヘモグロビンは、鮮やかな赤色であり、
      • 酸素を放出した状態のヘモグロビンは、茶褐色に見える。
  • ヘモグロビンについて
    • 赤血球が壊れると、赤血球内のヘモグロビンが放出され、グロビンとヘムに分解される。
    • ヘムが分解され、ヘムからFeが回収された残骸が、ビリルビンと呼ばれる、黄疸の色を呈する物質である。
    • ビリルビンは、通常であれば、以下の順序で排泄される。
      1. 赤血球が壊れてヘモグロビンが放出される
      2. ヘモグロビンが分解され、間接ビリルビンが生成される。これは脂溶性であり水に溶けない。
      3. 肝臓で間接ビリルビンが直接ビリルビンに変換される。これは水溶性である
      4. 水溶性になった直接ビリルビンが、腸で分解され、便・尿として排泄される。
  • 黄疸が発生するメカニズム (=ビリルビンが蓄積するメカニズム)
    • 出生後に大量にビリルビンが生成される
      • 胎児は、酸素の薄い胎内で親の酸素を横取りできるように、通常のヘモグロビンよりも酸素との親和性が高い特別なヘモグロビンを持っている。
      • 出生後は、この特別はヘモグロビンは不要になるため、出生直後に大量のヘモグロビンが分解され、大量にビリルビンが産生される。
    • 肝臓が未熟
      • 新生児が肝臓が未熟なため、間接ビリルビン→直接ビリルビンの変換が追い付かず、不溶性の間接ビリルビンが残留してしまう
    • 腸の運動が未熟
      • 腸の蠕動運動が未熟なため、ビリルビンが再吸収されてしまう
  • 母乳育児が黄疸になりやすい理由
    • 母乳の成分に、ビリルビンの分解を抑制する成分が含まれているため。
  • 黄疸に対して光線療法が有効な理由
    • 肝臓が行っている働きを光線療法で代替する アイデア。
    • つまり、通常であれば肝臓が、不溶性である間接ビリルビンを、水溶性である直接ビリルビンに変換して排泄できるようにするところ、
    • 代わりに青い光を当てることによって、間接ビリルビンを、水溶性である別の物質に変質させることで、排泄できるようにする、という両方。
    • ビリルビンは黄疸色であり、ということは逆に青から青緑の光をよく吸収する。吸収率の良い青い光を当てることで、ビリルビン分子が構造変化を起こすためのエネルギーを効率的に与える。

日記_20260305

妻が無事出産した。よかった。。

3/4(水) 22時前の院内消灯とともに帰宅。
行く当てもなく西荻窪の家系に行く。一人でラーメンに行くのも少なくなるかと思い。
相変わらず玉ねぎもキュウリの漬物もおいてなく悲しい思いをする。

私がのんきにラーメンを食べている間に、妻の初期の陣痛?が始まっていたことを後から知る。この時は5分間隔。
ただ、痛みに耐えかねて麻酔を入れてもらったところで陣痛自体止まってしまったようで、それ以上は進まず。翌日へ。

翌日3/5(木)、妻は4時ごろようやく少し寝れたところ、朝5時にまた起こされて、
通常の計画出産の段取り通り、6時頃から陣痛促進剤開始→7時破膜処置 と処置が進んだとのこと。結果、中断されていたところから陣痛が始まった形で、朝7時頃にはすでに陣痛が2,3分間隔に。

看護師さんからは「初産の人は朝から始めても15時くらいだから、ご主人は9時ぐらいに来るで全然大丈夫、それでもかなり待つ」と言われていたところ、
6時にLINEして二度寝して7時過ぎに起きたらもう陣痛2分間隔まで来ているとのことでめちゃめちゃに焦る。

慌てふためいてタクシーで病院に向かう。二度寝で立ち会えなかったとすると一生の不覚、どうか間に合いますように・・・とタクシーで祈ること20分。結局8時過ぎについたが引き続き2分間隔のままだったようで、九死に一生を得る。

妻はこの時点でだいぶ陣痛がつらそう。2分に1回30秒の痛みが来るのでおちおち寝ることもできず。モニタで計っている外測陣痛の値がきれいに周期的に上下していた。フーリエ変換できそう。

「30秒では陣痛の持続が弱いので、我慢できるなら麻酔は追加せずにこのまま我慢したほうが早く進む」と看護師さんに言われ、麻酔は我慢してしばらく耐える。結果、9時過ぎには期待通り陣痛の持続時間が1分強ぐらいまで伸びてきたが、一方で陣痛そのものも激痛になってしまう。妻がベッドのへりにしがみついて小鹿のように震えていてかわいそうだった。普段あまり余裕のないところは見せない妻だがこの時ばかりは本当に痛そうだったので、よっぽど痛いのだと思われる。無痛分娩とは・・・ 

痛すぎるので麻酔を複数回追加してもらったが、効いてくるのに30分程度かかり、しばらく地獄。下にした方の半身によく麻酔が回るようで、5分おきに寝返りを打ってみたり、右側の効きが悪いので右側を長めに下にしてみたり・・と健気な努力をしつつも、しばらくは激痛で、「30秒たった、もう半分来たよ!」「痛いけど深呼吸して赤ちゃんに呼吸送るよ~」「痛いけど痛い分だけ進んでる証拠だよ!」「よく頑張った、次来るまでにこの時間でしっかりクールダウンするよ~」等、筋トレみたいな声援を送りつつ耐えてもらう。この間妻はずっと小鹿。

10時過ぎには麻酔が効いてきたようで、ちょっと落ち着いてくる。痛いところが右側からお尻側に変わったとのことで、これは痛かった分進んだのでは?と進展を感じる。が、ここに来て赤ちゃんの心拍が100-110くらいまで下がってきて(普段は120-150くらい)、看護師さんたちが慌て始める。先生も2人来ていただいて、内診で「もう出始めてるからこのまま生んじゃいましょう!」とのことで急遽分娩室へ。やや不穏な雰囲気が漂っていたが妻には言わないでおく。

分娩室はピンク一色。先生・看護婦さん・助産師さん含め10人くらいに囲まれる。助産師さんの一人が「メス!」の手(両手の甲を外に向けるやつ)で体制に入っていて、本当にやるんだ・・と思う。

先生から、「お母さんの体の準備ができるよりはやく赤ちゃんが生まれたがってるみたいで赤ちゃんがちょっと苦しそう。緊急帝王切開も考えたがもう出かかっているのでこのまま自然分娩で行きましょう」と言われる。いきなり"帝王切開"のワードが出てきて夫婦ともに!?!?になる。そんな事態だったのか。。ただ、予備室で下がっていたあかちゃんの心拍も、分娩室で再度モニタすると正常に戻ってきていて一安心。この十数分で急に子宮口がひらいたのかな。よかった。このころに麻酔が十分回って痛みはなく落ち着けた。

助産師さんが的確にいきみ方を指導してくれて、いよいよお産に入る。横目には腹筋・上体起こしの動きに近いように見えた。助産師さんはダイレクトにお腹(赤ちゃんの足があるであろうあたり)を押し込んでいて総力戦な感じ。先生からいきむの上手!とほめてもらう。いきむのに上手いとか下手とかあるのか、、?と半信半疑のまま私も耳元で「いきむの上手だね、才能あるよ」「安産家系だから大丈夫だよ」とささやく。前々から「骨盤がゆるゆるで一度寝ると次起きるときに股関節が外れそうになる」、という話を妻から聞いていたが、あれが出産のときに効いているのかもしれない。骨盤の間を潜り抜けて出てくるので、ここが柔らかいと進みも早いのかなと思ったり。

結果、いきみ数回 * 3セットで生まれる。タイムは4時間15分。先生から「初産でこの時間/この回数で生まれる人いないよ」とほめ(?)られる。分娩のタイミングでは麻酔が十分回って、痛みなくいきむことができたようでよかった。赤ちゃんは白い脂分?まみれで出てきた。あと髪の毛めっちゃ生えてた。ちゃんと産声あげてくれた。声でかいねーとほめ(?)られる。元気なのはよいこと。少しだけ抱っこさせてもらう。ちっちゃいおててだった。ほにゃほにゃすぎで何か間違えると簡単に崩れてしまいそうでどきどきした。

後から卵膜(に包まれた胎盤)とへその緒が出てきた。ゴシップ記事の隅の広告で「脂肪吸引でたまった脂肪がドバドバ!」的なサムネをよく見るが、胎盤in卵膜はあれを血だらけにした感じだった。ゆで卵の殻を表面だけ剥くと白っぽい膜が出てくるが、あれに相当するやつなのだろうか。結構なサイズ感でこれだけで1kgはあるかという感じ。積極的に見たいというわけではなかったが、人生で一度しか見れないので見れてよかった。

へその緒も立派とほめてもらった。ちょっとしか見れなかったが、「管が伸びてて、中に青?っぽく見える血液が透けている」ような感じ。巻貝系の刺身を思い出す見た目だった。予想以上に長かった。

傷を縫ってもらう等事後処置してもらって、20分ほどして予備室へ戻る。やり切った感に包まれ、ようやく休める時間になりしばらく経過観察を兼ねて休憩。途中赤ちゃんが来てくれて、少し抱っこできた。きれいに拭いてもらってよりふにゃふにゃだった。

一時的多呼吸という診断が出たと教えてもらった。多呼吸になるのはあくまで結果で、根本原因は肺の中の羊水が乾ききっていないことによるものだそう。お産が短時間で終わった子や、産道で十分に胸部が圧迫されなかった子、帝王切開で生まれた人などが発生しやすいそうで、我々も短期決戦だったのでそうなってしまった模様。最初に顔を見た時点ではもう元気に呼吸していて安心。最初心拍が少し下がった話も、今元気なら大丈夫で尾を引くような話ではないとのこと。

落ち着いたところで産科病棟の4人部屋へ移動。ちょっと熱があるのと、産後の後陣痛がつらくなってきた模様。母方の両親、父方の両親にそれぞれお見舞いにお越しいただく。赤ちゃんには会えず残念。私も面会時間終わりの20時に合わせて帰宅。

===

なにはともあれ無事に生まれてよかった。振り返ってみて、

無痛と言いつつだいぶ痛かったな、というのが感想。9時台は本当につらそうだった。自然分娩で経験するであろう最大痛みの8割ぐらいは経験したのでは?という感じ。無痛は「陣痛の痛みを抑えるために麻酔を入れることができる、が、麻酔を入れると陣痛が進まないので長期化しがち」というジレンマがあるようで難しい。痛いけど短期決戦で行くか、ほどほどの痛みで長丁場になるか、どちらがマシか。。ただ、痛い時に頼みの綱がある、という心理的な安心感を持てる点は良かった。(が、結局麻酔が効くにも時間がかかり痛いは痛かった。。反省するとするなら、とにかく判断は早いほうがよい、というくらいか。)

また、産前2週前くらいから結構な頻度で妻のおなかが張っていたが、やはり普通ではなかった様子。入院中もちょっと張っているだけで色んな人から「結構張ってますね~」とリアクションがあり、出産目前のタイミングでさえそんなトーンなので、やっぱり前々から不定期に前駆陣痛っぽい痛みが来るのはちょっと普通ではなく不安定だったのかなと思う。特に夕方~夜に差し掛かった前駆陣痛が来ることが多かった。サバンナで真昼間に子供を産み落とすと食べられるから、基本動物の出産は夜、という話を聞いて、きっとこれも野生の本能なんだろうと勝手に納得する。

もしくは、検診後の夜におしるしが来たり、前駆陣痛っぽい痛みが来ることが多かったので、外からの刺激を受けやすかったのかもしれない。ミニメトロ挿入後も陣痛っぽいものが来ていた。計画出産日の2週前の検診の直後におしるしが来て、もう生まれるか・・・?と2人して覚悟を決めていたので、結局予定日まで耐えて拍子抜けしたものの、結果的に心構えを持つ時間が十分に取れた点は良かった。

全体的に生まれる前が不安定で、生まれるとなったら急に進む、という感じだった。案ずるより産むが易し・・というと頑張った妻に失礼だが、生まれるまでは先行きが読めない感じがあったものの、お産自体は早々に終えることができ、安産家系の血筋に感謝。

先生からも「このスピード感だと自然無痛分娩は麻酔が間に合わないかもしれないから次回も計画出産がいいかも」とアドバイスいただき、次回も課金を心に誓う。

日記_20260304

妻が計画出産に向け前日入院した。

入院すると菜食生活になってしまうので、お昼はランチに出る。
Braceria Sというお店に行った。店員さん、ハキハキなのはよいのだがお水出し忘れたり、前菜出し忘れたり・・
でもラザニア・炭火焼の鶏肉はおいしかった。毎日通勤で前を通っているはずなのに、こんな見落としがあったとは・・・
もう西荻窪は離れるが最後も探索と発見できた。

妻にとっては松庵の家は最後だったが、タクシーが来てあわただしく出てしまった。
最後まで引っ越しの荷造りをしていた。直前まで負荷をかけなくてよいのに・・・

・モニタ
 →点滴  (硬膜外麻酔への前振り)
 →硬膜外麻酔
 →ミニメトロ
 →夕食

の順に進む。

おなか張ってますね~といろんな人に言われる。これ普通じゃないのか・・
モニタを見ていると定期的に張っていることがわかる。
出不精な子か甘えん坊な子か。


モニタをつけると、胎児の脈拍、親の脈拍、親の血圧、親の外測陣痛 が一挙に表示されていて面白かった。
どうやって作るんだろう。
胎児の脈拍は120-150くらい。動いていると明らかに拍動数が上がるので面白い。
小動物は心拍が早い・・・の例を感じた

点滴の針が太くて痛そうだった。
硬膜外麻酔はあまり痛くはなかったようでよかった。これが今日のメインイベントだったので無事終了してよかった。
麻酔したあと5分おきに寝返りを打つのは、交互に半身を下にして麻酔を両半身に巡らせるためらしい。
寝返りを忘れていたら片方ばかり効いてしまった様子。

暇だったので病院の仕組みを色々claudeに聞いて調べていた。

・点滴は単にメモリを回すとチューブが圧迫されて、その流速の遅さが上流に伝わって滴下速度も落ちるらしい。 

 途中に空気が入っているが、
 下流の流速が早い→途中の空気の圧縮膨張が始まる前に、それをキャンセルする形で上流からの液滴の滴下速度が上がる・・・
 という挙動になる。
 途中の空気が、
 ・空気自体の圧縮膨張性が高くないこと
 ・空気の体積が小さいこと
 が効いている模様。

 一つの系だから、と言われたらそれまでだが、シンプルでよくできている。

・SPO2の測り方。
 ・吸光度で計っている。
 ・HbO2:酸素と結びついたヘモグロビンと、Hb:酸素と結びついていないヘモグロビンでは、
  ・光の吸収のピークが異なる。前者は赤外光を、後者は赤色光をよく吸収する。
   ・逆に考えるとわかりやすい。つまり、前者=HbO2:酸素と結びついたヘモグロビン=動脈血は比較的赤色光を反射するので鮮血色に見える。
 ・指先で吸光度を測定すると、その吸光度は、
  ・動脈血による吸光(拍動により時間依存する)
   +静脈血による吸光(拍動にやや依存するが動脈血に比べると誤差なので時間依存しないと考えてよい)
   +骨・組織による吸光(時間依存しない)
  なので、吸光度のAC成分が動脈血による吸光度と分離することができる。
  
  ・原理的には吸光度で測定していて、
   バックグラウンドを落とすためにDCを落とす工夫をしている・・という位置づけ。

・夕食があった!夜絶食かと思っていたからよかった。
 ・唐揚げ・・と思いきや大豆から揚げだった。ここから菜食生活が始まる・・・

bashプログラミングTIPS

APIを叩く

APIを叩く状況として、以下2種類が考えられる。

1.APIを叩いてシステムを状態を変化させたい。
 APIの標準出力も標準エラー出力もログファイルに書き込みたい。
 ex) oci bv backup create >> ${LOGFILE} 2>&1

2.APIを叩いてシステムの状態を取得したい
 APIの標準出力を変数に格納する。標準エラー出力がもしあればログファイルに書き込む。
 ex) RESULT=$(oci bv backup list  2>> ${LOGFILE} )


■コマンド展開
・`oci bv backup list`
・$(oci bv backup list)
の2種類が存在する。どちらも違いはないが、後者の方が見やすい・ネストしやすい。


■変数展開
・$BUFF
・${BUFF}
どちらでもOK

 

■文字列
・"" →中の変数を展開する
・'' →中の変数を展開せず純粋な文字列として処理する

例えば、
BUFF="aaa"として
echo "${BUFF}" -> aaaが出力される
echo '${BUFF}' -> ${BUFF}が出力される

 

■改行を含んで変数に格納、後続に渡したい場合
BUFF=$(oci bv backup list)      #``でもよい
echo "${BUFF}" | jq '.data[].id'    # ${BUFF}を""で囲うことで改行が保存されてパイプで渡される

 

■文字列比較
if [ ]; then で条件比較ができる。   =とか!=とか
ex) if [ "ABC" = "ABC" ]; then

 

■文字列比較(bash拡張)
if  ; then でより便利に。
・&& とか||とかで条件を結合できるように。
・=~ 正規表現を使ったパターンマッチが可能に。

 

■数値比較
if [ ]; then で数値比較ができる。-eq とか-gtとか
ex) if [ 100 -eq 99 ]; then

 

■数値比較(bash拡張)
*1; then

 

数値計算
$*2数値計算ができる。ただし少数は不可だったり、制約はある。 
echo $*3

 

 

*1:))でくくると、<とか>とかの不等号が使えるようになる。(普段はパイプで予約されているが、この構文のみ不等号として扱える)
ex) if (( num1 < num2

*2:

*3:1+2

ab(apache benchmark)コマンド

ab(apache benchmark) コマンド

  • 手軽にラッシュをかけられるコマンド。
  • curlを乱発するイメージか。
  • jmeter等よりお手軽なのがメリット。

使ってみる

httpサーバを起動

[root@my-instance ~]# docker run -d -p 8080:80 httpd
7d8b496fa936415ef3a2f34c021f01d1345d2ce9a531ad26ac2e4408342ccbbf

[root@my-instance ~]# curl localhost:8080
<html><body><h1>It works!</h1></body></html>

abコマンドを実行

リクエスト100回、並列度5で実施。

[root@my-instance ~]# ab -n 100 -c 5 http://localhost:8080/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:        Apache/2.4.62
Server Hostname:        localhost
Server Port:            8080

Document Path:          /
Document Length:        45 bytes

Concurrency Level:      5
Time taken for tests:   0.188 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      28900 bytes
HTML transferred:       4500 bytes
Requests per second:    531.94 [#/sec] (mean)
Time per request:       9.400 [ms] (mean)
Time per request:       1.880 [ms] (mean, across all concurrent requests)
Transfer rate:          150.13 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       1
Processing:     1    9  12.1      4      51
Waiting:        0    9  11.8      3      51
Total:          1    9  12.1      4      51

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      6
  75%      8
  80%     20
  90%     24
  95%     48
  98%     51
  99%     51
 100%     51 (longest request)

OCIブロックボリュームのアタッチ・リストア

はじめに

OCIのブロックボリュームのアタッチ・リストアを試す。

以下の順に進める。

・ブロックボリュームを作成、インスタンスにアタッチ ・lv・ファイルシステムを作成のうえ、OSからマウント ・ブロックボリュームのバックアップ・リストアを実行 ・元のブロックボリュームを一度OSからデタッチ ・リストアしたブロックボリュームをアタッチ

ブロックボリューム作成・インスタンスにアタッチ

コンソールからブロックボリュームを作成

作成できたら、「インスタンスのアタッチ」のボタンで 既存のインスタンスにブロックボリュームをアタッチする。 今回はiSCSI接続を使用する。

アタッチが完了後、OSでiSCSI接続のコマンド打鍵が必要。 コンソールの「iSCSIコマンドおよび情報」から必要な情報を確認して打鍵する。(画像を取り忘れたので添付はイメージのみ)

# まだ何も接続されていない状態
[root@my-instance ~]# iscsiadm --mode session
iscsiadm: No active sessions.


# コンソールで表示された3コマンドを打鍵し、作成したBVとiSCSI接続する
[root@my-instance ~]# sudo iscsiadm -m node -o new -T iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87 -p 169.254.2.2:3260
New iSCSI node [tcp:[hw=,ip=,net_if=,iscsi_if=default] 169.254.2.2,3260,-1 iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87] added

[root@my-instance ~]# sudo iscsiadm -m node -o update -T iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87 -n node.startup -v automatic

[root@my-instance ~]# sudo iscsiadm -m node -T iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87 -p 169.254.2.2:3260 -l
Logging in to [iface: default, target: iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87, portal: 169.254.2.2,3260] (multiple)
Login to [iface: default, target: iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87, portal: 169.254.2.2,3260] successful.

# iSCSI接続が認識された
[root@my-instance ~]# iscsiadm --mode session
tcp: [1] 169.254.2.2:3260,1 iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87 (non-flash)

lv・ファイルシステムを作成のうえ、OSからマウント

https://dev.classmethod.jp/articles/eetann-use-lvm-ebs/

上記を参考にlvmの設定を行う。 パーティション→pv→vg→lv→ファイルシステム→マウント の順に作業する

初期状態

iSCSI接続を行った最初の状態では、以下のような状態。

lsblkにはsdbとして表示される

# 
[root@my-instance ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0   50G  0 disk
sda      8:0    0 46.6G  0 disk
├─sda2   8:2    0    8G  0 part [SWAP]
├─sda3   8:3    0 38.4G  0 part /
└─sda1   8:1    0  200M  0 part /boot/efi

parted で確認すると、unknownの状態。

[root@my-instance ~]# parted -l
モデル: ORACLE BlockVolume (scsi)
ディスク /dev/sda: 50.0GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前                  フラグ
 1    1049kB  211MB   210MB   fat16             EFI System Partition  boot
 2    211MB   8801MB  8590MB  linux-swap(v1)
 3    8801MB  50.0GB  41.2GB  xfs


エラー: /dev/sdb: ディスクラベルが認識できません。
モデル: ORACLE BlockVolume (scsi)
ディスク /dev/sdb: 53.7GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: unknown
ディスクフラグ:

パーティション作成

[root@my-instance ~]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.     # 何もないのでパーティションを作るよう促される

Command (? for help): ?        # コマンド確認
b       back up GPT data to a file
c       change a partition's name
d       delete a partition
i       show detailed information on a partition
l       list known partition types
n       add a new partition
o       create a new empty GUID partition table (GPT)
p       print the partition table
q       quit without saving changes
r       recovery and transformation options (experts only)
s       sort partitions
t       change a partition's type code
v       verify disk
w       write table to disk and exit
x       extra functionality (experts only)
?       print this menu

Command (? for help): n      # n : 新しいパーティションを作成
Partition number (1-128, default 1):
First sector (34-104857566, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-104857566, default = 104857566) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): L      # OS固有のHex Code入力を求められる。確認の上 8e00 (Linux LVM) を選択
0700 Microsoft basic data  0c01 Microsoft reserved    2700 Windows RE
3000 ONIE boot             3001 ONIE config           4100 PowerPC PReP boot
4200 Windows LDM data      4201 Windows LDM metadata  7501 IBM GPFS
7f00 ChromeOS kernel       7f01 ChromeOS root         7f02 ChromeOS reserved
8200 Linux swap            8300 Linux filesystem      8301 Linux reserved
8302 Linux /home           8400 Intel Rapid Start     8e00 Linux LVM
a500 FreeBSD disklabel     a501 FreeBSD boot          a502 FreeBSD swap
a503 FreeBSD UFS           a504 FreeBSD ZFS           a505 FreeBSD Vinum/RAID
a580 Midnight BSD data     a581 Midnight BSD boot     a582 Midnight BSD swap
a583 Midnight BSD UFS      a584 Midnight BSD ZFS      a585 Midnight BSD Vinum
a800 Apple UFS             a901 NetBSD swap           a902 NetBSD FFS
a903 NetBSD LFS            a904 NetBSD concatenated   a905 NetBSD encrypted
a906 NetBSD RAID           ab00 Apple boot            af00 Apple HFS/HFS+
af01 Apple RAID            af02 Apple RAID offline    af03 Apple label
af04 AppleTV recovery      af05 Apple Core Storage    be00 Solaris boot
bf00 Solaris root          bf01 Solaris /usr & Mac Z  bf02 Solaris swap
bf03 Solaris backup        bf04 Solaris /var          bf05 Solaris /home
bf06 Solaris alternate se  bf07 Solaris Reserved 1    bf08 Solaris Reserved 2
bf09 Solaris Reserved 3    bf0a Solaris Reserved 4    bf0b Solaris Reserved 5
c001 HP-UX data            c002 HP-UX service         ea00 Freedesktop $BOOT
eb00 Haiku BFS             ed00 Sony system partitio  ed01 Lenovo system partit
Press the <Enter> key to see more codes: 

Hex code or GUID (L to show codes, Enter = 8300): 8e00    # OS固有のHex Code入力を求められる。確認の上 8e00 (Linux LVM) を選択
Changed type of partition to 'Linux LVM'

Command (? for help): p       #  p : 情報表示。パーティションが作成された。
Disk /dev/sdb: 104857600 sectors, 50.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 6C169F02-9F66-4E80-A226-768DCE2974D9
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 104857566
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       104857566   50.0 GiB    8E00  Linux LVM

Command (? for help): w     # w: write table to disk and  exit   この処理をもってパーティション作成完了となる?

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

パーティションを作成したことで、lsblkの表示にもsdb1の名前で表れるようになる。

[root@my-instance ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0   50G  0 disk
└─sdb1   8:17   0   50G  0 part      #★先ほど作成したパーティション
sda      8:0    0 46.6G  0 disk
├─sda2   8:2    0    8G  0 part [SWAP]
├─sda3   8:3    0 38.4G  0 part /
└─sda1   8:1    0  200M  0 part /boot/efi

partedの表示にも、指定した通りlinux LVMとして認識される。

[root@my-instance ~]# parted /dev/sdb print
モデル: ORACLE BlockVolume (scsi)
ディスク /dev/sdb: 53.7GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前       フラグ
 1    1049kB  53.7GB  53.7GB                    Linux LVM  lvm

pv・vg・lvの作成

pv作成

[root@my-instance ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.

[root@my-instance ~]# pvs
  PV         VG Fmt  Attr PSize   PFree
  /dev/sdb1     lvm2 ---  <50.00g <50.00g

[root@my-instance ~]# pvdisplay
  "/dev/sdb1" is a new physical volume of "<50.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               <50.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               NYFPWF-ue2C-QAra-nL2Y-E5g5-a2xr-R8572M

vg作成

[root@my-instance ~]# vgcreate myvg1 /dev/sdb1
  Volume group "myvg1" successfully created

[root@my-instance ~]# vgs
  VG    #PV #LV #SN Attr   VSize   VFree
  myvg1   1   0   0 wz--n- <50.00g <50.00g

lv作成

[root@my-instance ~]# lvcreate --size 5G --name mylv1 myvg1
WARNING: ext4 signature detected on /dev/myvg1/mylv1 at offset 1080. Wipe it? [y/n]: y
  Wiping ext4 signature on /dev/myvg1/mylv1.
  Logical volume "mylv1" created.

[root@my-instance ~]# lvs
  LV    VG    Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv1 myvg1 -wi-a----- 5.00g

[root@my-instance ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/myvg1/mylv1
  LV Name                mylv1
  VG Name                myvg1
  LV UUID                XqEIvG-owlZ-lhoJ-M30g-7Uwd-hI6w-TQwhFC
  LV Write Access        read/write
  LV Creation host, time my-instance, 2024-12-30 13:17:51 +0900
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

ファイルシステム作成

[root@my-instance ~]# mkfs -t ext4 /dev/myvg1/mylv1
mke2fs 1.45.4 (23-Sep-2019)
Discarding device blocks: done
Creating filesystem with 1310720 4k blocks and 327680 inodes
Filesystem UUID: b6b2a0f7-1562-4211-8eea-618c559d96b4
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks):
done
Writing superblocks and filesystem accounting information: done

マウント

[root@my-instance ~]# df -h       #事前状態ではdfの結果に何も乗ってこない
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         294M     0  294M    0% /dev
tmpfs            335M   12K  335M    1% /dev/shm
tmpfs            335M   35M  301M   11% /run
tmpfs            335M     0  335M    0% /sys/fs/cgroup
/dev/sda3         39G   19G   20G   49% /
/dev/sda1        200M  7.4M  193M    4% /boot/efi
tmpfs             67M     0   67M    0% /run/user/1000
tmpfs             67M     0   67M    0% /run/user/993
overlay           39G   19G   20G   49% /var/lib/docker/overlay2/e58ec42d0354623fcf4abbb1cfec8a402619b988e5c6316037521c325ebc4611/merged
overlay           39G   19G   20G   49% /var/lib/docker/overlay2/0aab146f51b1f57f957bd4d000ead990c297ebc7753f6b3f986df1a43de7c6c8/merged

[root@my-instance ~]# mkdir /mountdir-for-mylv1    # マウントポイント用ディレクトリ作成

[root@my-instance ~]# vi /etc/fstab      # マウント設定を追加
[root@my-instance ~]# cat /etc/fstab
()
/dev/myvg1/mylv1 /mountdir-for-mylv1 ext4 defaults 0 0    #★viで追加した行

[root@my-instance ~]# mount -a

[root@my-instance ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
devtmpfs                  294M     0  294M    0% /dev
tmpfs                     335M   12K  335M    1% /dev/shm
tmpfs                     335M   35M  301M   11% /run
tmpfs                     335M     0  335M    0% /sys/fs/cgroup
/dev/sda3                  39G   19G   20G   49% /
/dev/sda1                 200M  7.4M  193M    4% /boot/efi
tmpfs                      67M     0   67M    0% /run/user/1000
tmpfs                      67M     0   67M    0% /run/user/993
overlay                    39G   19G   20G   49% /var/lib/docker/overlay2/e58ec42d0354623fcf4abbb1cfec8a402619b988e5c6316037521c325ebc4611/merged
overlay                    39G   19G   20G   49% /var/lib/docker/overlay2/0aab146f51b1f57f957bd4d000ead990c297ebc7753f6b3f986df1a43de7c6c8/merged
/dev/mapper/myvg1-mylv1   4.9G   24K  4.6G    1% /mountdir-for-mylv1        #★マウントできた

[root@my-instance mountdir-for-mylv1]# dd if=/dev/urandom of=/mountdir-for-mylv1/testfile bs=1M count=100      #★書き込み確認もOK
100+0 レコード入力
100+0 レコード出力
104857600 バイト (105 MB) コピーされました、 2.98914 秒、 35.1 MB/秒
[root@my-instance mountdir-for-mylv1]# ll
合計 102416
drwx------. 2 root root     16384 1230 13:19 lost+found
-rw-r--r--. 1 root root 104857600 1230 13:29 testfile

ブロックボリュームのバックアップ・リストアを実行

この断面で、ブロックボリュームのバックアップを取得・リストアを実行する。

コンソールから「手動バックアップの作成」を選択。

名前だけ決めて作成。

作成されたバックアップからリストアを実行。

ブロックボリュームのバックアップからリストアが作成された。

元のブロックボリュームを一度OSからデタッチ

リストアの確認として、この時点で、先ほど元のブロックボリューム上に作成したテストファイルは削除しておく。

[root@my-instance mountdir-for-mylv1]# rm testfile
rm: 通常ファイル `testfile' を削除しますか? y

元のブロックボリュームはいったんデタッチする。

デタッチしようとすると、事前に ・fstabからは抜いておくこと ・(アンマウントしておくこと) ・iscsiのデタッチのコマンドを打つこと が求められる。(画像を取り忘れたため表記はイメージのみ)

横着して、 ・(アンマウントしておくこと) ・iscsiのデタッチのコマンドを打つこと だけ実施したのち(以下)、「デタッチの続行」を押下。

[root@my-instance /]# umount /mountdir-for-mylv1  #アンマウント

[root@my-instance /]# iscsiadm --mode session
tcp: [1] 169.254.2.2:3260,1 iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87 (non-flash)

[root@my-instance /]# sudo iscsiadm -m node -T iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87 -p 169.254.2.2:3260 -u     # ociから言われたコマンドを実施
Logging out of session [sid: 1, target: iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87, portal: 169.254.2.2,3260]
Logout of [sid: 1, target: iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87, portal: 169.254.2.2,3260] successful.
[root@my-instance /]# sudo iscsiadm -m node -o delete -T iqn.2015-12.com.oracleiaas:b95d1766-a8c6-490d-8c22-899a3330ce87 -p 169.254.2.2:3260

[root@my-instance /]# iscsiadm --mode session    # iSCSI接続がデタッチされた
iscsiadm: No active sessions.

この時点でlsblkに表示されなくなる。(デバイスの接続を外したので当然)

[root@my-instance /]# pvs
[root@my-instance /]# vgs
[root@my-instance /]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0 46.6G  0 disk
├─sda2   8:2    0    8G  0 part [SWAP]
├─sda3   8:3    0 38.4G  0 part /
└─sda1   8:1    0  200M  0 part /boot/efi

リストアしたブロックボリュームをアタッチ

先ほどと同じ要領で、リストアしたブロックボリュームをインスタンスにアタッチする。 コンソールでアタッチの操作を実行後、コンソール上で指示される以下を打鍵する。

[root@my-instance /]# sudo iscsiadm -m node -o new -T iqn.2015-12.com.oracleiaas:7c079e04-c57a-4133-9bfb-fac5c65d2d12 -p 169.254.2.3:3260
New iSCSI node [tcp:[hw=,ip=,net_if=,iscsi_if=default] 169.254.2.3,3260,-1 iqn.2015-12.com.oracleiaas:7c079e04-c57a-4133-9bfb-fac5c65d2d12] added
[root@my-instance /]# sudo iscsiadm -m node -o update -T iqn.2015-12.com.oracleiaas:7c079e04-c57a-4133-9bfb-fac5c65d2d12 -n node.startup -v automatic
[root@my-instance /]# sudo iscsiadm -m node -T iqn.2015-12.com.oracleiaas:7c079e04-c57a-4133-9bfb-fac5c65d2d12 -p 169.254.2.3:3260 -l
Logging in to [iface: default, target: iqn.2015-12.com.oracleiaas:7c079e04-c57a-4133-9bfb-fac5c65d2d12, portal: 169.254.2.3,3260] (multiple)
Login to [iface: default, target: iqn.2015-12.com.oracleiaas:7c079e04-c57a-4133-9bfb-fac5c65d2d12, portal: 169.254.2.3,3260] successful.

この時点でpvs, lvs等の表示が復活する。 UUIDが以前と同じものであることに注意。これが同じだからか特に設定せずとも以前のvgの情報を思い出してくれる?

[root@my-instance /]# iscsiadm --mode session
tcp: [2] 169.254.2.3:3260,1 iqn.2015-12.com.oracleiaas:7c079e04-c57a-4133-9bfb-fac5c65d2d12 (non-flash)

[root@my-instance /]# pvs
  PV         VG    Fmt  Attr PSize   PFree
  /dev/sdc1  myvg1 lvm2 a--  <50.00g <45.00g

[root@my-instance /]# vgs
  VG    #PV #LV #SN Attr   VSize   VFree
  myvg1   1   1   0 wz--n- <50.00g <45.00g

[root@my-instance /]# lvs
  LV    VG    Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv1 myvg1 -wi-a----- 5.00g

[root@my-instance /]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/myvg1/mylv1
  LV Name                mylv1
  VG Name                myvg1
  LV UUID                XqEIvG-owlZ-lhoJ-M30g-7Uwd-hI6w-TQwhFC    #ブロックボリュームをリストアすると、UUIDは以前と同じものを引きつぐ
  LV Write Access        read/write
  LV Creation host, time my-instance, 2024-12-30 13:17:51 +0900
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

ただし、マウントには失敗している。前の情報が何かしら残ってしまっている?

[root@my-instance /]# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         294M     0  294M    0% /dev
tmpfs            335M   12K  335M    1% /dev/shm
tmpfs            335M   35M  301M   11% /run
tmpfs            335M     0  335M    0% /sys/fs/cgroup
/dev/sda3         39G   19G   20G   48% /
/dev/sda1        200M  7.4M  193M    4% /boot/efi
tmpfs             67M     0   67M    0% /run/user/1000
tmpfs             67M     0   67M    0% /run/user/993
overlay           39G   19G   20G   48% /var/lib/docker/overlay2/e58ec42d0354623fcf4abbb1cfec8a402619b988e5c6316037521c325ebc4611/merged
overlay           39G   19G   20G   48% /var/lib/docker/overlay2/0aab146f51b1f57f957bd4d000ead990c297ebc7753f6b3f986df1a43de7c6c8/merged

[root@my-instance /]# mount -a
mount: wrong fs type, bad option, bad superblock on /dev/mapper/myvg1-mylv1,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

仕方ないのでコンソールからサーバをリブートしたところ解消。 リブート後は問題なくマウントできていた。

[opc@my-instance ~]$ df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
devtmpfs                  294M     0  294M    0% /dev
tmpfs                     335M     0  335M    0% /dev/shm
tmpfs                     335M  4.9M  330M    2% /run
tmpfs                     335M     0  335M    0% /sys/fs/cgroup
/dev/sda3                  39G   19G   20G   48% /
/dev/sda1                 200M  7.4M  193M    4% /boot/efi
/dev/mapper/myvg1-mylv1   4.9G  101M  4.5G    3% /mountdir-for-mylv1   #マウントできている
tmpfs                      67M     0   67M    0% /run/user/993
tmpfs                      67M     0   67M    0% /run/user/1000

おわりに

UUIDが同じだと・・違うと・・・という話が毎回もやもやするポイント。 次回は横着せずにfstabからも一度外してリブートする。

「docker & kubernetesのきほんのきほん」演習メモ

はじめに

docker & kubernetesのきほんのきほん

を実際にやってみるメモ。 イラストがかわいい。

仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん | マイナビブックス

環境構築

OCI上にインスタンスを作成。既存のVCN(my-vcnに作成)

  • 名前:my-instance
  • コンパートメント:my-compartment
  • イメージ:oracle linux 7.9
  • シェイプ:VM.Standard.E2.1.Micro (always free対象)
  • VCN:my-vcn
  • サブネット:パブリックサブネットmy-vcn
sudo su -
yum install docker
systemctl start docker 
systemctl enable docker 

dockerコマンドの練習

docker の主なコマンド

# container系
docker container start 
docker container stop 
docker container create
docker contaienr rm
docker contaienr ls (docker ps と同じ) 等・・・

# image系
docker image pull
docker image ls  等・・

# volume系
docker volume create
docker volume inspect 
docker volume prune     等・・

# network 系
docker network connect 
docker network disconnect 
docker network create  等・・・

コンテナの一連のライフサイクル

  • docker image pull : イメージをdocker hubからダウンロード

  • docker container create : コンテナの作成

  • docker container start : コンテナの起動

  • docker container stop : コンテナの停止

  • docker container rm : コンテナの破棄

    • docker run : でpull → create → startまで実行できる。
 # httpdのコンテナを立ち上げ。-dでバックグラウンド実行
[root@my-instance ~]# docker run --name apa000ex1 -d httpd
Unable to find image 'httpd:latest' locally
Trying to pull repository docker.io/library/httpd ...
latest: Pulling from docker.io/library/httpd     #初回なのでイメージがローカルに存在せず、docker hubからpullする
a480a496ba95: Pull complete
3a2663e66670: Pull complete
4f4fb700ef54: Pull complete
dbde712f81fb: Pull complete
867b2ea3628d: Pull complete
6bd9d3710aae: Pull complete
Digest: sha256:bbea29057f25d9543e6a96a8e3cc7c7c937206d20eab2323f478fdb2469d536d
Status: Downloaded newer image for httpd:latest
c3f59e50b0b47d2b255fc9cc34c368923d6a2bd3259f2eb025f6a098317b7a50

#コンテナが起動した
[root@my-instance ~]# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
c3f59e50b0b4        httpd               "httpd-foreground"   14 seconds ago      Up 10 seconds       80/tcp              apa000ex1
[root@my-instance ~]#
[root@my-instance ~]# docker ps  -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
c3f59e50b0b4        httpd               "httpd-foreground"   17 seconds ago      Up 12 seconds       80/tcp              apa000ex1

# コンテナを停止
[root@my-instance ~]# docker stop apa000ex1
apa000ex1
[root@my-instance ~]# docker ps  -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                     PORTS               NAMES
c3f59e50b0b4        httpd               "httpd-foreground"   58 seconds ago      Exited (0) 3 seconds ago                       apa000ex1

# コンテナを削除
[root@my-instance ~]# docker rm apa000ex1
apa000ex1
[root@my-instance ~]# docker ps  -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

# runした際にhttpdのイメージをpullしたので手元にも存在している
[root@my-instance ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              1bcf11fa154f        3 months ago        148MB

コンテナと通信

# -pでコンテナの80番ポートをホストの8080番ポートに転送  
# イメージのpullは上で済なのでコンテナをcreate してstartするだけ
[root@my-instance ~]# docker run --name apa000ex2 -d -p 8080:80 httpd
007ff5daf96b211bc568b56c7b849b3d57c403609f184eeb1898da785a3f76d8
[root@my-instance ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
007ff5daf96b        httpd               "httpd-foreground"   4 hours ago         Up 4 hours          0.0.0.0:8080->80/tcp   apa000ex2

# ローカルホストの8080にcurlすると、コンテナの80番が応答する
[root@my-instance ~]# curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>

# コンテナの削除
[root@my-instance ~]#  docker stop apa000ex2
apa000ex2
[root@my-instance ~]# docker rm  apa000ex2
apa000ex2

コンテナにログイン

docker exec -it コンテナ名/bin/bashでコンテナのシェルに入ることができる。コンテナによってはbashが入っていないこともあるので注意

[root@my-instance ~]# docker exec -it apa000ex19 /bin/bash

root@8ce616056157:/usr/local/apache2# ls -l /
total 8
lrwxrwxrwx.   1 root root   7 Oct 16 00:00 bin -> usr/bin
drwxr-xr-x.   2 root root   6 Aug 14 16:10 boot
drwxr-xr-x.   5 root root 340 Oct 26 14:59 dev
drwxr-xr-x.   1 root root  66 Oct 26 14:59 etc
drwxr-xr-x.   2 root root   6 Aug 14 16:10 home
lrwxrwxrwx.   1 root root   7 Oct 16 00:00 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Oct 16 00:00 lib64 -> usr/lib64
drwxr-xr-x.   2 root root   6 Oct 16 00:00 media
drwxr-xr-x.   2 root root   6 Oct 16 00:00 mnt
drwxr-xr-x.   2 root root   6 Oct 16 00:00 opt
dr-xr-xr-x. 203 root root   0 Oct 26 14:59 proc
drwx------.   2 root root  37 Oct 16 00:00 root
drwxr-xr-x.   3 root root  18 Oct 16 00:00 run
lrwxrwxrwx.   1 root root   8 Oct 16 00:00 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Oct 16 00:00 srv
dr-xr-xr-x.  13 root root   0 Oct 20 09:31 sys
drwxrwxrwt.   2 root root   6 Oct 16 00:00 tmp
drwxr-xr-x.   1 root root  19 Oct 16 00:00 usr
drwxr-xr-x.   1 root root  41 Oct 16 00:00 var

root@8ce616056157:/usr/local/apache2# ls -l /usr/local/apache2/
total 44
drwxr-xr-x. 2 root root 4096 Oct 17 01:21 bin
drwxr-xr-x. 2 root root 4096 Oct 17 01:21 build
drwxr-xr-x. 2 root root   78 Oct 17 01:21 cgi-bin
drwxr-xr-x. 4 root root   84 Oct 17 01:21 conf
drwxr-xr-x. 3 root root 4096 Oct 17 01:21 error
drwxr-xr-x. 2 root root   24 Oct 17 01:21 htdocs
drwxr-xr-x. 3 root root 8192 Oct 17 01:21 icons
drwxr-xr-x. 2 root root 4096 Oct 17 01:21 include
drwxr-xr-x. 1 root root   23 Oct 26 14:59 logs
drwxr-xr-x. 2 root root 8192 Oct 17 01:21 modules

root@8ce616056157:/usr/local/apache2# ls -l /usr/local/apache2/htdocs/index.html
-rw-r--r--. 1 501 staff 45 Jun 11  2007 /usr/local/apache2/htdocs/index.html

root@8ce616056157:/usr/local/apache2# cat  /usr/local/apache2/htdocs/index.html
<html><body><h1>It works!</h1></body></html>

その他のコンテナも作成してみる

  • nginxコンテナ
# nginxのコンテナを作成。-p でコンテナの80番ポートをホストの8004ポートへ転送
[root@my-instance ~]# docker run --name nginx000ex6 -d -p 8004:80 nginx
Unable to find image 'nginx:latest' locally
Trying to pull repository docker.io/library/nginx ...
latest: Pulling from docker.io/library/nginx
a480a496ba95: Already exists
f3ace1b8ce45: Pull complete
11d6fdd0e8a7: Pull complete
f1091da6fd5c: Pull complete
40eea07b53d8: Pull complete
6476794e50f4: Pull complete
70850b3ec6b2: Pull complete
Digest: sha256:28402db69fec7c17e179ea87882667f1e054391138f77ffaf0c3eb388efc3ffb
Status: Downloaded newer image for nginx:latest
c2b03236904a6102d1f308492e64a2b3a2e80c285a4ba1f8740224a02b4f27ad

# nginxコンテナが作成された
[root@my-instance ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
c2b03236904a        nginx               "/docker-entrypoint.…"   42 seconds ago      Up 39 seconds       0.0.0.0:8004->80/tcp   nginx000ex6

# ホストの8004ポートにcurlするとコンテナの80番ポートが応答する
[root@my-instance ~]# curl http://localhost:8004
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

# コンテナの削除
[root@my-instance ~]# docker stop nginx000ex6
nginx000ex6
[root@my-instance ~]# docker rm  nginx000ex6
nginx000ex6
[root@my-instance ~]# docker run --name mysql000ex7 -dit -e MYSQL_ROOT_PASSWORD=myrootpass mysql
8c9d4ecc76bb5698a6d6124467ca24431dcf6ab5db6892facd75ce7bb47c728d
[root@my-instance ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
8c9d4ecc76bb        mysql               "docker-entrypoint.s…"   5 seconds ago       Up 3 seconds        3306/tcp, 33060/tcp   mysql000ex7

# コンテナの削除
[root@my-instance ~]# docker stop mysql000ex7
mysql000ex7
[root@my-instance ~]# docker rm mysql000ex7
mysql000ex7

WordPress + MySQL

  • networkを作成
  • mysqlコンテナを作成
  • wordressコンテナを作成

の順に進む。要約すると以下の3コマンド。mysqlのみ明示的に8.0のバージョンを指定する

docker network create wordpress000net1
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress

dockerのネットワークの概念は、「複数のコンテナを同じdocker networkに参加させると、コンテナ同士が通信できるようになる」イメージ?

networkを作成

# networkを作成
[root@my-instance ~]# docker network create wordpress000net1
a4a7b6c3ae8cafe1cd8de42e6e81b72798edda2a95176ee6bca3b75a6d9b4e57

# 作成された
[root@my-instance ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d1778e8d9155        bridge              bridge              local
23b4f3487b4d        host                host                local
196ebccfcf45        none                null                local
a4a7b6c3ae8c        wordpress000net1    bridge              local

# inspectすると、専用のサブネットが切られていることがわかる。
[root@my-instance ~]# docker network inspect wordpress000net1
[
    {
        "Name": "wordpress000net1",
        "Id": "a4a7b6c3ae8cafe1cd8de42e6e81b72798edda2a95176ee6bca3b75a6d9b4e57",
        "Created": "2024-10-20T15:51:41.158528026Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

MySQLコンテナを作成

[root@my-instance ~]# docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql
:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
Unable to find image 'mysql:8.0' locally
Trying to pull repository docker.io/library/mysql ...
8.0: Pulling from docker.io/library/mysql
eba3c26198b7: Already exists
6111251d1d05: Pull complete
b669648c0f2f: Pull complete
6f19c425e6ff: Pull complete
530232ef45f9: Pull complete
880d6068231f: Pull complete
bb2907e86db3: Pull complete
eea32227a5f9: Pull complete
e0a236ad6589: Pull complete
cb0c5c9ac9cf: Pull complete
05654ed9c105: Pull complete
Digest: sha256:bf79508626d6cad5bd82ea762109690e42467b1eefedab27946eccd69ab23069
Status: Downloaded newer image for mysql:8.0
92b35ed65a85495d700cb70a842065644944057547ed139857147895fcc6cc40

[root@my-instance ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
92b35ed65a85        mysql:8.0           "docker-entrypoint.s…"   39 seconds ago      Up 35 seconds       3306/tcp, 33060/tcp   mysql000ex11

wordpressコンテナを作成

[root@my-instance ~]# docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress
c8377fceae5aa4976da710ecc31d57381edddf8f96e9bc0e8852d4474edafef0

[root@my-instance ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                  NAMES
c8377fceae5a        wordpress           "docker-entrypoint.s…"   23 seconds ago       Up 14 seconds       0.0.0.0:8085->80/tcp   wordpress000ex12
92b35ed65a85        mysql:8.0           "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp, 33060/tcp    mysql000ex11

確認

ホストの8085ポートにブラウザでアクセス

ちなみにこの時点でdocker networkを確認すると、ネットワークにmysqlwordpressのコンテナが参加していることが確認できた

[root@my-instance ~]# docker network inspect wordpress000net1
[
    {
        "Name": "wordpress000net1",
        "Id": "a4a7b6c3ae8cafe1cd8de42e6e81b72798edda2a95176ee6bca3b75a6d9b4e57",
        "Created": "2024-10-20T15:51:41.158528026Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "92b35ed65a85495d700cb70a842065644944057547ed139857147895fcc6cc40": {
                "Name": "mysql000ex11",
                "EndpointID": "37aee9faf349f5c8e6fcc48a11e448a3b9532570cbc1d4cd52e8085d38795f82",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "c8377fceae5aa4976da710ecc31d57381edddf8f96e9bc0e8852d4474edafef0": {
                "Name": "wordpress000ex12",
                "EndpointID": "e59133f5eccd3f002faa9b45861afb288cb5924570a4e4d1596aaad2e321285c",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

後片付け

docker stop wordpress000ex12
docker rm  wordpress000ex12

docker stop mysql000ex11
docker rm mysql000ex11

docker network rm wordpress000net1

補足

特にバージョンを指定せずにコンテナを起動したところ、mysqlコンテナが落ちていた。

# 特にバージョンを指定せずにコンテナを起動したところ、
docker network create wordpress000net1
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress

# mysqlコンテナが落ちていた
[root@my-instance ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                     PORTS                  NAMES
f7ef514ada96        wordpress           "docker-entrypoint.s…"   About a minute ago   Up About a minute          0.0.0.0:8085->80/tcp   wordpress000ex12
d7fbeb9e0c80        mysql               "docker-entrypoint.s…"   4 minutes ago        Exited (1) 4 minutes ago                          mysql000ex11

mysqlコンテナのログを確認したところ、最新版として使っているmysql9.1はdefault-authentication-plugin=mysql_native_passwordなる変数を持っていないとのこと。バージョン8ではあったはずなのだが、latestでは消えているか指定の仕方が変わっている様子。上記ではバージョンを落として明示的にmysql:8.0を指定して動かしている。

[root@my-instance ~]# docker logs d7fbeb9e0c80
2024-10-20 15:55:12+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2024-10-20 15:55:13+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2024-10-20 15:55:13+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2024-10-20 15:55:14+00:00 [Note] [Entrypoint]: Initializing database files
2024-10-20T15:55:14.533840Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
2024-10-20T15:55:14.537197Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 9.1.0) initializing of server in progress as process 78
2024-10-20T15:55:14.622100Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-10-20T15:55:17.205432Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-10-20T15:55:21.934438Z 0 [ERROR] [MY-000067] [Server] unknown variable 'default-authentication-plugin=mysql_native_password'.
2024-10-20T15:55:21.936824Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
2024-10-20T15:55:21.936872Z 0 [ERROR] [MY-010119] [Server] Aborting
2024-10-20T15:55:24.181299Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.

Redmine + MySQL

コンテナの起動

#ネットワークの作成
docker network create redmine000net2

#mysql:8.0コンテナの作成
docker run --name mysql000ex13 -dit --net=redmine000net2 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

# redmineコンテナの作成
docker run -dit --name redmine000ex14 --network redmine000net2 -p 8086:3000 -e REDMINE_DB_MYSQL=mysql000ex13 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine

# ブラウザでインスタンスの8086ポートにアクセス。デフォルトユーザはadmin/admin

後片付け

docker stop redmine000ex14
docker rm redmine000ex14

docker stop mysql000ex13
docker rm mysql000ex13

docker network rm redmine000net2

補足

コンテナのポートにアクセスするには、

  • 起動時に-p 8004:80 オプションをつけてローカルホストのポートにフォワーディングするか、
  • docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql000ex13でコンテナに振られたIPを調べて、そのIPとポートに対してアクセスする
  • ローカルサーバ上でポートフォワードする

等が考えられる。

すでに上がっているコンテナに対しては2点目3点目で対応できる。

  • 2点目:例えば上記のmysqlコンテナは、コンテナ上の3306ポートで上がっているため、コンテナのIPと合わせて指定すればローカルからmysqlへつなぐことができる。
# mysql clientのインストール
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 #最近のGPGキーをインストール https://qiita.com/Code_Dejiro/items/c97c400b92a85dce4468
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 #最近のGPGキーをインストール
yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum install -y mysql-community-client

# コンテナのIPを確認:方法その1
[root@my-instance ~]# docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql000ex13
172.20.0.2

# コンテナのIPを確認:方法その2
[root@my-instance ~]# docker network inspect redmine000net2  | jq '.[].Containers[] | select(.Name == "mysql000ex13")'
{
  "Name": "mysql000ex13",
  "EndpointID": "c9fa2b0113e2fedca2fff257ee28d0273b511089f6c5010a436cadb5161c174c",
  "MacAddress": "02:42:ac:14:00:02",
  "IPv4Address": "172.20.0.2/16",
  "IPv6Address": ""
}

# コンテナのポートを確認
[root@my-instance ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
9304fc614123        redmine             "/docker-entrypoint.…"   17 minutes ago      Up 17 minutes       0.0.0.0:8086->3000/tcp   redmine000ex14
f0b2890a3fa9        mysql:8.0           "docker-entrypoint.s…"   52 minutes ago      Up 52 minutes       3306/tcp, 33060/tcp      mysql000ex13

# mysqlクライアントからコンテナのIP:3306に接続。色々テーブルができていて、先ほど試しに作ったredmineプロジェクトのデータも入っている。
[root@my-instance ~]# mysql -h 172.20.0.2 -u redmine000kun -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.40 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| redmine000db       |
+--------------------+
3 rows in set (0.08 sec)

mysql> use redmine000db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------------+
| Tables_in_redmine000db    |
+---------------------------+
| ar_internal_metadata      |
| attachments               |
| auth_sources              |
| boards                    |
| changes                   |
| changeset_parents         |
| changesets                |
| changesets_issues         |
| comments                  |
| custom_field_enumerations |
| custom_fields             |
| custom_fields_projects    |
| custom_fields_roles       |
| custom_fields_trackers    |
| custom_values             |
| documents                 |
| email_addresses           |
| enabled_modules           |
| enumerations              |
| groups_users              |
| import_items              |
| imports                   |
| issue_categories          |
| issue_relations           |
| issue_statuses            |
| issues                    |
| journal_details           |
| journals                  |
| member_roles              |
| members                   |
| messages                  |
| news                      |
| projects                  |
| projects_trackers         |
| queries                   |
| queries_roles             |
| repositories              |
| roles                     |
| roles_managed_roles       |
| schema_migrations         |
| settings                  |
| time_entries              |
| tokens                    |
| trackers                  |
| user_preferences          |
| users                     |
| versions                  |
| watchers                  |
| wiki_content_versions     |
| wiki_contents             |
| wiki_pages                |
| wiki_redirects            |
| wikis                     |
| workflows                 |
+---------------------------+
54 rows in set (0.00 sec)

mysql> select * from projects;
+----+-------------+-------------+----------+-----------+-----------+---------------------+---------------------+-------------+--------+------+------+-----------------+--------------------+------------------------+------------------------+
| id | name        | description | homepage | is_public | parent_id | created_on          | updated_on          | identifier  | status | lft  | rgt  | inherit_members | default_version_id | default_assigned_to_id | default_issue_query_id |
+----+-------------+-------------+----------+-----------+-----------+---------------------+---------------------+-------------+--------+------+------+-----------------+--------------------+------------------------+------------------------+
|  2 | new-project |             |          |         1 |      NULL | 2024-10-22 14:39:32 | 2024-10-22 14:39:32 | new-project |      1 |    1 |    2 |               0 |               NULL |                   NULL |                   NULL |
+----+-------------+-------------+----------+-----------+-----------+---------------------+---------------------+-------------+--------+------+------+-----------------+--------------------+------------------------+------------------------+
1 row in set (0.00 sec)
  • 3点目:ローカルサーバ上でポートフォワードするという手もある。
#ローカルサーバ上でポートフォワードを設定
# dockerホスト -> dockerホスト(踏み台相当) -> mysqlコンテナ(172.20.0.2:3306) の構成で、
# dockerホストのローカルの3306にアクセスすると、自分を経由してmysqlコンテナの3306へポートフォワードされる
[root@my-instance ~]# ssh -i ssh.key -f -L 3306:172.20.0.2:3306 opc@localhost -f -N
[root@my-instance ~]# mysql -h 127.0.0.1 -P 3306  -u redmine000kun -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.40 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

  • コンテナが上がっているホストから見たコンテナのIPとポートがわかっていれば、外からでもポート転送でつなぐことができる
    • OCIだとfirewalld, SELinux に注意
# 外部インスタンスから、sshポートフォワーディングを設定
# 外部インスタンス(my-instance4) -> dockerホスト(opc@my-instance) -> mysqlコンテナ(172.20.0.2:3306) の構成で、
# 外部インスタンスのローカルの8888にアクセスすると、dockerホスト経由でmysqlコンテナの3306へポートフォワードされる

[root@my-instance4 ~]# ssh -i ssh.key -f -L 8888:172.20.0.2:3306 opc@my-instance -f -N
[root@my-instance4 ~]# ps aux | grep 8888 | grep -v grep
root     28881  0.0  0.1 186824  1012 ?        Ss   00:16   0:00 ssh -i ssh.key -f -L 8888:172.20.0.2:3306 opc@my-instance -f -N

# mysqlでローカルの8888にアクセス。(なぜかmysql -h localhost...とするとつながらないため注意)
[root@my-instance4 ~]# mysql -h 127.0.0.1 -P 8888 -u redmine000kun -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 8.0.40 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Redmine + mariaDB

コンテナの起動

#ネットワークの作成
docker network create redmine000net3

#mariadbコンテナの作成 これは特にバージョン指定不要だった
docker run --name mariadb000ex15 -dit --net=redmine000net3 -e MYSQL_ROOT_PASSWORD=mariarootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

# redmineコンテナの作成
docker run -dit --name redmine000ex16 --network redmine000net3 -p 8087:3000 -e REDMINE_DB_MYSQL=mariadb000ex15 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine

# ブラウザでインスタンスの8087ポートにアクセス。デフォルトユーザはadmin/admin

後片付け

docker stop redmine000ex16
docker rm redmine000ex16

docker stop mariadb000ex15
docker rm mariadb000ex15

docker network rm redmine000net3

補足

同じ要領でmariadbにもローカルから接続できる。

mariadbmysqlの妹分的存在で、mysql clientもそのままmariadbの接続に使える。

[root@my-instance ~]#  docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadb000ex15
172.18.0.2
[root@my-instance ~]# mysql -h 172.18.0.2 -u redmine000kun -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 11.5.2-MariaDB-ubu2404 mariadb.org binary distribution

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql>
mysql>
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| redmine000db       |
+--------------------+
2 rows in set (0.01 sec)

mysql>

WordPress + MariaDB

コンテナの起動

#ネットワークの作成
docker network create wordpress000net4

#mariadbコンテナの作成
docker run --name mariadb000ex17 -dit --net=wordpress000net4 -e MYSQL_ROOT_PASSWORD=mariarootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

# redmineコンテナの作成
docker run --name wordpress000ex18 -dit --net=wordpress000net4 -p 8088:80 -e WORDPRESS_DB_HOST=mariadb000ex17 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress

# ブラウザでインスタンスの8088ポートにアクセス。

後片付け

docker stop wordpress000ex18
docker rm wordpress000ex18

docker stop mariadb000ex17
docker rm mariadb000ex17

docker network rm wordpress000net4

jupyter

https://qiita.com/fuku_tech/items/6752b00770552bf4f46b

# イメージをpull
[root@my-instance ~]# docker pull jupyter/scipy-notebook
Using default tag: latest
Trying to pull repository docker.io/jupyter/scipy-notebook ...
latest: Pulling from docker.io/jupyter/scipy-notebook
aece8493d397: Pull complete
fd92c719666c: Pull complete
088f11eb1e74: Pull complete
4f4fb700ef54: Pull complete
ef8373d600b0: Pull complete
77e45ee945dc: Pull complete
a30f89a0af6c: Pull complete
dc42adc7eb73: Pull complete
abaa8376a650: Pull complete
aa099bb9e49a: Pull complete
822c4cbcf6a6: Pull complete
d25166dcdc7b: Pull complete
964fc3e4ff9f: Pull complete
2c4c69587ee4: Pull complete                                                                                                                                                                de2cdd875fa8: Pull complete
75d33599f5f2: Pull complete
31973ea82470: Pull complete
96ee7e4439c7: Pull complete
1f9ad23c07ac: Pull complete
d19266e0cb17: Pull complete
9a165b6e9dc7: Pull complete
5689442fd4e1: Pull complete
9a6a202f62a6: Pull complete
734ea0c3d94e: Pull complete
a21a167f7127: Pull complete
Digest: sha256:fca4bcc9cbd49d9a15e0e4df6c666adf17776c950da9fa94a4f0a045d5c4ad33
Status: Downloaded newer image for jupyter/scipy-notebook:latest
jupyter/scipy-notebook:latest

# jupyterのコンテナを起動。
# 本当は-dでバックグラウンド実行すべきだが、標準出力に出るトークンを見たいのでつけずに実行
[root@my-instance ~]# docker run -v /root/jupyter/:/home/jovyan/work  -p 10000:8888 --name jupyter jupyter/scipy-notebook
Entered start.sh with args: jupyter lab
Running hooks in: /usr/local/bin/start-notebook.d as uid: 1000 gid: 100
Done running hooks in: /usr/local/bin/start-notebook.d
Running hooks in: /usr/local/bin/before-notebook.d as uid: 1000 gid: 100
Done running hooks in: /usr/local/bin/before-notebook.d
Executing the command: jupyter lab
[I 2024-10-27 04:41:52.129 ServerApp] Package jupyterlab took 0.0000s to import
[I 2024-10-27 04:41:52.321 ServerApp] Package jupyter_lsp took 0.1915s to import
[W 2024-10-27 04:41:52.321 ServerApp] A `_jupyter_server_extension_points` function was not found in jupyter_lsp. Instead, a `_jupyter_server_extension_paths` function was found and will be used for now. This function name will be deprecated in future releases of Jupyter Server.
[I 2024-10-27 04:41:52.329 ServerApp] Package jupyter_server_mathjax took 0.0076s to import
[I 2024-10-27 04:41:52.399 ServerApp] Package jupyter_server_terminals took 0.0682s to import
[I 2024-10-27 04:41:52.689 ServerApp] Package jupyterlab_git took 0.2901s to import
[I 2024-10-27 04:41:52.718 ServerApp] Package nbclassic took 0.0278s to import
[W 2024-10-27 04:41:52.742 ServerApp] A `_jupyter_server_extension_points` function was not found in nbclassic. Instead, a `_jupyter_server_extension_paths` function was found and will be used for now. This function name will be deprecated in future releases of Jupyter Server.
[I 2024-10-27 04:41:52.743 ServerApp] Package nbdime took 0.0000s to import
[I 2024-10-27 04:41:52.744 ServerApp] Package notebook took 0.0000s to import
[I 2024-10-27 04:41:52.748 ServerApp] Package notebook_shim took 0.0000s to import
[W 2024-10-27 04:41:52.749 ServerApp] A `_jupyter_server_extension_points` function was not found in notebook_shim. Instead, a `_jupyter_server_extension_paths` function was found and will be used for now. This function name will be deprecated in future releases of Jupyter Server.
[I 2024-10-27 04:41:52.751 ServerApp] jupyter_lsp | extension was successfully linked.
[I 2024-10-27 04:41:52.756 ServerApp] jupyter_server_mathjax | extension was successfully linked.
[I 2024-10-27 04:41:52.761 ServerApp] jupyter_server_terminals | extension was successfully linked.
[I 2024-10-27 04:41:52.767 ServerApp] jupyterlab | extension was successfully linked.
[I 2024-10-27 04:41:52.800 ServerApp] jupyterlab_git | extension was successfully linked.
[I 2024-10-27 04:41:52.833 ServerApp] nbclassic | extension was successfully linked.
[I 2024-10-27 04:41:52.834 ServerApp] nbdime | extension was successfully linked.
[I 2024-10-27 04:41:52.840 ServerApp] notebook | extension was successfully linked.
[I 2024-10-27 04:41:52.846 ServerApp] Writing Jupyter server cookie secret to /home/jovyan/.local/share/jupyter/runtime/jupyter_cookie_secret
[I 2024-10-27 04:41:54.005 ServerApp] notebook_shim | extension was successfully linked.
[I 2024-10-27 04:41:54.146 ServerApp] notebook_shim | extension was successfully loaded.
[I 2024-10-27 04:41:54.149 ServerApp] jupyter_lsp | extension was successfully loaded.
[I 2024-10-27 04:41:54.150 ServerApp] jupyter_server_mathjax | extension was successfully loaded.
[I 2024-10-27 04:41:54.151 ServerApp] jupyter_server_terminals | extension was successfully loaded.
[I 2024-10-27 04:41:54.193 LabApp] JupyterLab extension loaded from /opt/conda/lib/python3.11/site-packages/jupyterlab
[I 2024-10-27 04:41:54.193 LabApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
[I 2024-10-27 04:41:54.194 LabApp] Extension Manager is 'pypi'.
[I 2024-10-27 04:41:54.197 ServerApp] jupyterlab | extension was successfully loaded.
[I 2024-10-27 04:41:54.204 ServerApp] jupyterlab_git | extension was successfully loaded.
[I 2024-10-27 04:41:54.225 ServerApp] nbclassic | extension was successfully loaded.
[I 2024-10-27 04:41:54.558 ServerApp] nbdime | extension was successfully loaded.
[I 2024-10-27 04:41:54.563 ServerApp] notebook | extension was successfully loaded.
[I 2024-10-27 04:41:54.564 ServerApp] Serving notebooks from local directory: /home/jovyan
[I 2024-10-27 04:41:54.564 ServerApp] Jupyter Server 2.8.0 is running at:
[I 2024-10-27 04:41:54.564 ServerApp] http://b2e774832e5f:8888/lab?token=76c8930c86f7d77071b304514f5d00828072cefd355f3bdd
[I 2024-10-27 04:41:54.564 ServerApp]     http://127.0.0.1:8888/lab?token=76c8930c86f7d77071b304514f5d00828072cefd355f3bdd
[I 2024-10-27 04:41:54.564 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 2024-10-27 04:41:54.598 ServerApp]

    To access the server, open this file in a browser:
        file:///home/jovyan/.local/share/jupyter/runtime/jpserver-7-open.html
    Or copy and paste one of these URLs:
        http://b2e774832e5f:8888/lab?token=76c8930c86f7d77071b304514f5d00828072cefd355f3bdd
        http://127.0.0.1:8888/lab?token=76c8930c86f7d77071b304514f5d00828072cefd355f3bdd
[I 2024-10-27 04:41:57.517 ServerApp] Skipped non-installed server(s): bash-language-server, dockerfile-language-server-nodejs, javascript-typescript-langserver, jedi-language-server, julia-language-server, pyright, python-language-server, python-lsp-server, r-languageserver, sql-language-server, texlab, typescript-language-server, unified-language-server, vscode-css-languageserver-bin, vscode-html-languageserver-bin, vscode-json-languageserver-bin, yaml-language-server


画面に入り、表示されたトークンを以下に張りつけると利用できるようになる。

コンテナ・ホスト間のファイルのやり取り

ホストのファイルをコンテナへ

apacheコンテナのindes.htmlを更新する

# index.htmlを作る
[root@my-instance ~]# cat index.html
<html>
<meta charset="utf-8"/>
<body>
    <div>hello</div>
</body>
</html>

#apacheコンテナを立てる
[root@my-instance ~]# docker run --name apa000ex19 -d -p 8089:80 httpd
8ce61605615713aa8bf13deaffc749279cb2693881ee3488d9acf58e5ef2fffc
[root@my-instance ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
8ce616056157        httpd               "httpd-foreground"   19 seconds ago      Up 14 seconds       0.0.0.0:8089->80/tcp   apa000ex19

# コンテナの初期状態での表示
[root@my-instance ~]# curl localhost:8089
<html><body><h1>It works!</h1></body></html>

# これはコンテナ内の以下を表示している
[root@my-instance ~]# docker exec -it apa000ex19 cat /usr/local/apache2/htdocs/index.html
<html><body><h1>It works!</h1></body></html>

# 上記ファイルを書き換える
[root@my-instance ~]# docker cp index.html apa000ex19:/usr/local/apache2/htdocs/

# 更新された
[root@my-instance ~]# curl localhost:8089
<html>
<meta charset="utf-8"/>
<body>
    <div>hello</div>
</body>
</html>

コンテナのファイルをホストへ

apacheコンテナのhttpd.confをホストに落とす

[root@my-instance ~]# docker cp apa000ex19:/usr/local/apache2/conf/httpd.conf .

[root@my-instance ~]# ll
合計 32
-rw-r--r--. 1 root root 20827 1017 10:21 httpd.conf
-rw-r--r--. 1 root root    75 1026 23:58 index.html
-rw-------. 1 root root  1676 1022 23:09 ssh-key-2023-10-09.key

マウント

  • ボリュームマウント
    • ホストのdocker engineの領域に記憶領域を作ってマウントする
    • 便利だが中身を外から操作しづらい → と言いつつ・・さわれないわけではない
  • バインドマウント
    • ホストの任意の場所にマウントする
    • 外からも頻繁に触りたいに便利

バインドマウント

# バインドマウント用のローカルフォルダを作成
[root@my-instance apl_folder]# ll /root/apl_folder/
合計 0

# ローカルフォルダをバインドマウントしたコンテナを作成
[root@my-instance apl_folder]# docker run --name apa000ex20 -d -p 8090:80 -v /root/apl_folder/:/usr/local/apache2/htdocs/ httpd
558902ba378cd202583af7d9f3057e77ae46f4496244512ec533e157729b4662
[root@my-instance apl_folder]# docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
558902ba378c        httpd               "httpd-foreground"   11 seconds ago      Up 9 seconds        0.0.0.0:8090->80/tcp   apa000ex20

# index.htmlがないので何もないリストが返ってくる
[root@my-instance apl_folder]# curl localhost:8090
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /</title>
 </head>
 <body>
<h1>Index of /</h1>
<ul></ul>
</body></html>

# index.htmlを配置
[root@my-instance apl_folder]# mv ../index.html .

# 再度curlするとローカルフォルダのindex.htmlを読んで返してくれるようになった
[root@my-instance apl_folder]# curl localhost:8090
<html>
<meta charset="utf-8"/>
<body>
    <div>hello</div>
</body>
</html>

ちなみに上記のようにマウントした状態でコンテナ内のdfを確認したところ、特にマウントされている様子はなかった。謎。

[root@my-instance apl_folder]# docker exec -it apa000ex20 /bin/bash

root@558902ba378c:/usr/local/apache2# df
Filesystem     1K-blocks     Used Available Use% Mounted on
overlay         40223552 16107140  24116412  41% /
tmpfs              65536        0     65536   0% /dev
tmpfs             342452        0    342452   0% /sys/fs/cgroup
shm                65536        0     65536   0% /dev/shm
/dev/sda3       40223552 16107140  24116412  41% /etc/hosts
tmpfs             342452        0    342452   0% /proc/acpi
tmpfs             342452        0    342452   0% /proc/scsi
tmpfs             342452        0    342452   0% /sys/firmware

# docker inspect するとバインドマウントされている様子が見える
[root@my-instance apl_folder]# docker container inspect apa000ex20 | jq '.[].Mounts'
[
  {
    "Type": "bind",
    "Source": "/root/apl_folder",
    "Destination": "/usr/local/apache2/htdocs",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
  }
]

ボリュームマウント

# dockerボリューム作成
[root@my-instance apl_folder]# docker volume create apa000vol1
apa000vol1
[root@my-instance apl_folder]# docker volume ls
DRIVER              VOLUME NAME
local               1d6415cfe09a4c72b2669d5ca068c0ff93ef6a7f877b884e8402c9dc4f63b4f2
local               3cc3660295496ad9b7dbcce128c97e47a2a34889b92ab78778b27375f7d39318
local               3feaf2e16926b27f55413c419b7959782232490abf814f9757a8fa583188c5c3
local               6b4cd49b01d3c25b75173bc98a9520e7be0db0a6c4f1e45183989ac1f6b6d96f
local               9b769b5711f74e489239274fd43ce09f42aedff44273688cda669db330bb354a
local               10f4e38cd3177a7efefec3053ed0920592f35f76845c8e4840edce7e6e483581
local               42efef89359fc9b8c2ad88b5e466c2964a277f0073eac23806a5fc6e4ca26761
local               46d65079c0e79a4b5400518833411eca416624983de88a038beed2595e180876
local               992ad43ad550eb5cbaf7e6729919be16c5500957028c621a193d78f6996f13c2
local               43701ef98454dcbd3f9d9c0a389fa2ebfce3aec753bfa7e5f7896be51b38a235
local               94872215cf129b137111a3d915c82571d721bcd69f9f4eefc6e57cc3bfee080a
local               a48ad7868f7a2c37d03349d410d54786d35c6f8753c3a3dfdb59e35c8a36f99f
local               ab8dbe6646f1750fe506b955fd0fcf89dc3c3940141da45217e0f0be3590291e
local               apa000vol1
local               cf0d139c7a6a033cc7cda700926ecf78489871c370935bfaec8884c8267ff91f
local               d8c84d6cb508782820803456190ef5d2a1a041c742094b625a7fee6d9fbfee82
local               ddd87e77d73b251459c3be0c3d17f0ac2f343af6a47760e706bfa885ece02722
local               f42fab4ac7941b27fb9b5b77796bb37ce1f3939fe2282468e3532279836057ce

# 今の状態
[root@my-instance apl_folder]# docker volume inspect apa000vol1
[
    {
        "CreatedAt": "2024-10-27T13:09:27+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/apa000vol1/_data",
        "Name": "apa000vol1",
        "Options": {},
        "Scope": "local"
    }
]
# dockerボリュームをマウント
[root@my-instance apl_folder]# docker run --name apa000ex21 -d -p 8091:80 -v apa000vol1:/usr/local/apache2/htdocs/ httpd
2a70b9370125308baf7e8104b565c038db76feef82a3489a16e585e06dab6ce4

# ボリュームの表示は特に変わらず。マウントされているかどうかをvolume自身は意識していない
[root@my-instance apl_folder]# docker volume inspect apa000vol1
[
    {
        "CreatedAt": "2024-10-27T13:22:50+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/apa000vol1/_data",
        "Name": "apa000vol1",
        "Options": {},
        "Scope": "local"
    }
]

# コンテナのmountの状態にマウント先が/var/lib/docker/volumes/apa000vol1/_dataと出ている。
# これがdocker volumeの実体?
[root@my-instance apl_folder]# docker container inspect apa000ex21 | jq '.[].Mounts'
[
  {
    "Type": "volume",
    "Name": "apa000vol1",
    "Source": "/var/lib/docker/volumes/apa000vol1/_data",
    "Destination": "/usr/local/apache2/htdocs",
    "Driver": "local",
    "Mode": "z",
    "RW": true,
    "Propagation": ""
  }
]

# 確かにhttpdコンテナのindex.htmlがここに配置されている。
[root@my-instance apl_folder]# ll /var/lib/docker/volumes/apa000vol1/_data/
合計 4
-rw-r--r--. 1 501 ftp 45  612  2007 index.html

コンテナのイメージ化

今あるコンテナをイメージに焼く

# 普通のhttpdコンテナを作成
[root@my-instance ~]# docker run --name apa000ex22 -d -p 8092:80 httpd
ff66a1e6ae5128062035a1a0ff2424b9a8dacdf8d5e7e7fcea93779efddda1d8

# この時点ではindex.htmlの中身はhttpdコンテナのデフォルトのまま。
[root@my-instance ~]# curl localhost:8092
<html><body><h1>It works!</h1></body></html>

# コンテナ上のindex.htmlを書き換え
[root@my-instance apl_folder]# docker cp index.html  apa000ex22:/usr/local/apache2/htdocs/

# 中身が更新された
[root@my-instance apl_folder]# curl localhost:8092
<html>
<meta charset="utf-8"/>
<body>
    <div>hello</div>
</body>
</html>

# 今のコンテナの状態でイメージを作成
[root@my-instance apl_folder]# docker commit apa000ex22 ex22_original1
sha256:8381b1d317e3bf778f966096f8f9dc2d58af390c543d0163b111896439c568fe

# イメージが作成された
[root@my-instance apl_folder]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
ex22_original1           latest              8381b1d317e3        5 seconds ago       148MB  ★
wordpress                latest              d9da5214e7fd        11 days ago         699MB
mysql                    latest              be960704dfac        12 days ago         602MB
mysql                    8.0                 03a8d6b00bce        12 days ago         590MB
nginx                    latest              3b25b682ea82        3 weeks ago         192MB
mariadb                  latest              4b8711c6c639        7 weeks ago         407MB
httpd                    latest              1bcf11fa154f        3 months ago        148MB
redmine                  latest              c6f11346815b        4 months ago        633MB
jupyter/scipy-notebook   latest              ad65fcfebde3        12 months ago       4.14GB


# 作成したイメージから新しいコンテナを立てる
[root@my-instance apl_folder]# docker run --name apa000ex22_2 -d -p 8888:80 ex22_original1
7edc68e70bb7d1b35166be38037c36b18dd3bcfec0ae9dd18848bcb7211e594d

# 書き換えた内容が反映されている(index.htmlが書き変わった状態でイメージが作成されている)
[root@my-instance apl_folder]# curl localhost:8888
<html>
<meta charset="utf-8"/>
<body>
    <div>hello</div>
</body>
</html>

Dockerfileを使う

  • 「イメージの改造の仕方」を記述するファイル。
  • ファイル名はDockerfilieで固定。1フォルダにつき1Dockerfileしか置けない。
# Dockerfileと、書き換え用のindex.htmlを準備。
[root@my-instance apl_folder]# pwd
/root/apl_folder
[root@my-instance apl_folder]# ll
合計 8
-rw-r--r--. 1 root root  53 1027 14:17 Dockerfile
-rw-r--r--. 1 root root 134 1027 14:18 index.html
[root@my-instance apl_folder]# cat Dockerfile
FROM httpd
COPY index.html /usr/local/apache2/htdocs
[root@my-instance apl_folder]# cat index.html
<html>
<meta charset="utf-8"/>
<body>
    <div>hello. this files is introduced to container image by DockerFile</div>
</body>
</html>

[root@my-instance apl_folder]# docker build -t ex22_original2 /root/apl_folder/
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM httpd
 ---> 1bcf11fa154f
Step 2/2 : COPY index.html /usr/local/apache2/htdocs
 ---> 356ad7a1ae0f
Successfully built 356ad7a1ae0f
Successfully tagged ex22_original2:latest

# イメージが作成された
[root@my-instance apl_folder]# docker image ls | grep ex
ex22_original2           latest              356ad7a1ae0f        2 minutes ago       148MB
ex22_original1           latest              8381b1d317e3        11 minutes ago      148MB

# このイメージでコンテナを作成すると、確かにindex.htmlの中身が書き変わった状態でイメージが作られていたことがわかる
[root@my-instance apl_folder]# docker run --name apa000ex22_3 -d -p 8888:80 ex22_original2
9722291ee16350184d7340248ed6ff56397aecdf78fb29433e4a1b577102dc59
[root@my-instance apl_folder]# curl localhost:8888
<html>
<meta charset="utf-8"/>
<body>
    <div>hello. this files is introduced to container image by DockerFile</div>
</body>
</html>

イメージのインポート・エクスポート

[root@my-instance apl_folder]# docker image ls ex22_original2
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ex22_original2      latest              356ad7a1ae0f        16 minutes ago      148MB

# イメージをsave
[root@my-instance apl_folder]# docker save -o httpd_original.tar ex22_original2

[root@my-instance apl_folder]# ll -h  httpd_original.tar
-rw-------. 1 root root 146M 1027 14:28 httpd_original.tar

# dokcer上のイメージをいったん削除
[root@my-instance apl_folder]# docker image rm ex22_original2:latest
Untagged: ex22_original2:latest
Deleted: sha256:356ad7a1ae0f3ccfd08f59c11fc2cb65799ba91d308fa590c994ec144fbc9739
Deleted: sha256:59c6677e995f824587c93509b88b371aabbca27e168a4698fdc6f067d4268e09

# イメージが削除された
[root@my-instance apl_folder]# docker image ls ex22_original2
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

# 書き出したtarファイルからイメージをload
[root@my-instance apl_folder]# docker load -i httpd_original.tar
f8d672255375: Loading layer [==================================================>]  4.096kB/4.096kB
Loaded image: ex22_original2:latest

# 消したイメージを再度ロードして復活させることができた。名前を変えられないのが若干不便
[root@my-instance apl_folder]# docker image ls ex22_original2
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ex22_original2      latest              356ad7a1ae0f        17 minutes ago      148MB

docker レジストリ

docker hubにアカウントを作って登録するか、プライベートレジストリを作る。

後者の例が以下

  • レジストリ:イメージを保持・公開するサーバ。レジストリサーバのFQDNとほぼ同義と思われる

  • リポジトリ:各イメージを保存しておく領域・・という意味と思われるが、実用上はイメージ名と同義。

  • タグ:イメージを一意に特定する情報として、「レジストリ名/リポジトリ名:バージョン」を指してタグということもあるが、単にバージョン情報の部分を指してタグという場合もある模様。
# プライベートレジストリをコンテナとして建てる
[root@my-instance apl_folder]# docker run -d -p 5000:5000 registry
Unable to find image 'registry:latest' locally
Trying to pull repository docker.io/library/registry ...
latest: Pulling from docker.io/library/registry
1cc3d825d8b2: Pull complete
85ab09421e5a: Pull complete
40960af72c1c: Pull complete
e7bb1dbb377e: Pull complete
a538cc9b1ae3: Pull complete
Digest: sha256:ac0192b549007e22998eb74e8d8488dcfe70f1489520c3b144a6047ac5efbe90
Status: Downloaded newer image for registry:latest
685ab2fe3f09d8718b92de4f08fab3a4862d3f92e3ad90c6f4bb04bd69553218
[root@my-instance apl_folder]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
685ab2fe3f09        registry            "/entrypoint.sh /etc…"   9 seconds ago       Up 6 seconds        0.0.0.0:5000->5000/tcp   naughty_boyd

# 以下が先ほど作った自作イメージ
[root@my-instance apl_folder]# docker image ls ex22_original2
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ex22_original2      latest              356ad7a1ae0f        30 minutes ago      148MB

# プライベートレジストリに登録するべく、自作イメージを正式にタグ付けする。
# レジストリ名 → プライベートレジストリなのでlocalhost:5000
# リポジトリ名(=イメージ名) → myapacheのバージョン1
[root@my-instance apl_folder]# docker tag ex22_original2 localhost:5000/myapache:1

# 同じ内容で別タグが付いたイメージが新たに作成される
[root@my-instance apl_folder]# docker image ls
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
ex22_original2            latest              356ad7a1ae0f        31 minutes ago      148MB
localhost:5000/myapache   1                   356ad7a1ae0f        31 minutes ago      148MB
...

# イメージをプライベートレジストリにpush
[root@my-instance apl_folder]# docker push localhost:5000/myapache:1
The push refers to repository [localhost:5000/myapache]
f8d672255375: Pushed
2293e5351a0e: Pushed
9748900c01ea: Pushed
18db38bc6851: Pushed
5f70bf18a086: Pushed
25326f665290: Pushed
98b5f35ea9d3: Pushed
1: digest: sha256:c9c15c062c8bdbd8e5ba2ac5d212679f5d7bfb7d91c8a2967d0142f970b14a02 size: 1779

# プライベートレジストリの登録状況を確認
# https://qiita.com/takuyaWt/items/ce846b7f73d8635b5b7b

# リポジトリ一覧(=イメージ一覧)を確認 → myapahceが登録されている
[root@my-instance apl_folder]# curl http://localhost:5000/v2/_catalog
{"repositories":["myapache"]}

# myapacheリポジトリ(myapacheイメージ)のタグ(=バージョン情報) → バージョン1が登録されている
[root@my-instance apl_folder]# curl http://localhost:5000/v2/myapache/tags/list
{"name":"myapache","tags":["1"]}

# 確認のためローカルに存在するイメージをいったん削除
[root@my-instance apl_folder]# docker image rm ex22_original2:latest
Untagged: ex22_original2:latest
[root@my-instance apl_folder]# docker image rm localhost:5000/myapache:1
Untagged: localhost:5000/myapache:1
Untagged: localhost:5000/myapache@sha256:c9c15c062c8bdbd8e5ba2ac5d212679f5d7bfb7d91c8a2967d0142f970b14a02
Deleted: sha256:356ad7a1ae0f3ccfd08f59c11fc2cb65799ba91d308fa590c994ec144fbc9739
Deleted: sha256:59c6677e995f824587c93509b88b371aabbca27e168a4698fdc6f067d4268e09
[root@my-instance apl_folder]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
...

# プライベートレジストリからmyapache:1をダウンロード
[root@my-instance apl_folder]# docker pull localhost:5000/myapache:1
Trying to pull repository localhost:5000/myapache ...
1: Pulling from localhost:5000/myapache
a480a496ba95: Already exists
3a2663e66670: Already exists
4f4fb700ef54: Already exists
dbde712f81fb: Already exists
867b2ea3628d: Already exists
6bd9d3710aae: Already exists
2752699539fa: Pull complete
Digest: sha256:c9c15c062c8bdbd8e5ba2ac5d212679f5d7bfb7d91c8a2967d0142f970b14a02
Status: Downloaded newer image for localhost:5000/myapache:1
localhost:5000/myapache:1

# 無事イメージをダウンロードできた 
[root@my-instance apl_folder]# docker image ls
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/myapache   1                   356ad7a1ae0f        49 minutes ago      148MB
wordpress                 latest              d9da5214e7fd        11 days ago         699MB
mysql                     latest              be960704dfac        12 days ago         602MB
mysql                     8.0                 03a8d6b00bce        12 days ago         590MB
nginx                     latest              3b25b682ea82        3 weeks ago         192MB
mariadb                   latest              4b8711c6c639        7 weeks ago         407MB
httpd                     latest              1bcf11fa154f        3 months ago        148MB
redmine                   latest              c6f11346815b        4 months ago        633MB
jupyter/scipy-notebook    latest              ad65fcfebde3        12 months ago       4.14GB
registry                  latest              75ef5b734af4        13 months ago       25.4MB


docker compose

  • dockerfile
    • イメージの作成ができる
  • docker compose
    • dockerのコンテナ・ボリューム・ネットワークの定義をyamlに書いて、dockerに実行させることができる。
    • kubernetesのpodの概念に近いか。

docker-composeのインストール

少し前まではdocker コマンドの付属品としてdocker composeなるコマンドが利用できたが、今はdocker-compose という別コマンドを導入する必要がある。

https://qiita.com/youtangai/items/ff67ceff5497a0e0b1af

[root@my-instance apache]# curl -L https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 60.8M  100 60.8M    0     0  5673k      0  0:00:10  0:00:10 --:--:-- 5884k

[root@my-instance apache]# sudo chmod +x /usr/local/bin/docker-compose
[root@my-instance apache]# docker-compose --version
Docker Compose version v2.29.7

apacheを起動

# docker composeを書く
[root@my-instance apache]# ll
合計 4
-rw-r--r--. 1 root root 103 1027 15:22 docker-compose.yml
[root@my-instance apache]#
[root@my-instance apache]#
[root@my-instance apache]#
[root@my-instance apache]# cat docker-compose.yml
version: "3"

services:
  apa000ex2:
    image: httpd
    ports:
      - 8080:80
    restart: always

# docker-composeでapacheを実行
[root@my-instance apache]# docker-compose -f docker-compose.yml up -d
WARN[0000] /root/docker_compose_practice/apache/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 2/2
 ✔ Network apache_default        Created                                                                                                                                              0.4s
 ✔ Container apache-apa000ex2-1  Started                                                                                                                                              3.6s

# httpdコンテナが起動した
[root@my-instance apache]# docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
148d25aad2f8        httpd               "httpd-foreground"   11 seconds ago      Up 7 seconds        0.0.0.0:8080->80/tcp   apache-apa000ex2-1
[root@my-instance apache]# curl localhost:8080
<html><body><h1>It works!</h1></body></html>

# docker-composeでapahceを消す(stopとrmが同時に行われる)
[root@my-instance apache]# docker-compose -f docker-compose.yml down
WARN[0000] /root/docker_compose_practice/apache/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 2/2
 ✔ Container apache-apa000ex2-1  Removed                                                                                                                                              2.7s
 ✔ Network apache_default        Removed                                                                                                                                              0.2s

# コンテナが消えた
[root@my-instance apache]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

WordPress + MySQLを起動

# docker composeを書く
[root@my-instance wordpress_mysql]# ll
合計 4
-rw-r--r--. 1 root root 797 1027 15:51 docker-compose.yml
[root@my-instance wordpress_mysql]# cat docker-compose.yml
version: '3'
services:
  mysql000ex11:
    image: mysql:5.7
    networks:
      - wordpress000net1
    volumes:
      - mysql000vol11:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: wordpress000db
      MYSQL_USER: wordpress000kun
      MYSQL_PASSWORD: wkunpass
  wordpress000ex12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    volumes:
      - wordpress000vol12:/var/www/html
    ports:
      - 8085:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql000ex11
      WORDPRESS_DB_NAME: wordpress000db
      WORDPRESS_DB_USER: wordpress000kun
      WORDPRESS_DB_PASSWORD: wkunpass

networks:
  wordpress000net1:
volumes:
  mysql000vol11:
  wordpress000vol12:

# docker-composeでwordpress+mysqlを実行
[root@my-instance wordpress_mysql]# docker-compose -f docker-compose.yml up -d
WARN[0000] /root/docker_compose_practice/wordpress_mysql/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 12/12
 ✔ mysql000ex11 Pulled                                                                                                                                                               86.2s
   ✔ 20e4dcae4c69 Pull complete                                                                                                                                                      40.0s
   ✔ 1c56c3d4ce74 Pull complete                                                                                                                                                      40.3s
   ✔ e9f03a1c24ce Pull complete                                                                                                                                                      40.7s
   ✔ 68c3898c2015 Pull complete                                                                                                                                                      42.6s
   ✔ 6b95a940e7b6 Pull complete                                                                                                                                                      42.8s
   ✔ 90986bb8de6e Pull complete                                                                                                                                                      43.1s
   ✔ ae71319cb779 Pull complete                                                                                                                                                      49.1s
   ✔ ffc89e9dfd88 Pull complete                                                                                                                                                      49.3s
   ✔ 43d05e938198 Pull complete                                                                                                                                                      83.6s
   ✔ 064b2d298fba Pull complete                                                                                                                                                      83.9s
   ✔ df9a4d85569b Pull complete                                                                                                                                                      84.1s
[+] Running 5/5
 ✔ Network wordpress_mysql_wordpress000net1      Created                                                                                                                              0.3s
 ✔ Volume "wordpress_mysql_wordpress000vol12"    Created                                                                                                                              0.0s
 ✔ Volume "wordpress_mysql_mysql000vol11"        Created                                                                                                                              0.0s
 ✔ Container wordpress_mysql-mysql000ex11-1      Started                                                                                                                              3.8s
 ✔ Container wordpress_mysql-wordpress000ex12-1  Started                                                                                                                              7.2s

# コンテナ・ボリューム・ネットワークが生成された
[root@my-instance wordpress_mysql]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
0f5592c088ab        wordpress           "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        0.0.0.0:8085->80/tcp   wordpress_mysql-wordpress000ex12-1
b633822bb178        mysql:5.7           "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        3306/tcp, 33060/tcp    wordpress_mysql-mysql000ex11-1
[root@my-instance wordpress_mysql]# docker volume ls  | grep wordpress
local               wordpress_mysql_mysql000vol11
local               wordpress_mysql_wordpress000vol12
[root@my-instance wordpress_mysql]# docker network  ls | grep wordpress
e131efea5fe7        wordpress_mysql_wordpress000net1   bridge              local


# 疎通もOK
[root@my-instance wordpress_mysql]# curl localhost:8085 -v
* About to connect() to localhost port 8085 (#0)
*   Trying ::1...
* Connected to localhost (::1) port 8085 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:8085
> Accept: */*
>
< HTTP/1.1 302 Found
< Date: Sun, 27 Oct 2024 07:02:29 GMT
< Server: Apache/2.4.62 (Debian)
< X-Powered-By: PHP/8.2.24
< Expires: Wed, 11 Jan 1984 05:00:00 GMT
< Cache-Control: no-cache, must-revalidate, max-age=0
< X-Redirect-By: WordPress
< Location: http://localhost:8085/wp-admin/install.php
< Content-Length: 0
< Content-Type: text/html; charset=UTF-8
<
* Connection #0 to host localhost left intact

# docker-composeで削除。
[root@my-instance wordpress_mysql]# docker-compose -f docker-compose.yml down
WARN[0000] /root/docker_compose_practice/wordpress_mysql/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 3/3
 ✔ Container wordpress_mysql-wordpress000ex12-1  Removed                                                                                                                              3.7s
 ✔ Container wordpress_mysql-mysql000ex11-1      Removed                                                                                                                              3.4s
 ✔ Network wordpress_mysql_wordpress000net1      Removed                                                                                                                              0.2s

# コンテナのネットワークは消えるが、ボリュームは残る。
[root@my-instance wordpress_mysql]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@my-instance wordpress_mysql]#
[root@my-instance wordpress_mysql]# docker volume ls  | grep wordpress
local               wordpress_mysql_mysql000vol11
local               wordpress_mysql_wordpress000vol12
[root@my-instance wordpress_mysql]# docker network  ls | grep wordpress