今からでも遅くない!! dockerとdocker-composeをubuntuにインストール

# 前置き
- Dockerを使いこなしている人はUbuntuに再インストールするときの忘備録としてお役立てください
- Dockerの公式ドキュメントに解説をところどころ加えた記事です


# インストール環境
私のインストールするUbuntuの環境です。

```terminal:terminal
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.2 LTS
Release:	    18.04
Codename:	    bionic
```


# dockerのインストールと起動

`docker` コマンドが使えるようにしていきましょう。

## インストール

- 参考
    - [【公式ドキュメント】Get Docker Engine - Community for Ubuntu | Docker Documentation](https://docs.docker.com/install/linux/docker-ce/ubuntu/)

```bash:terminal
sudo apt-get remove docker docker-engine docker.io containerd runc

sudo apt-get update

sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg-agent \
     software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# :OUTPUT: 
# OK

sudo apt-key fingerprint 0EBFCD88
# :OUTPUT:
# pub   rsa4096 2017-02-22 [SCEA]
#      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
# uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
# sub   rsa4096 2017-02-22 [S]

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

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io

sudo docker run hello-world
# :OUTPUT:
# Hello from Docker!
# This message shows that your installation appears to be working correctly.
# ...(以下略)
```

最後の `sudo docker run hello-world` はインストールできたかどうか確認するためのおまけです。必ず行う必要はありません。

## Docker Daemonの起動

- 参考
    - [Control Docker with systemd | Docker Documentation](https://docs.docker.com/config/daemon/systemd/)

### Daemon（デーモン）とは?

一応Daemonの説明をしておきます。
Daemonというのは、裏で常駐しているソフトやシステムのことです。
Daemonはジョブが来たら動かして、ジョブが終われば待機しています。
（ただし、Daemonという言葉はLinuxやUnix、macOSに限定されています。WindowsではServiceと呼ばれています。）
`httpd` や `sshd`のように後ろに `d` が付いている場合にはDaemonなんだと解釈して下さい。

### 起動方法

- 手動で起動

```bash:terminal
sudo service docker start
```

- OSの再起動時に自動でDocker Daemonを自動で起動させる

```bash:terminal
sudo systemctl enable docker
# :OUTPUT:
# Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
# Executing: /lib/systemd/systemd-sysv-install enable docker
```
 
# Docker Composeのインストール

- 参考
    - [Install Docker Compose | Docker Documentation](https://docs.docker.com/compose/install/)
    - [Releases · docker/compose](https://github.com/docker/compose/releases)

`docker-compose` は `pip` でもインストールできます。
後々dockerをアップデートしていくこと前提なら `pip` 経由でのインストールが楽です。
なんのこっちゃわからない人は↑の事は忘れてください笑

```bash:terminal
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# :COMMENT:
# 上の1.24.1はGithubでバージョンを確認して適宜変更してください（参考にReleasesのリンクを貼ってあります）

sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version
# :OUTPUT:
# docker-compose version 1.24.1, build 4667896b
```

# dockerコマンドをsudo無しで実行

- 参考
    - [Post-installation steps for Linux | Docker Documentation](https://docs.docker.com/install/linux/linux-postinstall/)

ユーザーをdockerグループに追加します。

試しに `$ docker-compose` と打ってみましょう。次のOUTPUTが返ってきたらdockerグループに入れることが必要です。

```terminal:terminal
$ docker-compose
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied
```

dockerグループに入れます。

```bash:terminal
sudo groupadd docker
# :OUTPUT:
# groupadd: group 'docker' already exists
# :COMMENT:
# dockerグループが既に存在していると上のメッセージが返ってきます。
# dockerをインストールしたときに作られているはずです。

sudo usermod -aG docker $USER
# :COMMENT:
# 初心者の人へ
# $USERは現在のユーザー名が入っています。手で自分のユーザー名を入力する必要はありません。
# 不安なら念の為以下のコマンドを打ってみましょう。
# echo $USER

newgrp docker
# :COMMENT:
# グループへの追加を反映させるコマンドです。
```

もう一度 `docker ps` を打ってみましょう。次のものが出てくれば完了です。お疲れ様でした。
ちなみに、 `docker ps` は起動しているDockerコンテナの一覧を表示させるコマンドです。 `ps` はprocessの略ですね。

```terminal:terminal(output)
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```


以上です。お疲れさまでした。