DockerでKali Linuxコンテナをインストール

# はじめに
タイトルの通りDockerでKali Linuxをインストールします
注意：Dockerの場合？Kali LinuxはGUIではなくCUIです．

インストールの前に...
DockerはホストのOSと異なるものをインストールできない(WindowsならWindowsのみ)ので，
Kali LinuxをDockerで建てるにはUbuntuなど(Linux)にDockerをインストールすることになると思います．
したがって，WindowsであればVirtualBoxなどでUbuntuを立ち上げてから，などの操作が必要だと思います．


今回は，自分で入れたUbuntuにDockerをインストールしてあるので，そこでKali Linux環境を作ります．

UbuntuにDockerはインストールされているとして説明します．

まだまだ初心者なのでわからないことが多いです．　
ご指摘お待ちしてます．

# Dockerの起動
```
$ sudo systemctl start docker
```

#Kali Linuxの公式イメージをダウンロード

docker hubのurl：https://hub.docker.com/search?q=kalilinux&type=image
ここでkalilinux/kali-rollingのDownloads数が500K+なので安心できるimageだと分かります．多分...

それでは，実際にこのimageをpull(自分のDockerに持ってくる)したいのですが，次のコマンドを使います．

```
$ docker pull kalilinux/kali-rolling
```

ここで色々エラーが出るかもしれないですが，考えられることは
・dockerコマンドの前に sudo をつけなければならない(dockerの設定で変えられるけど，初期状態ではsudoが必須)→私は初期状態のまま行きます．
・Docker Hubにログインしていない → Docker Hubのアカウントを作成し，sudo docker login でログインする
・そもそもDocker Hub上にある最新版のimageが変わっているかも
の３つとかかと思います．


#イメージの確認

```
$ sudo docker image ls        
REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
kalilinux/kali-rolling   latest    fa869fcfbd43   2 days ago      125MB
```
これでkalilinux/kali-rollingがレポジトリにあることを確認してください

#コンテナをデタッチドモードで起動

```
$ sudo docker run -itd --rm kalilinux/kali-rolling
→ CONTAINER_IDが表示される
```
このCONTAINER_IDは覚えておいてください（先頭の４文字くらいでも良いし，最悪忘れてしまっても確認できる）．
実際のところ

```
$ sudo docker run -itd --rm kalilinux/kali-rolling
0de7ee9ba6aa82ed7dc8f0949607b479ac81dca468f69dee60712f51b50b5466
```
こうなります

#コンテナ内のシェルを起動
```
$ sudo docker exec -it さっきのCONTAINER_ID /bin/bash
```

実際には次のようなコマンドになります．

```
$ sudo docker exec -it 0de7ee9ba6aa82ed7dc8f0949607b479ac81dca468f69dee60712f51b50b5466 /bin/bash
```

これでKali Linuxのbashが起動するかと思います．
これまでのUbuntuのシェルのコマンドの先頭は$でしたが，Kali Linuxのbash上でのコマンドの先頭は今後#で示します．

#Kali Linuxのパッケージインストール
ここまでで，Kali Linuxのbashを起動して操作できるようになったのですが，vimやpingなどのコマンドがインストールされていません．（最初焦りました...）
パケージをインストールする必要があるみたいです．
url: https://tools.kali.org/kali-metapackages
このサイトでkali-linux-coreやkali-linux-defaultなどのパッケージの説明がありました．
他の方のQiitaの記事にあるkali-linux-fullのパッケージがインストールできず，このサイトを探し出すのにどれだけ苦労したことやら，って感じです．（正直そこまでですが...）
https://www.kali.org/blog/major-metapackage-makeover/ ←ここにもパッケージの詳細が書いてあります！
はい，インストールしていきましょう．
最初はアップデートしておきましょう．

```
# apt-get update
```

次にお好きなパッケージをインストールしていきましょう．

```
# apt-get install 好きなパッケージ
```
私の場合は

```
# apt-get install -y kali-linux-core kali-linux-default kali-tools-web
```
って感じです．
途中の-yオプションはインストールの途中で聞かれるyes|noに対して全てyesで答えるものでしたね．
このインストールには時間がかかるかと思います．
私は寝る前にしたのでどれくらいかかったか分かりませんが...
インストールし終えたら

```
# exit
```
でbashから抜けましょう．

# インストールしたコンテナをイメージとして保存
bashから抜けてもまだコンテナは起動しているので，色々インストールしたコンテナを保存しましょう．
何もせずにコンテナを終了してしまうと，これまでインストールしたものまで消えてしまうので注意．

```
$ sudo docker commit 前に出てきたCONTAINER_ID new_name
```
このコマンドで実行できますが，
CONTAINER_IDがわからないとき，

```
$ sudo docker container ls
```
で調べられます．

最終的に，具体的なコマンドは次のようになります．

```
$ sudo docker commit 0de7 my-kali
```
ここで，CONTAINER_IDは起動しているコンテナの中で一意に識別できれば良いので先頭の４文字だけでも大丈夫です．
あ，新しいレポジトリ？イメージ？の名前はmy-kaliにしました．

#起動中の初期Kali Linuxコンテナを停止
これで保存できたので，コンテナを次のコマンドで停止します．

```
$ sudo docker container stop CONTAINER_ID
```
ここもCONTAINER_IDは先頭４文字とかで大丈夫です．

#色々インストールしたKali Linuxコンテナに接続
いよいよmy-kaliに会えます

```
$ sudo docker run -it --rm container_name
```
container_nameは先ほどつけた名前です．
私の場合，my-kaliになります．
したがって， 

```
$ sudo docker run -it --rm my-kali
```
です．
これでちゃんとmy-kaliのbashを起動できるので，exitで一回抜けましょう．

# 付録：kaliコマンドで起動させよう
この付録も参考サイトから抜粋ですが，少し詳しく．
Kali Linuxを起動させるとき，毎回毎回

```
$ sudo docker run -it --rm my-kali
```
と打たなければいけません．
これを

```
$ kali
```
このkaliコマンドだけで実行しようってことです．

```
$ echo "alias kali='docker run out --rm my-kali /bin/bash'" >> ~/.bash_profile
$ source ~/.bash_profile
```
これで，

```
$ kali
```
のコマンドのみでKali Linuxを起動できるようになります．
ただ，これは自分のUbuntuの環境のシェルがbashである場合なので，そこは自分の環境に合わせてください．
私の場合，シェルがzshなので.zshrcにしました．
自分のシェルが何かを調べるコマンドもあるので調べてみてください〜

# 終わりに
今回の内容を日本語で調べてもなかなかヒットしなかったので，これは是非ともと思って記事にしました．
今回が初めての記事なので色々と雑なところがあったかもしれないですが，LGTMを押してもらえると励みになりますのでポチッとお願いします．
また，英語で調べるのも大切だとしみじみ思いました．
TOEICも勉強しないとなあ...

# 参考
https://qiita.com/rocinante-ein/items/680f20d37a7e536d307b