dockerメモ

# 勉強会用資料
https://github.com/kichiram/study/blob/main/2021/contents/README.md

# boto3を使えばプログラムから情報を取れる
python3がいる

```test.py
import boto3

ec2 = boto3.client('ec2',
        aws_access_key_id='XXXXXXX',
        aws_secret_access_key='XXXXXXX' ,
        region_name='ap-northeast-1'
)
responce = ec2.describe_instances(
  Filters=[{'Name':'network-interface.addresses.private-ip-address','Values':["172.31.13.240"]}]
)

print(responce)
```

```
python test.py
```

```
$ cat .bashrc
~~~~~~~~~
alias python="python3"
alias pip="pip3"
```

# テンプレートが長くなった場合
ネスト機能を使えば分割できるらしい

# awscliの初期設定
適当にやったのでやり方をまとめておく。

# cloudformationテンプレート公式サンプル

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/sample-templates-services-us-west-2.html
https://github.com/watatahiki/aws/tree/master/CloudFormation-Templates
# cloudwatch（CPU使用率監視）手動設定
https://engineers.weddingpark.co.jp/aws-cloudwatch-slack/

負荷ツールstress
https://www.ooooouchi.info/entry/2020/06/05/080000
https://go-journey.club/archives/6782

```
sudo yum install stress -y
```

- CPU1コアに対して3分間負荷を掛けます。
```
stress --cpu 1 --timeout 3m
top
```

- メモリ負荷を掛けたい.3分間負荷
４つのプロセスで,400MB使う
```
stress --vm 4 --vm-bytes 0.1G --timeout 3m
```

- ディスクに負荷を掛けたい.2分間負荷
1プロセスがディスクに対して1GBの書き込みを2分間行なって負荷を掛けます。
```
 stress --hdd 1 --hdd-bytes 1G --timeout 2m
```

# cloudwatch（Cloudformation)
https://engineers.weddingpark.co.jp/aws-cloudformation-cloudwatch-alarm/
https://github.com/watatahiki/aws/blob/master/CloudFormation-Templates/CloudWatch/CloudWatch-Alarm/CloudWatch-Alarm.yaml

# cloudformationのコード生成ツール
認証がいるのでつかってない
https://dev.classmethod.jp/articles/former2/

# dockerなしバージョンのcloudformationも作ってみよう
これはやめよう。やるとしたらansibleと連携


# slack通知chabot
https://blog.serverworks.co.jp/2021/12/27/210000
https://dev.classmethod.jp/articles/aws-chatbot-notification-cloudformation-stack-event/
cloudformation-use-sns-topic
cloudformation-notify-role

以下の設定をした。slackとの接続を全部やってくれる
事前準備：slackで部屋を作って起動していること
- sns
- chabot

ガードレールのポリシーはとりあえずこれ
arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess

cloudformationの中に書く通知する設定がわからない
コマンドラインからNotificationARNsを設定してスタック作成する方法はあるみたい

https://dev.classmethod.jp/articles/aws-chatbot-notification-cloudformation-stack-event/#toc-11

サンプル
```
aws cloudformation deploy \
    --template-file datastore.yml \
    --stack-name DataStoreStack \
    --notification-arns arn:aws:sns:ap-northeast-1:1234567890:cloudformation-use-sns-topic 
```

ためしてみるか
```
cd  ~/aws-study

aws cloudformation deploy \
    --template-file vpc-03_cloudfomation_ansible.yml \
    --stack-name test01 \
    --notification-arns arn:aws:sns:ap-northeast-1:1234567890:cloudformation-use-sns-topic \
    --capabilities CAPABILITY_NAMED_IAM

# 出力結果
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - test01
```
1234567890はなんでもいいのか？
自分のアカウントIDだった１２桁のやつのやつ。UIから見れます。画面右上のアカウントクリック

`--capabilities CAPABILITY_NAMED_IAM` はおそらく、UIでスタック作成するときの最後につけているチェックになると思われる

今更だが、UIで作成指示するよりめちゃくちゃ楽だった
削除はログ消さないと失敗するので、UIから行う

