Docker環境の構築 - Ubuntu18.04

# Dockerとは

３つの特徴

- リソース効率がよい
- ポータビリティがある
- 環境の起動が早い

Dockerについての詳細は他のサイトや書籍で詳しく説明されているので、そちらを参照してください。
本稿ではDockerの環境構築について、まずローカル環境にインストールする方法について紹介します。

おすすめサイト：

- [初心者のためのDockerの使い方メモ - MyEnigma](https://myenigma.hatenablog.com/entry/2018/09/16/145933)
- [Docker入門（第一回）～Dockerとは何か、何が良いのか～ | さくらのナレッジ](https://knowledge.sakura.ad.jp/13265/)

おすすめ参考書：

- [Docker/Kubernetes 実践コンテナ開発入門 | 山田 明憲 |本 | 通販 | Amazon](https://www.amazon.co.jp/Docker-Kubernetes-%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E6%98%8E%E6%86%B2/dp/4297100339)

[](###########################################################)

# Dockerのインストール(Ubuntu18.04)

Docker公式サイトの[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)を参考にインストール方法を紹介します。
本稿では、Docker CE 19系のインストールを行います。

[](###########################################################)

## リポジトリのセットアップ

aptを更新してから必要なパッケージをインストールしておく。

```bash
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
```

Dockerの公式GPG鍵を追加する。

```bash
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# keyの確認
$ sudo apt-key fingerprint 0EBFCD88
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]
```

stable版のリポジトリを設定する

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

[](###########################################################)

## Docker Engineのインストール

- **最新版のインストール（推奨）**

aptを更新してから、最新版のDocker Engineとcontainerdをインストール。

```bash
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
```
> 複数のDockerリポジトリを有効にしている場合、`apt install`や`apt update`コマンドでバージョンを指定せずにインストールやアップデートを行うと、常に可能な限り高いバージョンがインストールされます。

- **バージョン指定でインストール**

下記コマンドでインストール可能なバージョン一覧を表示する。

```bash
$ apt-cache madison docker-ce
 docker-ce | 5:19.03.11~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 5:19.03.10~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
...
```
バージョンを指定して`apt install`する。

```
$ sudo apt install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

# 例）<VERSION_STRING> = 5:19.03.11~3-0~ubuntu-bionic
```

[](###########################################################)

## 動作確認

インストールしたDockerのバージョンを確認。今回は`Version = 19.03.11`がインストールされたことが確認できます。

```bash
$ docker version
Client: Docker Engine - Community
 Version:           19.03.11
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        42e35e61f3
 Built:             Mon Jun  1 09:12:22 2020
 OS/Arch:           linux/amd64
 Experimental:      false
```

`hello-world`イメージを実行して、正しく動作することを確認する。
以下のような表示がされれば正常に動作しています。

```bash
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest

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

ダウンロードした`hello-world`イメージを一覧表示する。

```bash
$ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        5 months ago        13.3kB
```
コンテナの情報出力を確認する。

```bash
$ sudo docker ps --all
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
5b4c35a7c747        hello-world         "/hello"            3 minutes ago       Exited (0) 3 minutes ago                        quirky_buck
5478109230b1        hello-world         "/hello"            25 minutes ago      Exited (0) 25 minutes ago                       elastic_mclaren
```
※`docker ps -a`でも同様
※`docker ps`の場合、実行中のコンテナのみ表示される

コンテナの情報出力`ps`コマンドの詳細は[こちら](https://qiita.com/chihiro/items/3162a484fd257e114c18)を参照。

[](###########################################################)

## Docker デーモンの起動

Dockerをインストールしたら、Dockerデーモンを起動する必要があります。
多くのLinuxディストリビューションでは、`systemd`を使ってDockerデーモンを起動するようです。

```bash
$ sudo systemctl start docker

# 他のディストリビューションでは、次のように実行します
$ sudo service docker start
```

Docker をブート時に自動起動したい場合は、以下のコマンドを利用してください。

```bash
$ sudo systemctl enable docker

# 他のディストリビューションでは、次のように実行します
$ sudo chkconfig docker on
```

- 例）実行すると以下のように表示されると思います。

```bash
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabl
   Active: active (running) since Sat 2020-06-06 15:19:18 JST; 21min ago
     Docs: https://docs.docker.com
 Main PID: 5396 (dockerd)
    Tasks: 17
   CGroup: /system.slice/docker.service
           └─5396 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.
```

[](###########################################################)

# root権限なしでDocker利用可能とする

```bash
# ユーザー名の確認
$ whoami
mjan

# Dockerグループの確認
$ cat /etc/group | grep docker
docker:x:999:

# "mjan"をDockerグループに追加
$ sudo gpasswd -a mjan docker
ユーザ mjan をグループ docker に追加

# Dockerグループに追加されていることを確認
$ cat /etc/group | grep docker
docker:x:999:mjan
```

Dockerが使用するソケットを一般ユーザでも読み込み出来るように権限を変更する

```bash
$ sudo chmod 666 /var/run/docker.sock

# 確認
$ ls -l /var/run/docker.sock
srw-rw-rw- 1 root docker 0  6月  6 15:19 /var/run/docker.sock
```

> ※`chmod 666`でパーミションを指定しています。詳しくは[パーミッション早見表](http://hayakawa.ddo.jp/beginner/ux/permit.html)を参照。


権限付与前は`Client`側しか表示されなかったが、`Server`側も表示されるようになった。

```bash

$ docker version 
Client: Docker Engine - Community
 Version:           19.03.11
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        42e35e61f3
 Built:             Mon Jun  1 09:12:22 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.11
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       42e35e61f3
  Built:            Mon Jun  1 09:10:54 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```

コンテナ情報を出力する`docker ps -a`コマンドも`sudo`なしで実行できるようになりました。

```bash
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
5b4c35a7c747        hello-world         "/hello"            3 minutes ago       Exited (0) 3 minutes ago                        quirky_buck
5478109230b1        hello-world         "/hello"            25 minutes ago      Exited (0) 25 minutes ago                       elastic_mclaren
```

[](###########################################################)

# Dockerのアンインストール(Ubuntu18.04)

Docker Engine、CLI、Containerdパッケージをアンインストールする場合。

```bash
$ sudo apt-get purge docker-ce docker-ce-cli containerd.io
```

上記コマンドだけでは、ホスト上のイメージ、コンテナ、ボリューム、またはカスタマイズされた設定ファイルは自動的には削除されません。全てのイメージ、コンテナ、ボリュームを削除するには以下のコマンドも実行してください。

```bash
$ sudo rm -rf /var/lib/docker
```

[](###########################################################)

# Dockerの基本動作

次はDockerの基本動作を確認してみましょう。

| ▶ [Dockerの基本動作 - Qiita](https://qiita.com/M-jan/items/0d5fa60e92bc0cb26e60)| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650551/feb31df8-8824-235d-1b5e-2a563626a5f8.png" width=180>|
|:--|:-:|

[](###########################################################)

# 参考サイト

- [Ubuntu 18.04にDockerをインストールする(+docker-composeも) - Qiita](https://qiita.com/iganari/items/fe4889943f22fd63692a)
- [Install Docker Engine on Ubuntu | Docker Documentation](https://docs.docker.com/engine/install/ubuntu/)
- [Orientation and setup | Docker Documentation](https://docs.docker.com/get-started/)
- [systemd と Docker の管理・設定 — Docker-docs-ja 1.9.0b ドキュメント](http://docs.docker.jp/engine/articles/systemd.html)
- [Linux グループ一覧の確認と/etc/group ファイル](https://kazmax.zpp.jp/linux_beginner/etc_group.html)
- [パーミッション早見表](http://hayakawa.ddo.jp/beginner/ux/permit.html)
- [「Got permission denied while trying to connect to the Docker daemon socket」への対応 - Qiita](https://qiita.com/ashidaka/items/734856443f922ff175b1)