Docker Engine を Ubuntu にインストールする

# Docker Engine を Ubuntu にインストールする

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 24.04 に Docker Engine をインストールする手順を紹介します。
![docker_on_ubuntu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/376c3d00-a7ca-f1ab-b0b3-c49517efaeff.png)

## 目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

https://qiita.com/studio_meowtoon/items/6119ab05d8b13527efd8

## 実現すること

Windows 11 の WSL Ubuntu 24.04 に Docker Engine をインストールします。

:::note alert
ご自身のPCに、Docker コンテナ実行環境を構築するには、[**Docker Desktop**](https://www.docker.com/products/docker-desktop/) を使用する方法があり、そちらが一般的です。 しかし、この記事では Docker Engine を使用して Docker を直接コマンドから操作することで、Docker の基礎的な使い方を学習することを目的としています。ご注意ください。
:::

## 技術トピック

### Docker Engine とは？  

<details>
<summary>こちらを展開してご覧いただけます。</summary>

### [Docker Engine](https://docs.docker.com/engine/)

:::note info
Docker Engine は、Docker のコンテナ仮想化プラットフォームのコアとなるコンポーネントです。Docker Engine は、アプリケーションやサービスをコンテナにパッケージ化し、実行するための環境を提供します。

Docker Engine は、コンテナのイメージ管理、ネットワーク管理、データ管理、ログ管理など、様々な機能を提供します。また、Docker Engine は、Docker Hub などのレジストリと連携して、イメージの配布やダウンロードを行うこともできます。

Docker Engine は、オープンソースであり、Docker コミュニティによって開発、保守されています。Docker Engine は、Linux、Windows、macOS など、様々なプラットフォームで利用することができます。
:::

</details>

## 開発環境

+ Windows 11 Home 23H2 を使用しています。

:::note info
[WSL](https://learn.microsoft.com/ja-jp/windows/wsl/about) の Ubuntu を操作していきますので macOS の方も参考にして頂けます。  
:::  

<details>

WSL (Microsoft Store アプリ版) [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/2aaa6579cb8e4fa1d874)

```sh
> wsl --version
WSL バージョン: 2.2.4.0
カーネル バージョン: 5.15.153.1-2
WSLg バージョン: 1.0.61
```

Ubuntu [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/2aaa6579cb8e4fa1d874)

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 24.04 LTS
Release:        24.04
Codename:       noble
```

</details>

:::note warn
この記事では基本的に Ubuntu のターミナルで操作を行います。
:::

## Docker Engine をインストール

:::note info
この記事で紹介する Docker Engine のインストール手順は、Docker 公式の資料を基にしています。
:::

https://docs.docker.com/engine/install/ubuntu/

:::note warn
こちらの操作は root 権限が必要です。
:::

古いバージョンの Docker Engine をアンインストールする必要がある場合は、以下のコマンドを実行します。

```sh
$ sudo apt remove docker docker-engine docker.io containerd runc
```

Docker Engine インストールに必要なパッケージをインストールします。

```sh
$ sudo apt update
$ sudo apt install ca-certificates curl gnupg lsb-release
```

<details>
<summary>説明を開きます。</summary>

:::note info
Ubuntu または Debian Linux ディストリビューション上で実行された場合に必要なパッケージをインストールします。

各パッケージの目的は以下のとおりです。

|パッケージ|概要|
|:--|:--|
|ca-certificates|認証局 (CA) の証明書を含む、信頼できる CA リストを提供します。|
|curl|URL を使用してデータを転送するためのツールです。|
|gnupg|GNU Privacy Guard (GPG) の実装で、デジタル署名と暗号化を提供します。|
|lsb-release:|リリースの情報を含む Linux Standard Base (LSB) データを提供します。|

これらのパッケージは、Docker のリポジトリから Docker Engine をインストールするために必要な前提条件です。
:::

</details>

Docker 公式の GPG 鍵を追加します。

```sh
$ sudo mkdir -m 0755 -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```

<details>
<summary>説明を開きます。</summary>

:::note info
Docker Engine をインストールするために必要な前提条件を作成しています。/etc/apt/keyrings ディレクトリを作成し、Docker の公開鍵をダウンロードして展開します。これにより、**APT** **(Advanced Packaging Tool)** が Docker リポジトリからのパッケージを正しく認証できるようになります。
:::

</details>

Docker の公式リポジトリを追加します。

```sh
$ echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

<details>
<summary>説明を開きます。</summary>

:::note info
ここでは、/etc/apt/sources.list.d/docker.list ファイルを作成し、Docker リポジトリの URL をこのファイルに書き込みます。また、Docker リポジトリのパッケージを正しく認証できるように、Docker の公開鍵ファイルの場所を指定しています。

各コマンドの内容は以下のとおりです。

|コマンド|概要|
|:--|:--|
|echo|Docker リポジトリの URL とキーを含む APT エントリを標準出力に出力します。|
|sudo tee| 標準入力から受け取った APT エントリを、/etc/apt/sources.list.d/docker.list ファイルに書き込みます。同時に、標準出力に書き込まれた内容を /dev/null に送ります。|
|$(dpkg --print-architecture)| 現在のアーキテクチャを取得します。これにより、適切な Docker パッケージがダウンロードされます。|
|$(lsb_release -cs)| ディストリビューションのコードネームを取得します。これにより、適切な Docker パッケージがダウンロードされます。|
:::

</details>

Docker Engine をインストールします。

```sh
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

<details>
<summary>説明を開きます。</summary>

:::note info
各パッケージの内容は以下のとおりです。

|パッケージ|概要|
|:--|:--|
|docker-ce:|Docker エンジン本体です。Docker デーモン (dockerd) や CLI ツール (docker)、および依存ライブラリを含みます。|
|docker-ce-cli|Docker CLIツールです。Docker エンジンと通信するために使用されます。|
|containerd.io|コンテナランタイムである containerd を含むパッケージです。Docker エンジンは、コンテナの作成、実行、管理に containerd を使用します。|
|docker-buildx-plugin|Docker マルチアーキテクチャビルド機能を提供するプラグインです。これにより、複数のプラットフォームで動作するアプリケーションをビルドできます。|
|docker-compose-plugin|Docker Compose の実行を簡略化するためのプラグインです。これにより、複数の Docker コンテナを定義し、管理することができます。|

これらのパッケージは、Docker エンジンを構成するために必要な機能を提供します。それぞれのパッケージは、異なる機能を提供し、Docker の操作やビルドプロセスを容易にします。
:::

</details>

ユーザーに Docker を実行する権限を与えます。

```sh
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
```

<details>
<summary>説明を開きます。</summary>

:::note info
これらのコマンドは、Docker を実行するために必要な権限を付与するために使用されます。

|コマンド|概要|
|:--|:--|
|sudo groupadd docker|docker グループを作成します。このグループは、Docker を実行するために必要な権限を付与するために使用されます。|
|sudo usermod -aG docker $USER|現在ログインしているユーザーを、先に作成した docker グループに追加します。これにより、ユーザーは Docker を実行するための必要な権限を持つようになります。|
:::

:::note warn
Docker を実行するためには、特定の権限が必要であり、これらのコマンドを使用することで、ログインしているユーザーが必要な権限を持つように設定されます。
:::

</details>

一度ターミナルを終了します。

```sh
$ exit
```

## Docker デーモン の起動と Hello World

Ubuntu のターミナルを起動後、Docker デーモンを起動します。

:::note warn
こちらの操作は root 権限が必要です。
:::

```sh
$ sudo service docker start
```

ステイタスを確認します。

```sh
$ sudo service docker status
● docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)
     Active: active (running) since Sat 2024-07-20 09:51:24 JST; 4min 29s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 1761 (dockerd)
      Tasks: 15
     Memory: 30.0M ()
     CGroup: /system.slice/docker.service
             └─1761 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
```

バージョンを表示してみます。

```sh
$ docker --version
Docker version 27.0.3, build 7d4bcd8
```

:::note alert
Docker デーモンを停止するには以下のコマンドを入力します。

```sh
$ sudo service docker stop
```

:::

docker で Hello World してみます。

```sh
$ docker run hello-world
```

hello-world コンテナイメージを取得して、以下のように表示されます。

```sh
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:1408fec50309afee38f3535383f5b09419e6dc0925bc69891e79d84cc4cdcec6
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

コンテナイメージの一覧を表示してみます。

```sh
$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   14 months ago   13.3kB
```

hello-world コンテナイメージがローカルに取得できています。

これで Ubuntu に Docker Engine をインストールすることが出来ました。

:::note info
Docker を操作するコマンドはたくさんありますが、今回は Docker Engine のインストール方法について紹介しました。今後は、実際に Docker を使ってコンテナを作成したり、操作したりするためのコマンドを紹介する記事も予定しています。
:::

全てのコンテナと全てのコンテナイメージを削除するコマンドです。

```sh
$ docker rm -f $(docker ps -aq) && docker rmi -f $(docker images -aq)
```

:::note alert
このコマンドを実行すると、**全てのコンテナ**と**全てのコンテナイメージ**が**削除**されます。注意して使用してください。
:::

## まとめ

+ Window 11 の WSL Ubuntu に、Docker Engine をインストールして Hello World することができました。

:::note warn
Docker を学ぶためには、[Docker Desktop](https://www.docker.com/products/docker-desktop/) を使うこともできますが、Ubuntu に Docker Engine をインストールして操作してみることも大変役立ちます。Docker Engine の理解を深めることや、**Linux の操作**にも慣れることができます。
:::

どうでしたか？ WSL Ubuntu に Docker Engine をインストールする手順を紹介しました。ぜひお試しください。今後も、開発に必要な環境構築手順などを紹介していきますので、ぜひお楽しみにしてください。