ディメンション Dimensions
https://dev.classmethod.jp/articles/amazon-cloudwatch-keywords/

## ansible
https://github.com/moritoki-study/prometheus-playbook
https://github.com/moritoki-study/prometheus-playbook-cloudformation
https://log.noid11.com/posts/how-to-ping-ec2-from-mac-using-ansible/
https://rurukblog.com/post/ansible-playbook-write/
https://qiita.com/ArimaRyunosuke/items/1f9d840311584d8160bc
https://densan-hoshigumi.com/server/playbook-maintainability
https://qiita.com/makaaso-tech/items/0375081c1600b312e8b0

https://github.com/ot-nemoto/amazon-ec2-by-ssm-association/tree/4304cb468eda72d993fc77cf656dd0797ee5f3a6
https://github.com/ot-nemoto/ansible-nginx

これが実際にcloudformationと連携しているansibleのサンプル

https://github.com/search?q=AnsibleAssociation&type=code

gitのファイル、ディレクトリかも、多いとcloudformationの制限にひっかかる。なので不要なものは削除する必要がある。
もしくはzipにしておく必要がある。zipはまだ試してない

課題：ansibleがエラーになってもログをみないとわからない。通知が欲しい。

- macセットアップ

```
# 前提：awscliの設定して、接続できる状態
brew install ansible
ansible --version
brew install ansible-lint
mkdir ~/ansible

```

- ec2作成、cloudformation
- port解放、cloudformation
- 実行コマンド

```
[12:51:16  ~/prometheus-playbook ]$ ansible-playbook -i host_vars/prod.yml site.yml
[13:44:47  ~/prometheus-playbook ]$ ansible-lint site.yml
```
- prometheus

```
sudo mkdir /etc/prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.30.3/prometheus-2.30.3.linux-amd64.tar.gz
sudo mv ~/prometheus-2.30.3.linux-amd64/* /etc/prometheus


# daemon（常駐プロセス）
$ sudo vi /usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus - Monitoring system and time series database
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target

[Service]
Type=simple
ExecStart=/etc/prometheus/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/etc/prometheus/data

[Install]
WantedBy=multi-user.target

$ sudo systemctl enable prometheus.service

# 最後に、アラートルールと、prometheus.yaml配置


# プロセス起動
 sudo systemctl start prometheus.service
http://<ホスト名>:9090
```

3.2. prometheus exporter


3.3. alertmanager


3.4. grafana


4. golang
4.3. 検証用HTTP Serverのセットアップ
prometheusの設定
6. alertmanagerの設定
```

```

# やったこと

|     項目              |     |     | 
| ----------------- | --- | --- | 
| vpc               | ○  |     | 
| ec2               | ○  |   オートスケールやってみたい  | 
| elb               |     |     | 
| ecs               |     |     | 
| lamda             |     |     | 
| cloudwatch        |     |     | 
| cloudtrail        |     |     | 
| s3                |     |     | 
| rds               |     |     | 
| iam               | ○  |     | 
| code４兄弟        | ○  |     | 
| elastic beanstalk |     |     | 
| opsworks          |     |     | 
| cloudformation    | ○  |     |  

# iamで公開鍵設定したい
https://sig9.hatenablog.com/entry/2020/05/05/000000
勉強会では自分のアカウントでやってもらおう。
デフォルトではiamユーザを作れば自動でEC２にアカウントが作成されるわけではないようだ。

# clooudformationの構築後の変更方法
構築後、ec2を手動で追加した場合など、その変更をtempateに取り込む方法があるようだ

# qiitaをvscodeでアップデート
https://qiita.com/inayuky/items/48af9fb0b4280869cc8f
https://qiita.com/sakano/items/685b6a15dd600ccd34bd
`cmd+q cmd+u`

tab問題
https://qiita.com/akumachan/items/ec32d9cdf4a07dc6cc68

# terraform
teraformで作ったプログラムがなんでもawsで使えるのかと思ったらそうではない。terraformでaws用で作らなければならない。１つの言語で各プラットフォーム向けのプログラムが作れるだけ。

# 　コンテナからグローバルIPにアクセスできるのか？
できない。なぜだろう？？？？

