Dockerって難しいよね

Dockerコマンド関係メモ

正直触りまくってコマンドとか使い方を覚えてる人は化け物って思います。

おじさんは記憶力がなくなってきてるのでメモ残さないと無理！

とりあえずWEBを彷徨いながらWindows、Linux(Ubuntu)共にDockerを使える様にしています。

ただ使う上ではLinux系の方が情報も多いのでメモとしてはこっち基準です。
windous10上でGit Bashも入っています。(スクショが楽だから)

# コマンドについて(Linux系)

復習も兼ねて基礎的なものを記載します。

| コマンド                                  | 意味・用途         |
|:------------------------------------------|:-------------|
|cd ＜Path＞<br>(current directory)                                |指定したパスに移動する|
|pwd <br>(print working directory)                                       |今いるディレクトリの表示|
|mkdir ＜new folder＞<br>(make directory)                       |新しいフォルダを作成する。 |
|touch ＜new file＞                         |新しいファイルを作成する。|
|ls                                         |カレントディレクトリのファイル、フォルダを一覧表示(list)|
|rm ＜file＞                                |ファイルを削除する。|
|rm -r ＜folder＞                           |フォルダーを削除する|
|reset                                      |ターミナル表示をリセットする<br>(今いるディレクトリはそのまま)|

これだけ羅列しても初心者にはわかりにくいと思うので写真で説明します。

## cd / pwd / ls

Linux系(Ubuntu)でターミナルを開くと`home/ユーザー`位置にいます
Windowsだと`C/ユーザー/user`位置にいます。

まずはターミナルを立ち上げ、`pwd`と打ち込むと現在位置が分かります。

Ubuntu
![Screenshot from 2021-08-03 11-37-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/3c69834f-3cea-cc15-e7fa-2650979c9f44.png)

Windows(Git Bash)
![スクリーンショット (417).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/0cc10494-20e1-5636-e52b-7108f4902333.png)

次に`ls`と打ち込むことで今いる場所のフォルダ・ファイル一覧が表示されます。

Ubuntu
![Screenshot from 2021-08-03 11-44-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/54a430f3-f263-aa9e-0da1-d2c05e652276.png)

Windows(Git Bash)
![スクリーンショット (419).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/a805a352-205f-ee42-ce0d-57ea1c24d891.png)

Windows的な使い方を言語化するならフォルダを開いて中身を確認するって感じです。

次に`cd`だがデスクトップ上に移動する前提でいうと

`cd Desktop`と打ち込むことでデスクトップ上に移動する。

Ubuntu
![Screenshot from 2021-08-03 11-52-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/0b036c48-867f-8ba4-b3d7-e79af5b313a7.png)

Windows(Git Bash)
![スクリーンショット (420).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/bf690680-dc01-d69c-723b-c3ffab979599.png)

これでデスクトップ上に移動した事となります。

`cd /○○○/△△△`と指定すればダイレクトで指定したディレクトリに移動出来ます。

## mkdir / touch
Windowsに慣れてると右クリック→新規作成→フォルダみたいにやってますが
ターミナル上の操作だとそうはいかんです。

前述で移動したデスクトップ上にフォルダを作ってその中になんかファイルを作るていで説明します。
作るフォルダの名前を`qiita_test`とします。

`mkdir qiita_test`これでフォルダ作成されます。

Ubuntu
![Screenshot from 2021-08-03 13-07-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/cb25016a-da98-7c0d-74ad-8537910584ee.png)

Windows(Git Bash)
![スクリーンショット (421).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/c3918c87-ac5d-477c-3828-3c4f6f19ca9b.png)
![スクリーンショット (422).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/543cd5aa-d0af-aba1-43cb-eb0f64f8a4d5.png)

---

次に`touch`を使ってファイルを作成する。
ファイルを作成するにあたり`mkdir`で作った`qiita_test`に移動しておく

移動先で`ls`と打ち込むと空のはず

そこで`touch qiita_test.txt`と入力すると・・・

