UbuntuにDockerをインストール

今日は先日Prallels Desktop上に作成したUbuntu DesktopにDockerをインストールし、コンテナ型仮想環境を構築したいと思います。前提となる環境周りの情報に関しては、下記投稿を参照して下さい。

https://qiita.com/829yasubee/items/75b03a96cb950c569ef1

尚、今回行うDockerのインストール作業はコマンドベースでの作業となります。私はUbuntu Desktopに標準インストールされている端末アプリを使用しました。みなさんも作業する際はご自分の好きなアプリで実施して下さい。
![スクリーンショット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206277/14dcd47f-6d89-a8ba-0d38-0f151145df50.png)

:::note info
余談だが、Ubuntu等のDebian系Linuxディストリビューションでは、パッケージの追加・更新・削除といった管理はAPT(Advanced Package Tool)で行う。aptで始まるコマンド群がそれに該当する。
:::

#**インストール手順**
###**必要となるパッケージのインストール**
Dockerをインストールするのに先立って必要となるパッケージがいくつかあるので、それを先にインストールする。

```bash:実行コマンド
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
```

:::note info
apt updateコマンドはパッケージ情報を更新するコマンド。パッケージをインストールしたり更新する際は必ずこれを先に行い、インストール対象のパッケージ情報を最新化する事。
:::

ここでインストールするパッケージの用途は下記の通り。

|パッケージ名|用途|
|:-|:-|
|apt-transport-https|APTに登録済みのリポジトリに対してHTTPS通信する|
|ca-certificates|通信相手に対して身元証明する|
|curl|HTTP経由でファイルをダウンロードする|
|gnupg-agent|暗号化されたパッケージを復号化する|
|software-properties-common|APTにリポジトリを追加する|

###**GPGキーの追加**
GPGキーをダウンロードし、APTにキー登録する。DockerパッケージはGPG(GNU Privacy Guard)というツールで暗号化されており、GPGキーはDockerパッケージを復号化する為に必要となる。