# 状況まとめ
## 今できていること
- aws環境にデプロイするcloudformationのテンプレート。インスタンス作成（１台）、各種カスタマイズ（ホスト名設定、IP設定、ロケール設定、dockerインストール、docker-composeインストール）。監視サーバの設定、起動まで一発でできる
- dockerイメージ作成をパイプラインでおこなっている。ECRに登録

## やらなければいけないこと
- 監視設定の理解
- slack通知
- 本ドキュメントの整理

### アラートの公式
https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/

### アラートルールの解説がいい感じ
https://www.techscore.com/blog/2017/12/07/prometheus-monitoring-setting/
https://qiita.com/noexpect/items/5faab079fbf700ae7eb3

### if
alertmanagerでアラートのメッセージを組み立てる

```
title: '{{ if eq .Status "firing" }}[FIRING]{{else}}[RESOLVED]{{end}} {{ .GroupLabels.alertname }}'
上記のメッセージを見やすくすると
title: '{{ if eq .Status "firing" }}  # .Statusはprometheusから送られてくる値
          [FIRING]
        {{else}}
          [RESOLVED]
        {{end}} 
        {{ .GroupLabels.alertname }}'  
        # タイトルには[FIRING]or[RESOLVED]のあとにアラート名がつく

text: '{{ if eq .Status "firing" }}{{ .CommonAnnotations.firing_text }}{{else}}{{ .CommonAnnotations.resolved_text }}{{end}}
上記のメッセージを見やすくすると
text: '{{ if eq .Status "firing" }}
         {{ .CommonAnnotations.firing_text }} # firing_textはpromeheusのアラートルールのannotationsで定義したプロパティ
       {{else}}
         {{ .CommonAnnotations.resolved_text }}　# resolved_textはpromeheusのアラートルールのannotationsで定義したプロパティ
       {{end}}
　　　　# 本文にはannotationsで定義したメッセージがセットされる。
       # prometheusからのデータを参照するときは、.CommonAnnotations.プロパティ名だということがわかる
```

#### 聞くこと
- {{}}の記法、yamlの中のifはbash?
- yaml内の各項目を調べるマニュアルは？
- httpserverの監視の意味
- アラートは全部自分でyamlに書いて定義するしかないのか？画面から監視設定を入れるようなことはできないのか？
- １からアラートルールを作っていると何をつくっていいかわからない、おまかせでまとめて導入するサンプルみたいなものあるのか？

#### アラートルールはテストがあるようだ

https://qiita.com/tkusumi/items/7dc8aa2c2cfb8c742146

#### yamlの構造をみたいとき

https://qiita.com/t_o_d/items/bd58fb798c5087f0ef1a

## 将来的にやりたいこと
- 複数台インスタンス３、４台に機能を分割。複数台、コンテナ起動、ネットワークが別れるので難しくなる。いやグローバルIPがあれば、そんなことしなくてもいい？

https://knowledge.sakura.ad.jp/4786/

https://qiita.com/ttsubo/items/1257fe914744d00b4ed8

- S3 にログを記録
- 各種カスタマイズの部分をansibleで実行する。s3かgithubにplaybookを置くだけで実行できるぽい。cloud-initで実施するのはあまりよくないらしい。処理を分けたい
- awsの監視方法、cloudwatch、ログ監視、http監視
- cloudformationで作成するサーバに自動停止ルールに適応cloudwatch
- awsコマンドでスタック作成

## 身についている技術
- docker
- docker-compose
- dockerイメージ作成、aws codebuild
- prometheus/garafa/alertmanager
- cloudformaiton、vscodeで開発

## UI
新しいインスタンスを使うときに、DNS名を一括置換しよう
### プロメテウスサーバ
- prometheusUI
http://ec2-52-198-61-142.ap-northeast-1.compute.amazonaws.com:9090
- node-exporter
http://ec2-52-198-61-142.ap-northeast-1.compute.amazonaws.com:9100/metrics
- grafana
http://ec2-52-198-61-142.ap-northeast-1.compute.amazonaws.com:3000
ぱすわーどadmin/admin
- alertmanager
http://ec2-52-198-61-142.ap-northeast-1.compute.amazonaws.com:9093
- blackbox_exporter
http://ec2-52-198-61-142.ap-northeast-1.compute.amazonaws.com:9115/ 
http://ec2-52-198-61-142.ap-northeast-1.compute.amazonaws.com:9115/metrics