Ubuntu
![Screenshot from 2021-08-03 13-18-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/9b4dd226-5ed0-f599-1329-1a38ee4d8ffb.png)

Windows(Git Bash)
![スクリーンショット (423).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/b5e54bcc-f06f-cbf8-df47-a493dec62ba4.png)

新規ファイルとして作成されます。

いつも慣れている画面で行くと

Windows
![スクリーンショット (424).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/17443866-86ab-e06e-df60-a549c2a7bf22.png)

Ubuntu
![Screenshot from 2021-08-03 13-21-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/7e533d6c-5f87-6bf6-db78-08d885e0424c.png)

ターミナルから作ったファイルを開くには`vim`や`nano`等のエディターを用いると開けます。
Linux系だと設定ファイルの変更等でよく使用しますがここでは説明を割愛します。

## rm / rm -r
次は削除について

`rm`についてはファイル削除
前述の`qiita_test.txt`を消してみる

Ubuntu
![Screenshot from 2021-08-03 13-29-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/fd4d0ef7-b3e8-2b78-f969-ca76c82eab9a.png)

Windows(Git Bash)
![スクリーンショット (425).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/d688a6f6-5036-e852-f939-eb6ed8e66cc4.png)

てな感じで削除されます。

続いて`rm -r`で作った`qiita_test`フォルダを削除してみます。
削除の際はディレクトリを前の階層(`Desktop`)に移動しておくとよいと思います。
ちなみに前の階層には`cd ../`で戻る事が出来ます。

Ubuntu
![Screenshot from 2021-08-03 13-36-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/571c593b-6397-b8ed-6983-d91bfd19c88e.png)

Windows(Git Bash)
![スクリーンショット (427).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/ba849a7d-13b2-a4b5-85c1-1b0b3beee611.png)

大分前振りが長くなりましたが基本的なLinux系コマンドは以上となります。
他にも多数ありますがまずはこれで
Dockerコンテナ内での作業でも使用するので使用頻度は多いと思います。

あとLinux系コマンドめっちゃ多いので詰まれば都度調べながらは未だに変わりません。

# コマンドについて(Docker)

今回の説明で**Docker Hub**をメインとしています。
アカウント登録済み前提となります。