```bash:実行コマンド
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

:::note info
curlコマンドのfsSLオプションでは、コマンドの進行状況は表示せずにエラー情報だけ表示するようにしたり、アクセスしたページが移動していた場合に移動先へ自動でリダイレクトするようにしている。
:::

:::note info
apt-keyのaddサブコマンドの引数ハイフン(-)は、パイプ(|)で繋いだ前半部分のコマンド結果を標準入力として受け取っている。つまり、ここではGPGキーを指定している。
:::

###**フィンガープリントの確認**
GPGキーがAPTに正しく登録されたかを確認。下記のように表示されればOK。

```bash:実行コマンド
$ sudo apt-key fingerprint 0EBFCD88
```

```text:表示される結果
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [  不明  ] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]
```

###**APTにリポジトリを追加**
APTにDocker公式サイトのリポジトリを追加する。

```bash:実行コマンド
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
```

:::note info
add-apt-repositoryコマンドで引数指定している文字列は、APTのリポジトリファイル(/ect/apt/sources.list)に登録する文字列を指定している。
:::

上記コマンド実行後にAPTのリポジトリファイルの中身を確認してみる。

```bash:実行コマンド
$ cat /ect/apt/sources.list
```

```test:表示される結果
:
(中略)
:
deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable
# deb-src [arch=amd64] https://download.docker.com/linux/ubuntu focal stable
:
(中略)
:
```

:::note info
sources.listに登録された内容の意味は、ざっくりとこんな感じ。
配布はバイナリー(deb)で、CPUの命令セットアーキテクチャは64bit版([arch=amd64])で、URLはhttps://download.docker.com/linux/ubuntuで、コードネームがfocal(=20.04)のUbuntuに対応していて、カテゴリが安定版(stable)のリポジトリ。
:::

APTに新しくリポジトリを追加したので、リポジトリ情報を更新しておく。

```bash:実行コマンド
$ sudo apt update
```

###**Dockerのインストール**
下準備が完了したので、いよいよDocker本体をインストールする。

```bash:実行コマンド
$ sudo apt install docker-ce
```

ちゃんとインストールできたか確認する。

```bash:実行コマンド
$ sudo docker version
```

```text:表示される結果
Client: Docker Engine - Community
 Version:           20.10.11
 API version:       1.41
 Go version:        go1.16.9
 Git commit:        dea9396
 Built:             Thu Nov 18 00:37:06 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.11
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.9
  Git commit:       847da18
  Built:            Thu Nov 18 00:35:15 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```

無事インストールできた。

最後に、普段使用する一般ユーザーでもsudoなしでdockerコマンドを使用できるように、dockerグループに所属させる。これでdockerコマンドを使用する際に毎回sudoを付け加える必要がなくなる。

```bash:実行コマンド
$ sudo usermod -aG docker $USER
```

:::note info
本設定はOS再起動後に有効となる。
:::

#**お試しでUbuntuコンテナを作成**
折角、Docker環境が構築できたので、試しにUbuntuコンテナを作成してみる。

###**Ubuntuイメージのダウンロード**
Docker Hubより、Ubuntu公式のUbuntuイメージをダウンロードする。

```docker:実行コマンド
$ docker image pull ubuntu
```

イメージがダウンロードできたか確認。

```docker:実行コマンド
$ docker image ls
```

```text:表示される結果
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    ba6acccedd29   8 weeks ago   72.8MB
```

###**Ubuntuコンテナの作成**
ダウンロードしたUbuntuイメージを使って、Ubuntuコンテナを作成する。
コンテナ名は任意の名前を付ける。今回、私はubuntu000とした。

```docker:実行コマンド
$ docker container create --name ubuntu000 -it ubuntu
```

コンテナが作成できたか確認。

```docker:実行コマンド
$ docker container ls -a
```

```text:表示される結果
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS    PORTS     NAMES
5b29c88acf7e   ubuntu    "bash"    20 seconds ago   Created             ubuntu000
```

###**Ubuntuコンテナの起動**
作成したUbuntuコンテナを起動する。

```docker:実行コマンド
$ docker container start ubuntu000
```

コンテナが起動したか確認。

```docker:実行コマンド
$ docker container ls
```

```text:表示される結果
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
5b29c88acf7e   ubuntu    "bash"    10 minutes ago   Up 59 seconds             ubuntu000
```

無事起動できた。Ubuntuコンテナの中に入ってみる。

```docker:実行コマンド
$ docker container exec -it ubuntu000 /bin/bash
```

```text:実行結果
root@5b29c88acf7e:/# 
```

無事入れた。
これで、Ubuntuコンテナの作成は完了です。

#**Docker Composeのインストール**
ついでにDocker Composeもインストールしておく事にした。

###**Docker Composeのバージョン確認**
[GitHubのDocker Compose公式リポジトリ](https://github.com/docker/compose/releases)でバージョンを確認する。私が確認した時点では、最新バージョンはv2.2.2だった。v2からはインストール方法が変わったようで、[Docker公式ドキュメントのこちらのページ](https://docs.docker.com/compose/cli-command/)を参考にインストール。

###**Docker Composeのインストール**
ホームディレクトリに、次のようなDocker ComposeのCLIプラグイン格納用ディレクトリを作成する。

```bash:実行コマンド
$ mkdir -p ~/.docker/cli-plugins/
```

次に、Docker Composeのバイナリーをダウンロードし、実行権限を付与する。

```bash:実行コマンド
$ curl -SL https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-`uname -s`-`uname -m` -o ~/.docker/cli-plugins/docker-compose
$ chmod +x ~/.docker/cli-plugins/docker-compose
```

ちゃんとインストールできたか確認する。

```docker:実行コマンド
$ docker compose version
```

```text:表示される結果
Docker Compose version v2.2.2
```

無事インストールできた。
コマンドもdocker-composeからdocker composeに変わった模様。

お疲れ様でした！