### test_httpserverサーバ
- node-exporter
http://ec2-13-231-244-236.ap-northeast-1.compute.amazonaws.com:9100/metrics

- grok_exporter用
http://ec2-13-231-244-236.ap-northeast-1.compute.amazonaws.com:9144/metrics

- test_httpserver用
http://ec2-13-231-244-236.ap-northeast-1.compute.amazonaws.com:8080/hello
http://ec2-13-231-244-236.ap-northeast-1.compute.amazonaws.com:8080/world
http://ec2-13-231-244-236.ap-northeast-1.compute.amazonaws.com:8081/metrics


```
sudo systemctl status prometheus.service
sudo systemctl stop prometheus.service
sudo systemctl start prometheus.service

sudo systemctl status test_httpserver.service
sudo systemctl stop test_httpserver.service
sudo systemctl start test_httpserver.service

sudo systemctl status blackbox_exporter.service
sudo systemctl stop blackbox_exporter.service
sudo systemctl start blackbox_exporter.service

sudo systemctl status grok_exporter.service
sudo systemctl stop grok_exporter.service
sudo systemctl start grok_exporter.service
```


# slackwebhook

https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008

使ってないと無効になるらしい。このメッセージ出たら再発行してみよう
有効にするボタンとかないだろうか
`alertmanager         | level=error ts=2022-02-13T07:05:53.806Z caller=dispatch.go:354 component=dispatcher msg="Notify for alerts failed" num_alerts=1 err="slack/slack[0]: notify retry canceled due to unrecoverable error after 1 attempts: channel \"#notice\": unexpected status code 403: invalid_token"
a`

追記、こっちをためしている
https://dev.classmethod.jp/articles/slack-incoming-webhook-by-slack-app/

この画面かもしれない、無効化どうかを確認
slackの画面で、設定と管理、APPの管理、画面右上のビルドをクリック、表示された画面のしたの方にexpireの文字あり
app名はalertmanager

# ssh
```
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ec2-user@ec2-13-112-250-110.ap-northeast-1.compute.amazonaws.com

```

# parametaerから取得してる例
https://github.com/danno-rose/eks-selinux-imagebuild/blob/7d2ba9e4c29ac3abab07a48fa0a30248e9113ad1/ssm_document/eks-custom-ami-selinux.yaml#L84

https://github.com/aws-samples/simple-smart-mirror/blob/c293a74a21656193e7bbff3b9ee10c71b1d799ef/cloudformation-templates/CodeDeployAssociation.yaml#L28

 Parameters:
        commands: 
          - !Sub |


## cloud-initは古いらしい。（OSの初期セットアップをしてくれる機能）

https://aws.amazon.com/jp/blogs/news/using-state-manager-over-cfn-init-in-cloudformation-and-its-benefits/

https://github.com/aws-samples/aws-systems-manager-cloudformation-samples/blob/main/cloudformation-samples/BashScriptAssociation.yaml

# いいかも

https://www.softek.co.jp/SID/blog/archive/entry/20210629.html

https://aws.amazon.com/jp/about-aws/whats-new/2020/03/execute-chef-recipes-with-aws-systems-manager/

# 構成図（デザイナで出力）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/f7a19736-d3de-55b1-3962-9d8ee2d05cbf.png)


# 使っているリージョン
ap-northeast-1
外国のどこかだとずっと思っていたが、これは東京

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html

# 導入資料？

https://d1.awsstatic.com/webinars/jp/pdf/services/20200826_AWS-BlackBelt_AWS-CloudFormation.pdf

# アベイラビリティゾーン
https://blog.serverworks.co.jp/tokyo-region-ec2-instance-type-details-20210512

おそらく４つの指定がある。2つのゾーンつかうときは、1aと1c使っておけばよいだろう

- ap-northeast-1a
- ap-northeast-1b  1aと1bは同じっぽい
- ap-northeast-1c
- ap-northeast-1d