[Docker Hub](https://hub.docker.com) ← 公式です。

全部網羅出来ているとは思いません。
とりあえず使うであろうものを羅列しました。

また、リスト内の`＜IMAGE_ID＞`や`＜CONTAINER_ID＞`については下記図の部分を差します。
![Screenshot from 2021-08-03 15-44-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/b1af9024-6339-f4be-bd1b-48ff04702a17.png)


| コマンド                                  | 意味・用途         |
|:------------------------------------------|:-------------|
|docker -v                                  |インストールしたDockerのバージョン確認|
|docker login                               |Docker Hubにログインする。|
|docker logout                              |Docker Hubからログアウトする。
|docker pull ＜IMAGE_ID＞                   |Docker Hubからイメージを持ってくる。|
|docker images                       　　　 |ホスト(PC)に今あるDockerのイメージのリストを確認する<br>(コンテナの設計図データ)|
|docker rmi ＜IMAGE_ID＞                    |イメージの削除。|
|docker iamges -aq ｜ xargs docker rmi      |イメージの全削除<br>(要コンテナがないこと)|
|docker run [option] ＜IMAGE_ID＞ [command] |イメージからコンテナを生成する<br>(設計図からコンテナを立ち上げる)|
|docker ps                                  |今あるアクティブなコンテナを確認する。|
|docker ps -a                               |すべてのコンテナを確認する。|
|docker rm ＜CONTAINER_ID＞                 |コンテナを削除する。|
|docker ps -aq ｜ xargs docker rm           |コンテナの全削除。|
|docker system prune                        |コンテナの全削除。|
|docker stop ＜CONTAINER_ID＞               |STATUSが**Up**のコンテナを停止させる。|
|exit                                       |作業していたコンテナから抜ける。<br>(作業していたプロセスを**切って**コンテナから抜ける)<br>(`docker ps -a`で確認するとSTATUSは**Exited**になっている )|
|docker restart ＜CONTAINER_ID＞            |抜けたコンテナを再起動する。|
|docker exec [option] ＜CONTAINER_ID＞ [command]     |再起動したコンテナに入る。<br>(restartしておかないとエラー出ます)|
|`Ctrl`+`p`+`q`                             |作業していたコンテナから抜ける。(**detach**)<br>(作業していたプロセスを**残したまま**コンテナから抜ける)<br>(`docker ps -a`で確認するとSTATUSは**Up**のまま)|
|docker attach ＜CONTAINER_ID＞             |`Ctrl`+`p`+`q`(**detach**)で抜けたコンテナに再度入る。<br>(exitで抜けた場合は使わない)|
|docker commit ＜CONTAINER_ID＞ ＜new image＞|触ったコンテナを更新して、更新内容をDocker imageにする。|
|docker tag ＜source＞ ＜target＞           |Docker Hubにpushするイメージの名前を新しくして保存する。<br>(要Docker Hubにrepositoryを作ってある事)|
|docker push ＜IMAGE_ID＞                   |Docker Hubにあるリポジトリにdockerイメージをpushする。<br>(要Docker Hubにrepositoryを作ってある事)|

簡単ですが以上が基本的なコマンドとなります。
恐らく突き詰めるともっとありますが道半ばなので今はこれで勘弁して下さい。

# 実際にDockerを触ってみる
文字ばっかりだとイメージが付きにくいのざっくりとだが流れをば
まぁ以降は蛇足感はありますが・・・

使うのはDocker Hubにある『hello-world』とこちらに書かれている『docker run -it ubuntu bash』を触ります。

ちなみに[Docker Hub公式イメージ](https://hub.docker.com/_/hello-world)

## ①ログインからイメージを持ってくる(確認も含む)

![Screenshot from 2021-08-04 08-29-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/8f34bfe3-2004-772a-67c4-b1fa4a9dd279.png)

`docker login`をするとDocker Hubにログインします。
この際、user名とパスワードを入力します(Linuxはパスワードが表示されなのははじめ知りませんでした。)

`docker pull hello-world`で公式よりイメージを持ってきます。

`docker run hello-world`で持ってきたイメージからコンテナを生成します。
この`hello-world`はコンテナ生成してターミナルにコメントを表示してコンテナを抜けて終了となります。

`docker ps -a`でコンテナ一覧を確認すると`hello-world`で生成されたコンテナ履歴が出ます。
ここの『STATUS』がexitedとなっているので抜け事もわかります。

次に`hello-world`コメントにある『docker run -it ubuntu bash』を試してみます。

---

![Screenshot from 2021-08-04 08-30-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/8eee2f71-d226-750e-90f7-de9e8b845842.png)

`docker run -it ubuntu bash`
あれ？イメージ持ってきてないけど？と最初は思いましたが
どうもホスト側(ローカル)にイメージがない場合はDocker Hubからイメージを勝手に持ってきます。

するとターミナルで

```
root@○○○○○○○:/#
```
となります。

ルート権限でコンテナ内のubuntuを使用出来る様になります。
ここで`ls`等を使いながら色々と環境構築をしていき
開発に必要な環境を作っていく事となります。

コンテナからは`exit`で抜けれます。

`docker ps -a`で確認するとubuntuが追加されてます。
`docker images`でイメージを確認してもubuntuが確認出来ます。

## ②コンテナに再度入ってみる

![Screenshot from 2021-08-04 10-05-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/1d69e7f1-2c64-c8fa-cac1-893922b55b23.png)


`docker ps-a`でコンテナを確認すると『STATUS』が`Exited`になっていると思いますが
この状態では再度コンテナ内に進入出来ません。
コンテナの再起動が必要となります。

それが`docker restart ＜CONTAINER_ID＞`となります。

すると『STATUS』が`Up`に変わりますのでこの状態で`docker run -it ubuntu bash`と打ち込めば
コンテナ内に入れます。

コンテナ内では普通のubuntuとして使用可能なので`mkdir qiita_test`とか全然できます。
ただこの時点で公式から持ってきたイメージから立ち上がったコンテナとは違うものになります。

![Screenshot from 2021-08-04 10-16-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/80cd4d7a-2c9e-a1f4-fb41-6d6c9ee7ae5e.png)

しれっとコンテナが増えています。こっちが追加した方です。
再起動したコンテナには追加した`qiita_test`がないことからもわかると思います。

## ③更新したコンテナから新しいイメージを作成する

![Screenshot from 2021-08-04 10-27-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/d3e3c984-b1dd-0e5c-efc0-20e4b5450efd.png)

`docker commit ＜CONTAINER_ID＞ ＜new image＞`これで新しいイメージとして保存されます。

`＜CONTAINER_ID＞`は上記の図でいう所の新しく出来たコンテナ(`9bc42039a04c`のこと)
`＜new image＞`はubuntuを触ったから`ubuntu`に`:qiitatest`はタグとなります。

これで手を加えたコンテナのイメージが出来ます。

## ④新しくしたイメージをDocker Hubに上げる(準備編)
公式のリポジトリからイメージを持ってきているが
勝手に手を加えてるのに公式に戻すってのはおかしいので
自身のアカウントでリポジトリを作成しておく必要があります。

但し、Docker Hubは無料で使える範囲は限られています。

無料だとリポジトリーは１つしか作成できないようです。
この辺りはプロジェクト単位か会社として有料版にした方がよいのでは？と思います。

[無料プラン概要](https://docs.docker.jp/docker-hub/overview.html)
[有料プラン概要](https://matsuand.github.io/docs.docker.jp.onthefly/docker-hub/billing/)

今回は事前にアカウントを登録してかつ無料を享受したい立場として進めます。

『Create a Repository』をクリック

![Screenshot from 2021-08-03 16-12-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/7e650537-44bf-2ecd-c5a9-e84c8bf56005.png)

『Repository Name』を入力して『Create』をクリック
`Public` or `Private`についてはお好みです。

![Screenshot from 2021-08-03 16-13-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/003fb32b-2d11-b7af-16c1-c3dd3a7e635d.png)

これでリポジトリを作成できます。

私は`my-first-repo`と命名しました。

pushする際、ユーザー名とリポジトリ名が必須となりますのであまり変な名前にしない方がよいかと

## ⑤新しくしたイメージをDocker Hubに上げる(pushする)

![Screenshot from 2021-08-04 11-33-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/db81e45d-2565-89d1-da92-a7acaa6aa885.png)

リポジトリ名がpullしてきたときと同じでは公式に勝手にいじったイメージをぶん投げるだけなので
リポジトリ先を変更する必要があります。

`docker tag ＜source＞ ＜target＞`

`＜target＞`の部分は自分のユーザー名と作ったリポジトリ名となります。
私の場合は`takoyakiya/my-first-repo`となります。

`docker images`で確認すると追加されていることが分かります。
ただ、`IMAGE_ID`は同じです。
pushする先が違うとの認識でOKと思います。

---

次は`docker push ＜image＞`となります。

私の場合は`docker push takoyakiya/my-first-repo`です。

![スクリーンショット (428).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/9063c871-ff2a-9098-bb1d-a127876bf3b3.png)

Docker Hub側でpushされたことが確認出来ます。

# まとめ
ざっくりとした流れは以上となります。
現時点ではまだまだ理解が浅く使いこなせていないのが実情です。

ただ、ローカル側でVENV等で仮想環境を一から構築するよりは
この環境で行く！って方が楽ちんなのは確かです。

後は`docker run ~`以降の物理層とのマウント関係オプションが理解出来れば御の字です。