nul-point

完全に自分用の備忘録です。

ECSをなんとなく理解したい(その2)

docker-composeについての理解

コンテナを(1つでもいいけどね)よしなに管理してくれるものっていう認識
基本的には複数コンテナをまとめるものだと理解してる
で、何を気をつけないといけないのかっていうのはコンテナ間の名前解決の部分

注意事項っぽいやつ

  • Dockerは同一のネットワークに所属してる場合、名前で通信を取ることが可能
  • composeではup時に既存のnetwork指定がない場合,デフォルトでネットワークを作成するため通信が取れる
    • dockerインストール時のデフォルトbridgeでは名前解決してくれない
    • もしくは自分で作成も可能
  • 以前はlinkを使っていたがこちらは非推奨になってるので使わないこと
  • composeもバージョンがあって機能増えたりするので追従する必要はあるっぽい
    • ある程度互換性は考慮されてるみたい
  • docker-composeコマンドはdocker-compose.ymlファイルがあるところで使ったほうがいちいちファイル指定のオプションがいらないので楽だとは思う

awesome-compose/nginx-golang at master · docker/awesome-compose · GitHub

注意事項を踏まえた上で、上記githubのfrontend/nginx.confをみると
proxy_passのbackendとdocker-composeのservice name(services:の下に書いてあるやつ)が
同じになってることがわかる

# networkの確認
docker network ls

# 実際に挙動の確認をしてみる
cd ~
git clone https://github.com/docker/awesome-compose
cd awesome-compose/nginx-golang
docker-compose up -d
curl localhost

# 専用にnetworkが作成されてるか確認
# 確認後、イメージ等削除(dockerでの`--rm`オプションっぽい感じ?)
docker network ls
cd ~/awesome-compose/nginx-golang
docker-compose down

# nginx.confのbackendの部分を適当な文字列に変更後リビルド
# upstreamでホスト名が見つからないためエラーになることを確認
# 確認後 Ctrl+C でキャンセルすること
cd ~/awesome-compose/nginx-golang
docker-compose up --build

# 停止と停止したイメージの削除
docker-compose down

# docker-composeでやってくれてるのは
# dockerコマンド的には以下となる
# まずはいろいろごっそり全部初期化
docker system prune -a

# nerwork作成(network名は適当)
docker network create test

# イメージ作成
cd ~/awesome-compose/nginx-golang/backend
docker build -t nginx-golang_backend:latest .
cd ~/awesome-compose/nginx-golang/frontend
docker build -t nginx-golang_frontend:latest .

# docker-compose.ymlにdepends_onがあるのでbackendから起動
# --nameでの指定部分がdocker-compose.ymlでのsevice nameにあたる
# デフォルトのbridgeネットワークで接続したい場合は非推奨の--linkオプションをつかうと
# frontendのコンテナは起動可能
docker run -d --rm --name backend --network test nginx-golang_backend

# frontendを起動
docker run -d --rm -p 80:80 --name frontend --network test nginx-golang_frontend

# 接続確認
curl localhost

# おそうじ
docker system prune -a

まとめ(みたいなやつ)

Dockerに限ったことではないけども、dockerとdocker-composeのバージョンで
書き方や機能が増えていたりするので、気をつけないといけない
今どき?のものだとfrontとbackendと機能がわかれてることが多いので
dockerでやるよりdocker-composeで管理したほうが何かと楽
ここらへんまではローカルでの検証環境構築にも使うかなと思う

ECSをなんとなく理解したい(その1)

目標

  • dockerのなんとなくの理解
  • docker-composeのなんとなくの理解
  • github actionのなんとなくの理解
  • ECSのなんとなくの理解

Dockerについてなんとなく理解する

環境構築

参考URL

Install Docker Compose | Docker Documentation
Command-line completion | Docker Documentation

Amazon Linux2 latest(最新)
※無料枠のスペックで大丈夫
ECS利用時はちょこちょこお金かかるので注意

必要なミドルや起動等諸々の手順

# EC2にログイン後
# dockerとgitをインストール
sudo yum install -y docker git

# dockerの状態の確認
sudo systemctl status docker

# dockerの起動
sudo systemctl start docker

# dockerの状態の確認
sudo systemctl status docker

# dockerの自動起動有効
sudo systemctl enable docker

# ec2-userでdockerをいぢれるように
# dockerグループにec2-userを所属
sudo gpasswd -a ec2-user docker

# docker-composeコマンドのインストール
# 及び実行権限の付与
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# dockerコマンド及びdocker-composeコマンドの
# completionのインストール

sudo curl -L https://raw.githubusercontent.com/docker/cli/master/contrib/completion/bash/docker -o /etc/bash_completion.d/docker
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.26.2/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

上記実施後、Logoutし再度ログインを実施
そうしないとdockerコマンドをec2-userで使えない

# dockerグループに所属してるか確認
id

# dockerコマンドが使えるか確認
# tabキーを押してコマンドが補完されるかもあわせて確認しておく
docker ps

チュートリアル

Dockerイメージの理解を目指すチュートリアル - Qiita

ぶっちゃけ前佛さんの上記チュートリアルを実践するのがよいと思う

まとめ(みたいなもの)

Dockerがどういうものなのかについては上記チュートリアル内に記載があるように

Dockerコンテナの実行とは、特別な状態でのプロセスの実行

と考えるのがよいと思う 賛否はあるかとおもうが、感覚的にはパッケージ管理(yum,apt,app,dnf...etc)に近い
docker hub等のリポジトリがあり、そこからインストールして使う、みたいな
少し違うとすると、実行時にもdockerが担ってるところか
それとあくまでも特殊加工なプロセスなのでVMのような使い方はしないほうがいいよね
っていうのは同意
なので1コンテナ1プロセスとするのが基本的にはよいと思う