```
AvailabilityZone: "ap-northeast-1a"
AvailabilityZone: "ap-northeast-1c"
```

# 組み込み関数

https://qiita.com/ctakenabe/items/7e7aad12ef50408f45f5

`W3010 Don't hardcode ap-northeast-1a for AvailabilityZones` 対策

https://qiita.com/namoshika/items/528d8a50f399b998b14b

# metadata

https://zenn.dev/ano/articles/c5eedcc31b30e2

# そういえばsudoパスワードいつきめた？
デフォルトはないらしい

# ホスト名セット

https://dev.classmethod.jp/articles/cloudformation-ec2-build/

https://qiita.com/yaseinoa/items/54dcd2b7da25f2519912

https://dev.classmethod.jp/articles/using-variables-in-ec2-user-data-in-cloudformation/

## userdata実行ログ
サーバに入って

```
sudo cat /var/log/cloud-init-output.log
sudo less -N /var/log/cloud-init-output.log
```

https://qiita.com/yoshii0110/items/da169f3ed0818f977e9f

# 起動テンプレート
https://dev.classmethod.jp/articles/using-variables-in-ec2-user-data-in-cloudformation/

https://www.robario.com/2017/03/14

# シングルAZとマルチAZの違いは？
https://www.rworks.jp/cloud/aws/aws-column/aws-entry/22067/

# 良さげサンプル
https://qiita.com/okubot55/items/b18a5dd5166f1ec2696c

- マルチでやってみよう。webサーバを２つにするだけ
- 最初はシングル

# templateのローカルチェック
```
[14:22:15  ~/aws-study ]$  aws cloudformation validate-template --template-body file://test.yaml

An error occurred (ValidationError) when calling the ValidateTemplate operation: Template format error: YAML not well-formed. (line 2, column 25)
```

# vscode
https://qiita.com/Kouichi_Itagaki/items/31d640d708925c0ae838
https://qiita.com/kojiro_ueda/items/15cd7cc2535fac61fcdd

# 便利ツールらしい
https://search.yahoo.co.jp/search?p=qiita+aws+cloudformation&fr=top_ga1_sa&ei=UTF-8&ts=7856&aq=-1&oq=&at=&ai=d99f56fb-226e-4ccd-9829-857993f37e25

# aws図でを書くツール
https://qiita.com/nave-m/items/68425f476b254a1a47b0

# cloudformation
https://qiita.com/tyoshitake/items/c5176c0ef4de8d7cf5d8
https://dev.classmethod.jp/articles/cloudformation-beginner01/
https://go-journey.club/archives/15974

## デザイナ
使わない方がいい。
https://go-journey.club/archives/14087
https://dev.classmethod.jp/articles/cloudformation-knowhow/

## aws toolkit
結局使ってない
https://qiita.com/toshihirock/items/d37ee8a41a11f2c4ffb2

# nginxテスト
https://github.com/moritoki-study/nginx-test

# IP置換

```
sudo vim /data/docker/containers/prometheus/etc/prometheus/prometheus.yml
%s/172.31.13.240/3.112.52.64/g
%s/3.112.52.64/172.31.13.240/g
docker-compose　up
```

# image作成を自動化できるか？
リポジトリはpublicで作ること。privateで作ると利用するときに認証がいる

https://dev.classmethod.jp/articles/20170225-codebuild-docker/

https://blog.tawa.me/entry/push-docker-image-to-ecr-by-codebuild

https://toris.io/2015/12/run-automated-deployment-by-git-push-with-ecs-deploy-script/

https://qiita.com/OPySPGcLYpJE0Tc/items/3de717537c2ca7ede331

https://github.com/moritoki-study/test_httpserver_image


https://qiita.com/yamato1491038/items/b3ea11de7ad01a3cbd73

- AmazonElasticContainerRegistryPublicFullAccess

## 公式手順
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-docker.html

##　 image作成パイプライン
https://github.com/moritoki-study/test_httpserver_image

```
docker pull public.ecr.aws/l8s6z2n6/test_httpserver:latest
```

