dockerのノート


# はじめ

## dockerのノート

コンテナの学習やっていく

<https://docs.docker.com/docker-for-mac/apple-m1/>

M1 Macの場合はこちらの記事を参考に
Rosettaとやらをインストールしてdocker を利用する。

``` zsh
softwareupdate --install-rosetta

```

M1 Macで通らなかった動作しなかったコマンドについては
動かなかった旨を残しておきますが、どうやらnginx程度はちゃんと動く模様。


## あると便利なコマンド

watch コマンド
brew install watch でインストールできる。
コマンドの実行結果を常に監視したい時に便利

``` zsh
watch -t "docker ps"
```

## 実行環境

M1 MacBook macOS Big Sur version 11.2
MacBook Air (M1, 2020) Apple M1 メモリ　16GB SSD 256GB
Docker version 20.10.3, build 48d30b5

または
Windows 10 SurfaceBook

## docker の操作コマンド

### 基本

- プロセスを表示

``` zsh
docker ps
```

- イメージを取得 (Pull)

``` zsh
# nginx を取得する。
docker pull nginx
```

- イメージを表示 (List)

``` zsh
docker images
```

- イメージの履歴を表示 (History)

``` zsh
docker history nginx
```

- イメージを削除 (Delete Docker Image)

``` zsh
docker rmi nginx
docker images
```

### nginx を操作

nginxサーバーのコンテナを取得して起動して停止する例

``` zsh
# nginx のdockerイメージを取得する。
docker pull nginx
# nginx のdocker イメージを起動する。
docker run -p 80:80 --name nginx nginx
# 作動中のコンテナ一覧を表示 (List)
docker ps
# Webページをcurlを使って取得
curl localhost:80
# nginx コンテナを停止
docker stop nginx
# 停止中のコンテナも全て一覧表示
docker ps --all
# nginx コンテナを削除
docker rm nginx
# 停止中のコンテナも全て一覧表示
docker ps --all
```

### nginx を操作(バックグラウンド)

nginxサーバーのコンテナを取得してバックグランド起動して停止する例

``` zsh
# nginx のdockerイメージを取得する。
docker pull nginx
# nginx のdocker イメージを起動する。
docker run --detach -p 80:80 --name nginx nginx
# 作動中のコンテナ一覧を表示 (List)
docker ps
# Webページをcurlを使って取得
curl localhost:80
# nginx コンテナを停止
docker stop nginx
# 停止中のコンテナも全て一覧表示
docker ps --all
# nginx コンテナを削除
docker rm nginx
# 停止中のコンテナも全て一覧表示
docker ps --all
```

### nginx の操作（nginx内を探索する）

nginxのConfigファイルを見つける

```　zsh
# nginx のdocker イメージを起動する。
docker run --detach -p 80:80 --name nginx nginx
# 作動中のコンテナ一覧を表示 (List)
docker ps
# Webページをcurlを使って取得
curl localhost:80
# sh でコンテナに乗り込む
docker exec -it nginx sh
# ファイルを探索する
find / -type d -name nginx | xargs grep -r  html
# nginx コンテナを停止
docker stop nginx
# 停止中のコンテナも全て一覧表示
docker ps --all
# nginx コンテナを削除
docker rm nginx
# 停止中のコンテナも全て一覧表示
docker ps --all
```

### nginx を操作する（トップページを上書きする）

nginx のデフォルトページを「Hello,World」に書き換える。

```　zsh
# nginx のdocker イメージを起動する。
docker run --detach -p 80:80 --name nginx nginx
# 作動中のコンテナ一覧を表示 (List)
docker ps
# Webページをcurlを使って取得
curl localhost:80
# sh でコンテナに乗り込む
docker exec -it nginx sh

# ファイルを探索する
find / -type d -name nginx | xargs grep -r  html
# 格納先されているデフォルトのWebページを表示
cat /usr/share/nginx/html/index.html
# Hello,Worldで上書き
echo "Hello World" > /usr/share/nginx/html/index.html
# sh から抜ける
exit

# Webページをcurlを使って取得 「Hello,World」と表示されていればOK
curl localhost:80

# nginx コンテナを停止
docker stop nginx
# 停止中のコンテナも全て一覧表示
docker ps --all
# nginx コンテナを削除
docker rm nginx
# 停止中のコンテナも全て一覧表示
docker ps --all
```



### docker rmi と docker rmの違い

docker イメージを削除するのは rmi
docker コンテナを削除するのは rm

### 他、コンテナのデバッグに使えそうなコマンド

- コンテナのログを表示 (Log)

コンテナ内の実行ログを確認できる。
例）
localhost:80にcurlした時に残るnginxコンテナのログ

> 172.17.0.1 - - [21/Feb/2021:13:07:45 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.1" "-"

``` zsh
docker logs nginx
```

- コンテナのメタデータを見る (Inspect Docker container)

``` zsh
docker inspect nginx
```


### 起動中のコンテナから自作イメージを作成

```zsh

# nginx のdockerイメージを取得
docker pull nginx

# カレントディレクトリに「Hello World2」と記載したindex.htmlを用意
echo "Hello World2" >  $(pwd)/index.html

# nginx イメージを用いてhelloという名前でコンテナをバックグランドで実行
# この時 ワーキングディレクトリをボリュームマウント
docker run -d --volume "$(pwd)":/usr/share/nginx/html -p 80:80 --rm --name hello nginx

# curl を実行して動作確認
curl localhost
> Hello World2

# コンテナ内のログを確認
# 直前のcurl のログが見える
docker logs hello
> 172.17.0.1 - - [28/Feb/2021:13:34:07 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.64.1" "-"

# helloコンテナからイメージを作成
docker commit hello hello_world

# イメージ一覧を表示
# オリジナルイメージ、hello_worldが作成できていることを確認
docker images
> hello_world   latest    d7e0f64fec8f   6 seconds ago   126MB

```