【初学者向け】(改良版) Docker上でLinux環境を構築しよう！(Ubuntu)

# はじめに
この記事は、以前書いたこちらの記事 :[【初学者向け】Docker上でLinux環境を構築しよう！(Ubuntu)](https://qiita.com/yuta_931214/items/9b7859dcd837d692dcef) の改良版となっています。
**Ubuntu** のインストールだけではなく、**Vim** のインストールと **日本語** の設定も１回でまとめてできるようになっています。
こちらを用いれば、Linuxの学習に必要な環境はほぼ揃うのではないかと思います。
Linuxの学習教材としては、LPI-Japanが無償で公開している[『Linux標準教科書』](https://linuc.org/textbooks/linux/)がおすすめです。
では参りましょう！







# 1. Docker Desktopのインストールと実行
   まず「Docker Desktop」をインストールする必要があります。
以下のリンクから最新版をダウンロードしてインストールしてください。

[Download Docker Desktop | Docker](https://www.docker.com/products/docker-desktop/)

インストールが完了したら、Docker Desktopを起動してください。
起動すると画面上部のバーにDockerのアイコンが表示されます。

# 2. Ubuntu のイメージを取得
   ターミナルを開いて、以下のコマンドを入力してUbuntuの最新バージョンのイメージを取得します。
   ```
   docker pull ubuntu:latest
   ```
ちゃんとpullできているか、下記のコマンドで確認してみましょう。
   ```
   docker images
   ```
REPOSITORYのところに ubuntu があればOKです！










# 3. Dockerfileの作成
以下は日本語ロケールの設定とVimのインストールを含む、UbuntuのDockerイメージをビルドするためのDockerfileです。

- Dockerfile
```Dockerfile
# Ubuntuイメージをベースにする
FROM ubuntu:latest

# apt-getがインタラクティブなフロントエンドを使用しないように設定
ENV DEBIAN_FRONTEND=noninteractive

# ロケールの設定とVimのインストール
RUN apt-get update && apt-get install -y locales vim && rm -rf /var/lib/apt/lists/* \
    && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.UTF-8  

# コンテナ起動時の作業ディレクトリを設定
WORKDIR /root

# コンテナが起動する際にbashを実行(コンテナが停止しないように)
CMD ["bash"]
```

このDockerfileは以下のステップを実行します。

1. Ubuntuの最新版をベースイメージとして使用します。
2. apt-getがインタラクティブなフロントエンドを使用しないように設定します。これにより、Dockerイメージのビルドプロセスがインタラクティブなプロンプトで中断されることを防ぎます。
3. `locales`パッケージをインストールし、日本語ロケールを設定します。
4. Vimをインストールします。
5. コンテナが起動したときの作業ディレクトリを`/root`に設定します。
6. (コンテナがすぐに停止しないように、)コンテナ起動の際にbashを実行する。






<details><summary>各コードの解説</summary>

- `FROM ubuntu:latest`
 この行は今回作成するDockerイメージのベースとなるイメージを指定します。ここでは最新のUbuntuイメージを指定しています。

- `ENV DEBIAN_FRONTEND=noninteractive`
 `ENV`は環境変数を設定するための命令です。ここでは`DEBIAN_FRONTEND`を`noninteractive`に設定しています。これは、Dockerイメージのビルド時に`apt-get`コマンドがインタラクティブモードを使用しないようにするための設定です。これにより、Dockerイメージのビルドプロセスがインタラクティブなプロンプトで中断されることを防ぎます。

- `RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8`
`RUN`はシェルコマンドを実行するための命令です。ここでは一連のコマンドを実行して、日本語のロケールを設定しています。まず、`apt-get update`でパッケージリストを更新し、次に`apt-get install -y locales`でlocalesパッケージをインストールします。そして、`/var/lib/apt/lists/*`を削除してディスクスペースを節約し、最後に`localedef`コマンドで日本語のUTF-8ロケールを定義します。

- `ENV LANG ja_JP.UTF-8`
ここでは`LANG`環境変数を`ja_JP.UTF-8`に設定して、デフォルトのシステムロケールとして日本語を使用するように指定しています。

- `RUN apt-get update && apt-get install -y vim`
ここでも`RUN`命令を使用していますが、今回は`vim`エディタをインストールしています。

- `WORKDIR /root`
`WORKDIR`はコンテナが起動したときの作業ディレクトリを設定するための命令です。ここでは作業ディレクトリを`/root`に設定しています。これにより、コンテナが起動したときに自動的に`/root`ディレクトリに移動します。また、後続の`RUN`, `CMD`, `ENTRYPOINT`, `COPY`および`ADD`命令の実行ディレクトリもこの`WORKDIR`で指定したディレクトリとなります。
***
</details>





<details><summary>「/var/lib/apt/lists/*」を削除する理由</summary>

`/var/lib/apt/lists/*` を削除することは必須ではありませんが、推奨されます。なぜなら、この操作により不要なファイルを削除して Docker イメージのサイズを小さく保つことができるからです。

具体的には、`apt-get update` を実行すると、`/var/lib/apt/lists/` ディレクトリにパッケージリストのファイルがダウンロードされます。このパッケージリストは、次に `apt-get install` を実行する際にどのパッケージをダウンロードするかを決定するために使用されます。

しかし、Docker イメージがビルドされると、これらのパッケージリストはもはや必要ではありません。したがって、これらを削除することでイメージのサイズを削減することができます。

イメージのサイズを小さく保つことは、ストレージスペースの節約だけでなく、イメージの配布やデプロイも高速化します。したがって、イメージを作成する際には通常、不要なファイルを削除してイメージのサイズを最小限に抑えることが推奨されます。
***
</details>






# 4. Dockerイメージのビルド
このDockerfileを使用してDockerイメージをビルドするには、**Dockerfileが存在するディレクトリで** 以下のコマンドを実行します。

```
docker build -t my-ubuntu-image .
```

これで、日本語ロケールの設定とVimがインストールされたUbuntuのDockerイメージがビルドされます。






<details><summary>コードの解説</summary>

`docker build -t my-ubuntu-image .` というコマンドは Docker イメージをビルドするためのものです。具体的には以下のような機能があります。

- `docker build`
これは Docker イメージをビルドするためのコマンドです。Dockerfileと呼ばれるテキストファイルに従って新しい Docker イメージが作成されます。Dockerfile は、ベースとなるイメージから始めて、さまざまな命令（パッケージのインストール、環境変数の設定、ファイルのコピーなど）を実行して新しいイメージを作成します。

- `-t my-ubuntu-image`
この `-t` オプションは "tag" を意味し、ビルドした Docker イメージに名前（タグ）を付けるために使用されます。ここでは作成される Docker イメージに `my-ubuntu-image` という名前（タグ）を付けています。

- `.`
最後の `.` は Dockerfile が存在するディレクトリを指しています。つまり、現在のディレクトリに Dockerfile があるという意味です。Docker はこのディレクトリを "ビルドコンテキスト" として使用します。ビルドコンテキストは Docker イメージをビルドするために Docker デーモンに送信されるファイル群です。

以上のコマンドを実行すると、現在のディレクトリにある Dockerfile に従って新しい Docker イメージがビルドされ、そのイメージに `my-ubuntu-image` という名前が付けられます。
***
</details>



ちゃんとDockerイメージが作成できているか、下記のコマンドで確認してみましょう。
   ```
   docker images
   ```
REPOSITORYのところに my-ubuntu-image があればOKです！


# 5. イメージをもとにコンテナを実行する
先ほどビルドしたDockerイメージをもとに、以下のコマンドを使用して新しいコンテナを作成・起動します。

```
docker run -it --name myubuntu my-ubuntu-image
```

このコマンドでは`my-ubuntu-image`イメージから新しいコンテナを作成し、新しいコンテナに`myubuntu`という名前を付けます。
以上で既にコンテナの中に入っている状態です。コンテナから抜けるには`exit`コマンドを実行します。


<details><summary>《補足》コンテナ実行時のコマンド(オプション)について</summary>

コンテナ実行時のコマンド(オプション)はいくつかあります。以下にそれぞれのコマンドの説明をします。

1. `docker run -it --name myubuntu my-ubuntu-image`
このコマンドは、新しいコンテナをインタラクティブモードで起動し、そのシェルに直接アクセスします。`-it`オプションは、コンテナの標準入力を開き続け（`-i`）、TTY（端末）を割り当てる（`-t`）ことを意味します。このコマンドは、**コンテナ内で直接作業を行いたい場合** に適しています。

2. `docker run -d --name myubuntu my-ubuntu-image`
このコマンドは、新しいコンテナをバックグラウンドモード（デタッチモード）で起動します。`-d`オプションは、デタッチモードを意味します。このコマンドは、長期間稼働させるサービスやアプリケーションをコンテナ内で実行する場合に適しています。

どちらのコマンドを使用するべきかは、あなたがどのようにコンテナを使用したいかによります。直接コンテナ内で作業を行いたい場合は、インタラクティブモードでコンテナを起動するコマンドを使用します。一方、バックグラウンドでサービスを実行する場合は、デタッチモードでコンテナを起動するコマンドを使用します。
***
</details>






この時点で **コンテナの中に入っている** 状態です。
現在のワーキングディレクトリは `/root` なので、例えばここで `ls`コマンドを実行しても何も出力されませんので注意してください。ディレクトリ構造を確認したい場合などは、`cd /`でルードディレクトリまで移動してから`ls`コマンドを実行しましょう。

操作が完了したら`exit`コマンドで **コンテナから抜ける** ことができます。
最後に、`docker ps`コマンドを用いてコンテナの状態を確認しましょう。コンテナが実行中だった場合は、`docker stop myubuntu`コマンドでコンテナを停止しましょう(たぶん初回起動時はコンテナから抜けた時点で停止すると思いますが)。

# またコンテナを起動してLinuxを触りたい時
まずは停止したコンテナを起動します
```
docker start myubuntu
```
コンテナの中に入ります
```
docker exec -it myubuntu bash
```
これでOKです！
終わりにしたいときの手順は前と一緒です。
`exit`コマンドでコンテナから抜けて、`docker stop myubuntu`コマンドでコンテナを停止しましょう。



# 最後に
以上で、Docker Desktopを使ってLinux(Ubuntu)の環境を構築する手順が完了となります。
Linuxの学習教材としては、LPI-Japanが無償で公開している[『Linux標準教科書』](https://linuc.org/textbooks/linux/)がおすすめです。
初学者にとっては簡単な内容じゃないと思いますが、とても基礎的な知識がコンパクトにまとまっていますので、ぜひこの記事を参考に環境構築をしてコマンドなどを練習してみてください。
それではまた！(^_^)ﾉｼ