# codeデプロイからデプロイできるかな
https://qiita.com/tatsuya___/items/cf81a11fdb7e54bb3890
https://qiita.com/MasayaMizuhara/items/12d1f3810601f6f07e5f
後者を使った気がする。dockerだからこれではない気がする。
今はcloudinitの最後の処理でtar xvfでデータを展開している

# 構築環境
```
cd ~/
git clone https://github.com/moritoki-study/prometheus_setup.git
cd ~/prometheus_setup;sudo chown -R root:root data;sudo tar cvfz data.tar.gz data;sudo tar xfvz data.tar.gz -C /

# ルート直下に展開、。/data/....
# sudo tar xfvz data.tar.gz -C /
```


# 見やすい
https://qiita.com/Esfahan/items/0feaedfd771f49ac7ee4 


## UI使い方
https://tech-lab.sios.jp/archives/13294#i-2
https://christina04.hatenablog.com/entry/prometheus-node-exporter
Prometheus では監視データを取得することを “scrape” と呼んでいます。
設定してもスタックを再作成すると消える

# docker-compose
- 実施したことがないので試してみる
- 勉強用資料では、yum等をつかってpromethusをセットアップしている。
- 以下の資料をもとにprometheusをdockerで動かしてみることにする。

http://sheepdogjam.cocolog-nifty.com/blog/2021/08/post-bea05a.html
http://sheepdogjam.cocolog-nifty.com/blog/2021/08/post-48c0e6.html
http://sheepdogjam.cocolog-nifty.com/blog/2021/08/post-e6a62e.html
http://sheepdogjam.cocolog-nifty.com/blog/2021/08/post-d18395.html

## prometheus等のDockerイメージがある
prometheus社？が作っているので安心
- prom/prometheus
https://hub.docker.com/search?q=prom%2Fprometheus&type=image
監視サーバ
- prom/node-exporter　（snode)
https://hub.docker.com/search?q=prom%2Fnode-exporter&type=image
リソース監視
- prom/blackbox （snode)
https://hub.docker.com/search?q=prom%2Fblackbox&type=image
http/https/TCPなどの死活監視を実現できます。基本的には監視サーバ（prometheusがインストールされているサーバ）にインストールして利用します。
- grok_exporter （snode)
公式イメージはないっぽい
https://hub.docker.com/search?q=grok_exporte&type=image
https://hub.docker.com/r/dalongrong/grok-exporter　
ログ監視
- grafana/grafana
https://hub.docker.com/search?q=grafana%2Fgrafana&type=image
メトリックスを可視化するツール
- prom/alertmanager 
https://hub.docker.com/search?q=prom%2Falertmanager&type=image
監視サーバと連携して、アラートをユーザに通知するツール

- httpテストサーバ
自作した
https://github.com/moritoki-study/test_httpserver_image

## プロメテウスが正常なときのログ
```
prometheus    | level=info ts=2022-01-31T11:13:59.238Z caller=main.go:796 msg="Server is ready to receive web requests."
```


## 疎通確認
```
# ec2
nc -vz localhost 9090
# local
nc -vz ec2-18-183-247-78.ap-northeast-1.compute.amazonaws.com 8000
```
## コマンド類

```
# yaml作成
vi docker-compose.yml

# 起動
docker-compose up
# バックグラウンドで起動
docker-compose up -d

# 停止
docker-compose down
```

# 起動したコンテナに入る
```
# sudo docker exec -it コンテナ名 /bin/sh
sudo docker exec -it prometheus /bin/sh
sudo docker exec -it node-exporter /bin/sh
sudo docker exec -it blackbox_exporter /bin/sh
sudo docker exec -it grok_exporter /bin/sh
sudo docker exec -it grafana /bin/sh
sudo docker exec -it alertmanager /bin/sh
sudo docker exec -it test_httpserver /bin/sh

tail -f /var/log/httpd/test_httpserver.log 

# sudo docker exec -it コンテナ名 ps -ef
sudo docker exec -it prometheus ps -ef
```

