Dockerコンテナを作成してコンテナ内をうろうろして削除する

# TL;DR
- 記事内で書いていること
    - dockerでコンテナ作って壊すコマンド
    - container内での操作
    - docker networkのつなぎ方
- 記事内で触れてない事
    - docker compose
    - Kubernetes

## 起動〜削除

- 起動中のコンテナの情報を表示する

`docker ps` 

```
❯ docker ps                         
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    1248ef1b72c5        ubuntu              "/bin/bash"              4 seconds ago       Up 2 seconds                                 test
```
- コンテナ作成（既存ベースから名前をつけて）
`docker run -itd --name 名前 ベースイメージ`

    ```
# `test`という名前のubuntuベースのコンテナを作る
    ❯ docker run -itd --name test ubuntu
    1248ef1b72c53ba0ab0ff80d68a8787a52076b93e33da2727da1ec31c3a6bc5e

    ~/applications/docker_practice_qiita/getting-started/app master*
    ❯ docker ps                         
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    1248ef1b72c5        ubuntu              "/bin/bash"              4 seconds ago       Up 2 seconds                                 test
    15e29811168f        node:12-alpine      "docker-entrypoint.s…"   3 hours ago         Up 3 hours          0.0.0.0:3000->3000/tcp   app_app_1
    ```

- コンテナ作成(dockerfileから作成)
`docker build -t コンテナ名 .`
`-t` = コンテナに名前をつける
- コンテナ起動
`docker run -dp 3000:3000 コンテナ名 .`
`-d` = デタッチモード（裏で起動）
`-p 3000:3000` = ポート3000番にマッピングする
 `-e MYSQL_ROOT_PASSWORD=secret`  = 環境変数をコンテナに渡す、環境変数名：`MYSQL_ROOT_PASSWORD`、値：`secret`
- コンテナ停止＆削除
`docker rm -f <the-container-id>`
- 未使用のイメージ、コンテナ、ボリューム、ネットワークの全削除
`docker system prune -af`


## イメージ操作

- 未使用のdocker imgaeを削除する

`docker image prune -af`

## コンテナ操作
- ログを確認する

`docker logs -f コンテナ名`

- コンテナに入る

`docker attach コンテナ名`

- コンテナ内でbashを立ち上げる

`docker exec -it コンテナ名 bash`

- コンテナ内で直接コマンドを実行する

```
docker exec -it コンテナ名 /bin/echo "hi"
> hi
```
    実行できるコマンドの調べ方

    ```
    ❯ ls /bin 
    [		cp		dd		expr		launchctl	mkdir		pwd		sleep		test
    bash		csh		df		hostname	link		mv		rm		stty		unlink
    cat		dash		echo		kill		ln		pax		rmdir		sync		wait4path
    chmod		date		ed		ksh		ls		ps		sh		tcsh		zsh
    ```


- コンテナのポート転送確認
`docker containter port コンテナ名`

- コンテナのリネーム
`docker container rename 古い名前　新しい名前`

- コンテナ内のファイルコピー
`docker container cp コンテナ名:ファイルパス(コピー元)　ホストのパス(コピー先)`
    e.g.aggregatorのファイルをローカルにもってくる
    `docker container cp test_container:/var/app/foobar ~/Desktop/copied`


## dockerネットワーク
dockerコンテナ同士が通信するときはDockerネットワークを用いている

- ネットワークの一覧表示

`docker network ls`
docker networkは指定しない場合、`bridge`に接続される

- コンテナのネットワーク確認
`docker container inspect コンテナ名`

- ネットワークの作成
`docker network create ネットワーク名`

- ネットワークへの接続(後付け)
`docker network connct ネットワーク名　コンテナ名`
コンテナ名の指定はIPアドレス、コンテナIDでもOK
inspectするとNetworksに追加されている事がわかる

    ```
    ❯ docker container inspect test
    "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    ========中略========
                    "DriverOpts": null
                    }
                }

    ```
    ```
    ❯ docker network connect todo-app test
    ❯ docker container inspect test
    "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    ========中略========
                    "DriverOpts": null
                },
                "todo-app": {
                    "IPAMConfig": {},
                    "Links": null,
                    "Aliases": [
                        "1248ef1b72c5"
                    ],
                    ========中略========
                    "DriverOpts": {}
                }
                ```

- ネットワークへの接続(作成時に設定)
`docker run -itd --name=名前 --net=ネットワーク名 ベースイメージ`

- ネットワークからの切断
`docker network disconnect ネットワーク名 コンテナ名`

- ネットワークの詳細確認
`docker network inspect ネットワーク名`
ネットワークのIPなどが確認できる

- ネットワークからの削除
`docker network rm ネットワーク名`

## 参考にさせて頂いた動画
Udemy様の動画を参考に学ばせて頂きました。
所感ですが、初めて学ぶものは書籍より動画とハンズオンで手を動かしていくほうが良いですね。
[ゼロからはじめる Dockerによるアプリケーション実行環境構築](https://www.udemy.com/course/docker-k/)