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るとかすれば空っぽのやつわかる
サービス: 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のインストール
インストール済みなら当然スキップ
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
FiraCodeのインストール
リガチャ(合字)にも対応してるプログラム向きのフォント
好みではない場合は次に紹介しているpowerline/fontを使えばいいと思う
brew tap caskroom/fonts brew cask install font-fira-code
powerline/font
powerline公式?のフォント
# 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 とかで再読込すれば反映される
findとxargsでスペースとか入ったファイルの一覧つくる
ポイントはfinrdのprint0とxargsの-0とlsの-1オプション
って全部ポイントだな・・・
$ find . -type f -mtime -10 -print0 |xargs -0 ls -1 ./f_perl/9.6.3.pl ./f_perl/9.6.3.txt ./.viminfo
yumで特定のレポジトリのみを簡単に有効にする
普段から複数のレポジトリが有効になっているけど 今回だけは特定のレポジトリだけ見たいとかそういうときに使えそう
下記の例はiusレポジトリでインストールされていないパッケージの一覧を出力するもの
yum --disablerepo=* --enablerepo=ius list available