## 設定ファイルディレクトリ
```
# prometheus
sudo mkdir -p /data/docker/containers/prometheus/etc/prometheus/alerting_rules
sudo mkdir -p /data/docker/containers/prometheus/data

# node-exporter
いらない？

# blackbox_exporter
sudo mkdir -p /data/docker/containers/blackbox_exporter/data

# grok_exporter
sudo mkdir -p /data/docker/containers/grok_exporter/data

# grafana
sudo mkdir -p /data/docker/containers/grafana/data

# alertmanager
sudo mkdir -p /data/docker/containers/alertmanager/etc/alertmanager
```

## 設定ファイル
初期構築でgitからデータを取得して設置するようにした。
```
# promethus
sudo vim /data/docker/containers/prometheus/etc/prometheus/prometheus.yml 
sudo vim /data/docker/containers/prometheus/etc/prometheus/node.yaml # 今回つくらない
sudo vim /data/docker/containers/prometheus/etc/prometheus/alerting_rules/alert_sample.yml

sudo vim /data/docker/containers/prometheus/etc/prometheus/alerting_rules/blackbox.yml
sudo vim /data/docker/containers/prometheus/etc/prometheus/alerting_rules/node_monitoring.yml
sudo vim /data/docker/containers/prometheus/etc/prometheus/alerting_rules/test_httpserver_log.yml
sudo vim /data/docker/containers/prometheus/etc/prometheus/alerting_rules/test_httpserver_request.yml


# alertmanager
sudo vim /data/docker/containers/alertmanager/etc/alertmanager/config.yml 

# Blackbox Exporter
sudo vim /data/docker/containers/blackbox_exporter/config.yml 

# grok_exporter
sudo vim /data/docker/containers/grok_exporter/config.yml 
sudo vim /data/docker/containers/grok_exporter/examples.log

# grafana
sudo vim /data/docker/containers/grafana/grafana.env 
```

## test_httpserver.goメモ
```
[ec2-user@ip-172-31-13-240 ~]$ wget https://raw.githubusercontent.com/kichiram/golang/main/testgo/test_httpserver.go
2022-02-05 02:04:23 (57.4 MB/s) - `test_httpserver.go' へ保存完了 [1328/1328]

[ec2-user@ip-172-31-13-240 ~]$ ls
bk  docker  docker-compose.yml  test_httpserver.go
[ec2-user@ip-172-31-13-240 ~]$ go get github.com/prometheus/client_golang/prometheus
[ec2-user@ip-172-31-13-240 ~]$ ls
bk  docker  docker-compose.yml  go  test_httpserver.go
[ec2-user@ip-172-31-13-240 ~]$ go build test_httpserver.go
[ec2-user@ip-172-31-13-240 ~]$ ls
bk  docker  docker-compose.yml  go  test_httpserver  test_httpserver.go
[ec2-user@ip-172-31-13-240 ~]$ id
uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user),4(adm),10(wheel),190(systemd-journal),992(docker)
[ec2-user@ip-172-31-13-240 ~]$ pwd
/home/ec2-user
[ec2-user@ip-172-31-13-240 ~]$ ls -l
合計 11860
drwxrwxr-x 3 ec2-user ec2-user       38  2月  2 11:19 bk
drwxrwxr-x 3 ec2-user ec2-user       98  2月  5 01:56 docker
-rw-rw-r-- 1 ec2-user ec2-user     2728  2月  2 11:09 docker-compose.yml
drwxrwxr-x 4 ec2-user ec2-user       28  2月  5 02:04 go
-rwxrwxr-x 1 ec2-user ec2-user 12132496  2月  5 02:05 test_httpserver # これでwebサーバ起動
-rw-rw-r-- 1 ec2-user ec2-user     1328  2月  5 02:04 test_httpserver.go
```

# ここからdocker
# EC2にdocker/docker-composeインストール
```
# docker
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl status docker
sudo systemctl enable docker
sudo usermod -a -G docker ec2-user

# docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version  # これはsudo不要

# docker-composeの２系は導入手順が違うらしいが手順がみつからない　
# https://docs.docker.com/compose/install/#install-compose-on-linux-systems

