Docker備忘録

# はじめに
業務で何となくDockerを使っていますが、諸々理解が浅いと感じたため、勉強したところから整理していきたいと思います。※随時更新中

# コンテナライフサイクル
1. イメージからコンテナ作成
2. 特定の処理するコンテナの起動
3. プロセスを停止するとコンテナも停止
4. コンテナ破棄

①docker pull or docker build 
↓
②docker run 
↓
③docker commit 
↓
④docker stop
↓
⑤docker rm

# 基本コマンド
```
# イメージ一覧表示
$ docker images
➡イメージは「リポジトリ名:タグ」の形式で管理　※タグ省略時はlatestが適用
```
```
# イメージダウンロード
$ docker pull

➡ローカルにイメージを保存
➡docker run時、ローカルになければ自動取得
　ex)docker pull centos:6
```
```
# イメージアップロード
$ docker push
```
```
# コンテナ実行
$ docker run
➡指定したイメージを使ったコンテナを作成
➡コンテナの実行
➡docker run [オプション][イメージ名][コマンド][引数]
　例)docker run ubuntu:14.04 echo "Hello world!"
➡run = pull + create + start
```
```
# コンテナの確認
$ docker ps
➡docker ps -l：直近のコンテナの情報を表示
　docker ps -a：停止中も含めてすべて表示
　docker ps -q：ショートIDのみ表示
```
```
# コンテナにアタッチ
$ docker attach
```
```
# 標準出力の表示
$ docker log
```
```
# コンテナの停止
$ docker stop
```
```
# 詳細情報の表示
$ docker inspect
```
```
# イメージ削除
$ docker rm
```
```
# 差分/履歴の確認
$ docker diff
$ docker history
```
```
# 実行中のコンテナ内でコマンド実行(=実行中のコンテナ内に入る)
$ docker container exec [コンテナ名] bash
➡docker execは、『対象のコンテナで、対象のコマンドを実行する』
　⇒-iは、Keep STDIN open even if not attached
　　標準入力を開き続ける。

　⇒-tは、Allocate a pseudo-TTY
　　疑似ttyを割りあてる。(ターミナルとして起動可能であること)
　
　　標準入力を開き続け、そこを操作出来るようにする。
　　　→手元の環境で、docker内入力ができるようにする
```
```
# コミット（イメージ作成）
$ docker commit [コンテナ名][イメージ名]
```
```
# イメージの作成
$ docker build -t [イメージ名] .
➡カレントディレクトリのDockerfileを元に作成

docker build -t [ECRのURL]:[イメージのバージョンTag] .
```
```
# ecrへのログイン
$ aws ecr get-login-password | docker login --username AWS --password-stdin [URI のうち、スラッシュ(/)より前の部分]
```
```
# dockerデーモン起動
$ service docker start
```
```
# dockerバージョン確認
$ docker version
```
```
# sudoを使わずdockerコマンドを使う方法
$ sudo usermod -aG docker [ユーザ名]
　➡事実上のroot権限を持つためセキュリティには注意
```

# docker install後
```
# 公式のhello-worldテンプレートを実行
$ docker run hello-world
```
```
# CentOS7の最新バージョンのコンテナを実行(対話モード)
$ docker run -it centos:7 bash
```

# コンテナの基本的なコマンド
```
#リポジトリからコンテナを生成して、対話型でコマンドを実行する
docker run -it [-name コンテナ名] リポジトリ名 コマンド

#停止中コンテナを再スタートして、対話型でコマンドを実行する
docker start -i コンテナ名 コマンド

#実行中コンテナ停止する
docker stop コンテナ名

#実行中コンテナ削除する
docker rm コンテナ名
```
```
# イメージからコンテナを起動
$docker run --name some-nginx-naitou -d -p 8080:80 some-content-nginx
⇒　--name コンテナ名
　　-d バックグラウンド実施　表示を見るにはdocker logs コンテナ名
　　例)docker run --name my-nginx -d -p 8080:80 nginx:stable

$docker run --name my-nginx2 -d -p 9080:80 -v `pwd`/html:/usr/share/nginx/html:ro nginx:stable
⇒　-v ローカルディレクトリ:コンテナ内マウント先パス
```
# github
https://hub.docker.com/_/nginx

# コンテナイメージ
- 作り方(3パターン)
    - 既存イメージに対する変更をコミットする
    - Dockerfileから作成する
    - tar形式のファイルからイメージを読み込む

# Dockerfile
- FROM :ベースイメージの指定　例)FROM Ubuntu ※必須
- RUN  :コマンドの実行　　　　例)RUN yum -y install nginx
- CMD  :実行コマンドを指定
- ADD  :ファイル/URL/ZIPからコンテナへ追加
- MAINTAINER  :管理者情報を追記

# ポートの指定
例)docker run -d -p 80:8080 ecsdocker/web
    ➡ホスト側のport8080をコンテナのport80へ

# ECRへのプッシュまでの流れ
①イメージのビルド
②ecrへログイン
③イメージのプッシュ

#ECSの利用
- クラスター
    - コンテナが動作する実行環境を定義
    - クラスターを別に作成することでコンテナ同士の干渉なしで実行できる
- タスク定義
    - コンテナに使用するコンテナイメージやコンテナが使用するCPU・メモリ・ストレージ容量などを指定
- タスク
    - タスク定義に基づいて作成される一つ以上のコンテナの集まりを指す。タスク≒コンテナ(ほぼ同義)
- サービス
    - ALBやAutoScaling Groupに紐付けられたタスク群であり、実行中のタスクを管理するもの  


# Dockerhubへのpushの流れ
```
# タグ付け
$ docker tag [イメージ名]　[Dockerhubアカウント名]/[イメージ名]:latest
➡自分のリポジトリにpushする際は、「ユーザー名/コンテナイメージ名：タグ」の3つを設定する必要がある
例)docker tag firstdocker numlock7777/firstdocker:latest
```
```
#イメージ確認
$ docker image ls
```
```
#ログイン
$ docker login
```
```
#プッシュ
$ docker push [イメージ名]：[タグ名]
　➡docker push numlock7777/firstdocker:latest
```

# docker コマンド新旧比較
https://qiita.com/zembutsu/items/6e1ad18f0d548ce6c266

# dockerコンテナから抜ける方法

- exit 
    - コンテナ自体が終了
- ctrl + P + Q　同時押し
    -  起動させたままコンテナから抜けることができる(= デタッチ)


## 参考
https://www.slideshare.net/zembutsu/introduction-to-docker-management-and-operations-basic

https://qiita.com/zembutsu/items/891c7ffd2c36097400b1

https://www.nic.ad.jp/ja/materials/iw/2018/proceedings/h2/h2-takara-2.pdf

https://qiita.com/minato-naka/items/e1f91e1df2c4fe7411dc

https://blog.serverworks.co.jp/2023/07/12/155121

https://qiita.com/Statham/items/c204e85067ea4dca2724