2015年頃のWeb開発者がやりがちだった、DockerをVMと同じように使うのは便利だけど辞めたほうが良いという話 - inductor's blog

参考

基本的な部分だけであればチートシートはとてもありがたい
ベストプラクティスやADDやCOPYの違い、CMDとENTRYPOINTの違いについてもおさえておく

Dockerfile を書くためのベストプラクティス解説編
Dockerfileチートシートv19.03 - Qiita
ENTRYPOINTは「必ず実行」、CMDは「(デフォルトの)引数」 | Pocketstudio.Net

systemctlコマンドがtimeoutになって使用できないときのTips

事象(一例)

他オプション等でもTimeoutになったときには有効

# systemctl list-unit-files
Failed to list unit files: Connection timed out

参考URL

https://gryzli.info/2016/06/18/systemd-systemctl-list-unit-files-timeouts/

Script

#!/bin/bash

find /run/systemd/system -mindepth 1 -maxdepth 1 -mtime +1 -type f -name 'run-*' \
| perl -p -e 's#^/run/systemd/system/run-(\d+).+$#$1#g' \
| sort -u \
| while read line
do
ps -o pid= -o comm= $line \
| grep -q $line \
|| rm -rf /run/systemd/system/run-$line.*
done

S3のバケットごとの容量をざっくりと知りたい

CloudwatchのBucketSizeBytes相当の情報を取得できる
全リージョンまるっと取得できるので便利だと思う

空っぽのバケットは情報として取得できないので
別の方法で取得する必要があることに留意
aws s3 ls でリスト出してdiffるとかすれば空っぽのやつわかる

  • 管理画面からマイ請求ダッシュボードを選択
  • 左の選択欄より「Cost & Usage Reports」を選択
  • その他のレポートより「AWS使用状況レポート1」を選択
    • フォームに以下を選択

サービス: Amazon Simple Storage Service
使用タイプ: すべての使用タイプ
オペレーション: StandardStorage
期間: カスタムの日付範囲
開始日: カスタム選択期間にて現在日付より2、3日前を選択
終了日: 開始日と同日
レポート詳細度: 日単位

  • レポートのダウンロード(CSV)をクリック

取得したCSVファイルをエクセルか、スプレッドシートで開く
以下はスプレッドシートでの説明
※エクセルでも同一の関数で可能だと思うけど未確認

  • CSVスプレッドシートとして開く
  • フィルタをONにする
  • Usage TypeをTimedStorage-ByteHrsで絞って対象を選択する
  • UsageValueをZ -> Aで並び替える(任意)
  • G列の数字をまず242で割る
    • ※列の番号は人によって違うので適宜置き換えること
=G2/24
  • byte表示なので適当に変換する
=IF(H2>=1000000000000, ROUNDUP(H2/1000000000000,2)&"TB",
IF(H2>=1000000000, ROUNDUP(H2/1000000000,2)&"GB",
IF(H2>=1000000, ROUNDUP(H2/1000000,2)&"MB",
IF(H2>=1000, ROUNDUP(H2/1000,2)&"KB",H3&"B"))))

多少の誤差はあるけどざっくり容量を知るには十分だと思う

MacのBashをかっこよくする

対象者

細かいカスタマイズとかは考えないで
とりあえずPowerlineを使ってみたい

元ネタ

https://techracho.bpsinc.jp/hachi8833/2017_12_06/49188

Requirement

Powerlineは対応してないFontを利用すると文字が豆腐になってしまったりと
問題があるので対応するFontのインストールが必要
今回はFiraCodeをインストールする

Homebrewのインストール

インストール済みなら当然スキップ

Homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

FiraCodeのインストール

リガチャ(合字)にも対応してるプログラム向きのフォント
好みではない場合は次に紹介しているpowerline/fontを使えばいいと思う

FiraCode

brew tap caskroom/fonts
brew cask install font-fira-code

powerline/font

powerline公式?のフォント

powerline/font

# clone
git clone https://github.com/powerline/fonts.git --depth=1
# install
cd fonts
./install.sh
# clean-up a bit
cd ..
rm -rf fonts

powerline-goのインストール

といってもGolang製でReleaseがあるので
ここからバイナリをダウンロードするだけ
Pathが通ってるところにおいたほうが楽だと思うので、
/usr/local/bin以下に配置する

2018/09/17時点での最新は1.11.0

 curl -sL -o /usr/local/bin/powerline-go https://github.com/justjanne/powerline-go/releases/download/v1.11.0/powerline-go-darwin-amd64

実行権限の付与

chmod 755 /usr/local/bin/powerline-go

.bashrcに設定を記述

cat <<'_EOF_' >> ~/.bashrc
# setting powerline-go .bashrc
function _update_ps1() {
    PS1="$(powerline-go -error $?)"
}

if [ "$TERM" != "linux" ]; then
    PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND"
fi
_EOF_

ターミナルにてFontを変更する

自分が使っているターミナルに依存するので各自で変更してください

ターミナルの再読込

Command + T とかで再読込すれば反映される

yumで特定のレポジトリのみを簡単に有効にする

普段から複数のレポジトリが有効になっているけど 今回だけは特定のレポジトリだけ見たいとかそういうときに使えそう

下記の例はiusレポジトリでインストールされていないパッケージの一覧を出力するもの

yum --disablerepo=* --enablerepo=ius list available