# 任意
alias d='docker'
alias dc='docker-compose'
```

## Dockerfile作成
```
mkdir ~/docker
vim ~/docker/Dockerfile
vim ~/docker/index.html
```

## index.html
```
hello
```

## docker buildを試す
https://scrapbox.io/llminatoll/docker_run%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D

```
sudo docker image build -t moritoki/sample:latest .
sudo docker image build -t test_httpserver:latest .
```

## イメージ確認
```
sudo docker image ls
```

## 起動中のコンテナに入る
```
docker exec -i -t CONTAINER_ID /bin/bash
docker exec -i -t CONTAINER_ID /bin/sh
```

## イメージの取得とコンテナに入る
```
sudo docker run -it --name test_dock moritoki/sample:latest /bin/bash
sudo docker run -it --name test_grok dalongrong/grok-exporter:latest /bin/bash
sudo docker run -it --name test_httpserver test_httpserver:latest /bin/bash
```


## コンテナ起動とバックグラウンド起動
なぜか10000超えると動かないように思える

```
### うごかん
sudo docker run -d --name test_dock -p 10080:80 moritoki/sample:latest  # 10080がダメなのか？

### コンテナを動かす（入らない）
sudo docker run -d --name test_dock -p 8000:80 tmoritoki0227/sample:latest 
sudo docker run -d --name test_dock -p 80:80 tmoritoki0227/sample:latest

sudo docker run -d --name test_httpserver -p 8080:8080 -p 8081:8081 test_httpserver:latest
```

疎通確認

```
# ec2
nc -vz localhost 8080
# local(Mac)
nc -vz ec2-18-183-171-149.ap-northeast-1.compute.amazonaws.com  8080
nc -vz ec2-13-230-253-219.ap-northeast-1.compute.amazonaws.com  8080

```
ブラウザから
http://ec2-18-183-171-149.ap-northeast-1.compute.amazonaws.com:8080/hello
http://ec2-18-183-171-149.ap-northeast-1.compute.amazonaws.com:8080/world
http://ec2-18-183-171-149.ap-northeast-1.compute.amazonaws.com:8081/metrics

## docker hub upload
https://gray-code.com/blog/container-image-push-for-dockerhub/

https://hub.docker.com/repository/docker/tmoritoki0227/study

https://hub.docker.com/r/tmoritoki0227/study

```
docker login
  Username: 入力汁
  Password:　　入力汁

sudo docker image build -t test_httpserver:latest .
docker image ls
docker tag test_httpserver tmoritoki0227/test_httpserver:latest
docker image ls
docker push tmoritoki0227/test_httpserver:latest
```
tmoritoki0227 はdockerhubのリポジトリ名に合わせないとだめ
https://hub.docker.com/repository/docker/tmoritoki0227/test_httpserver

## コンテナ起動確認
```

sudo docker ps
sudo docker ps -a # 停止中のコンテナも表示
```

## コンテナに入る
```
sudo docker attach CONTAINER ID
```

## コンテナ停止
```
sudo docker container stop
```

## コンテナ削除
```
sudo docker rm [コンテナID]
```

## イメージ削除
```
sudo docker images で
sudo docker rmi イメージID
```

## Dockerコマンドをsudoなしで実行する方法
非推奨らしい

```
## dockerグループがなければ作る
sudo groupadd docker

## 現行ユーザをdockerグループに所属させる
sudo gpasswd -a $USER docker

## dockerデーモンを再起動する (CentOS7の場合)
sudo systemctl restart docker

## exitして再ログインすると反映される。
exit
```


# 参考Doc
https://dev.classmethod.jp/articles/amazon-linux-2-docker-aws-cli-visual-studio-code/

https://dev.classmethod.jp/articles/amazon-linux-docker-image-update/

https://qiita.com/reoring/items/0d1f556064d363f0ccb8

https://docs.docker.jp/compose/install.html#linux

https://kacfg.com/aws-ec2-docker/

https://hub.docker.com/_/amazonlinux

https://qiita.com/y-do/items/e127211b32296d65803a

https://qiita.com/hiyuzawa/items/81490020568417d85e86

https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04

https://www.wakuwakubank.com/posts/270-docker-build-image/

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html

https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae

https://qiita.com/DQNEO/items/da5df074c48b012152ee