自宅鯖をDocker化+リバースプロキシを導入+WordPress等を立ち上げる

# はじめに
友人に「やっぱ時代はフロントエンドだよな」とぼやいたら、
「うちのサーバーのCentOS6とかいう化石をちょうどなんかしようかなと思ってたところだからUbuntuにしてSSH接続で好きに使っていいよ」
とありがたいお言葉を頂戴しましたのでイチからサーバーを再構築しています。
環境的にはVPSなど外部のサーバーに対して作業を行ってると思っていただけたら良いです。

>追記：
>「やってることフロントじゃなくない？」
>はいすいません、まずは開発環境の構築かなって… 土台が肝心かなって…

そしてフロントエンドいうからには色々新しいことやるかと思い、
**「Ubuntu+Docker+SSL+リバースプロキシ+WordPress」**
といった環境を作りました。
半ば無理やりDockerを使おうとしている節もあるので「この構成まずいよ」という指摘があればぜひ教えて下さい。
（私はフロントの知識ゼロです。バックの知識も大してないです。）




# 参考記事
5年前の記事になりますが、@y_hokkey さんの記事が大変参考になりました。ありがとうございます。
[Vagrant・CoreOS・Dockerでインフラ素人が自宅サーバを立てた話 \- Qiita](https://qiita.com/y_hokkey/items/3dd0d8f20f9daadbbf0b)


# 対象とする読者
前提として以下の方を対象としています。

- **基本的なLinuxの操作を知っている**
- **仮想化・コンテナ技術とは何かを一応知っている**  
私もここ1週間くらいで情報収集したので、それくらいの方
- **まだDockerを触ったことのない方**  
知っている人からは話が長いかもしれませんご了承ください
- **本番環境(サーバー)で構築したい方**  
「ローカル環境で開発してデプロイ」とは違う運用をしています

# 記事一覧
かなり長くなると想定し、各作業別に記事を分けて投稿する予定です。
他の記事も投稿次第リンク化します。

- (0) UbuntuにSSH接続環境構築 (すいませんここは各自で)
- ▶ **(1) Dockerとは + Dockerインストール 🐳＜今ココ**
- [(2) Dockerで"WordPress+Apache+PHP" + "MySQL"を立ち上げる](https://qiita.com/daemokra/items/d23c0c6eb71ac4a49dbb)
- [(3) Dockerでリバースプロキシ\(nginx\)構築\+SSL対応](https://qiita.com/daemokra/items/7fa67c23c15f3353b2a8)


# 環境
- 自宅サーバー
  - OS: Ubuntu 20.04.2 LTS
- Docker
  - verison: 20.10.5, build 55c4c88
- Docker Compose
  - version: 1.28.5, build c4eb3a1
  - ファイルフォーマット: 3.9


# 本題
長いと思った方は[Dockerのインストール](#dockerのインストール)まで飛ばしてください。
# まずDockerとは
## Dockerの流れ

![概念図-DockerFlow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180204/0d163343-3886-377e-f4a3-0c14a30066e3.png)


基本的なDockerの流れが上の図です。

Dockerfileを`build`し、Docker Imageが作成されます。
Docker Imageを`run`し、Dockerコンテナが立ち上がります。
Dockerfileは図のように`FROM ***`と他のDockerfileを継承して作られています。
WordPressのDockerfileなら `php:apache`を、
PHPのDockerfileは`debian`を・・・
最後は`scratch`に行き着きますが、これがDockerfileの基本となります。

しかし個人開発の実態としては次の図のとおりでしょう。

![概念図-DockerFlow2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180204/f671f155-0bf9-e66f-bce3-b6aa1f0b5780.png)


Docker Hubに既にビルドされたイメージが配布されているので、使いたいイメージをローカル環境に`pull`し、それら複数のイメージを`docker-compose`で立ち上げます。
Docker Hubには基となっているDockefileがGitHub上で公開されています。これを個人でカスタマイズで`build`して利用することも可能です。
`run`コマンドではなく、Docker Composeを利用するメリットは複数のコンテナを簡単に管理できることです。
一つ一つ`docker run`で立ち上げることも可能ですが、実際には
`docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p`
といった長いコマンドを複数打たなければいけません。これは現実的ではないのでDocker Composeといったツールが必要になってきます。また様々な設定も可能です。
この様なツールを **「コンテナオーケストレーションツール」** といいます。
Docker ComposeはDockerが公式で用意している簡易的なツールですが、
現在はGoogleが開発した「Kubernetes(クーベネティス)」を代表に様々なツールが開発されています。

個人利用ではDocker Composeで十分といったところでしょうか。

ローカル環境でDockerを使って開発した人はそれをイメージ化しデプロイとなります。（あってる？）



## Dockerの構成図

![概念図-Page-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180204/187cc8e2-981d-b585-f489-b874911e186b.png)


上記がスタンダードな構成になるかと思います。

1. ホスト - 今回のUbuntuサーバーです。
2. Docker Engine - この中でコンテナを動かします。
3. Docker Compose - 複数のコンテナを管理してくれるものです。
4. Docker Hub - イメージリポジトリです。（ユーザーが投稿したものもあります）

そして次に示すのが、本記事の完成図です。

![概念図-Page-2のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180204/d22654fc-4e0e-8556-d4aa-61dad9340a6f.png)
※2021/03/26 画像差し替えました

概念は伝わりましたでしょうか。まだ掴めてないかもしれませんが、次のWordPressを立ち上げる記事でもう少し詳しく説明する予定ですので、実際に動かしてみてわかるかと思います。
次におおまかなディレクトリ構成を下記に示します。

![概念図-Directory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180204/948b3d62-94be-5f4e-3e48-b7a48f4d860d.png)


コンテナは終了してもう一度開始するとデータが初期化されます。そのため**「データの永続化」**が必要となります。
永続化させることによって、次回起動時もそのファイル群がコンテナ内にマウントされます。
なんとなくイメージは掴んでいただけたでしょうか。


## Dockerに関する用語の説明
他にも用語はたくさんありますが、@rawHamさんが「冷凍チャーハン」を例にわかりやすく解説されていますので紹介します。
[Dockerについてなるべくわかりやすく説明する \- Qiita](https://qiita.com/rawHam/items/80ba13d2d2d56dba411e)

また個人的に疑問となったところも紹介します。

- イメージとコンテナの違い
[初心者向け！docker image（イメージ）とは？コンテナとの違いは何？](https://programing-school.work/wp-content/uploads/2019/02/docker.001.jpeg)
[Dockerのイメージとコンテナの違い \| CodeCampus](https://blog.codecamp.jp/programming-docker-image-container)

- "Docker"と"Docker-CE"の違い
[DockerとDocker\-CEの違いについて \- Qiita](https://qiita.com/s-suefusa/items/cb3c4044da3b3657dbd0)




## Dockerを導入するメリット
ここまでDockerの説明をしましたが、開発環境で導入するメリットは最小単位でコンテナの中で開発できそれを簡単にAWS等にデプロイできるという点です。
では個人の自宅サーバーでDockerを導入するメリットは何でしょうか。
正直ブログともう1個のサービスしかない程度のサーバーでは大したメリットはないように感じます。
「他環境に移行が容易になりそうなこと」「割とトレンド技術であるDockerを学べる」「バックアップが簡単そう」ぐらいしか思いつきません。
もしかしたら知らないうちにメリットを享受しているのかもしれません。
しかしそんなメリットより、初期導入コストが高いように感じます。

まずDockerについて学習しなければならないのと、最初はやたら設定することが多いですし恐らくつまづきます。1回設定したら後はメンテナンス・保守するだけなのでそこは簡単そうですが…。（素人意見です。）
コメントでもいいので自宅鯖でのメリットを誰か教えて下さい😊


(参考)

- [Dockerが日本で流行らない理由、あるいは本番環境へ導入されない理由：「企業のためのDocker実践ガイド」セミナーレポート \- ＠IT](https://www.atmarkit.co.jp/ait/articles/1703/27/news006.html#)
- [自宅サーバーでこそDockerは活躍する \| Cosnomi Blog](https://blog.cosnomi.com/posts/345/)
- [Docker \- "おうちDocker"のベストプラクティスを教えてください｜teratail](https://teratail.com/questions/171666)
- [「個人開発でDockerいらないじゃん」が大きな勘違いだった理由 – 35からのプログラミング](https://from-age35.com/1939.html)
- [事例から考えるDockerの本番利用に必要なこと \| Think IT（シンクイット）](https://thinkit.co.jp/article/9701)
- [AWS\(Amazon Web Services\) \- Dockerを本番環境で使用するケースについて｜teratail](https://teratail.com/questions/266808)


以上でDockerの説明を終わります。


# Dockerのインストール
公式のドキュメントは英語ですが、最新は公式ドキュメントになりますのでそちらを読み進めていただいたほうがよろしいかと思います。
https://docs.docker.com/engine/install/

インストールの方法は3つあります。

- Docker公式リポジトリを追加してそこからインストール
- 手動でDEBパッケージをダウンロードしてインストール
- スクリプトを利用してインストール

今回は公式リポジトリからのインストールで進めます。

また、使用しているOSやディストリビューションでも異なりますので、自分にあったドキュメントをお読みください。
以下はUbuntu環境での説明になります。

## 必要なパッケージのインストール
```
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
```

- `apt-transport-https`: aptコマンドをHTTPS対応させる
- `ca-certificates`: SSL接続に必要
- `curl`: URLからファイルを転送するコマンド
- `gnupg`: 「Gnu Privacy Guard (GPG)」。公開鍵認証で使う。署名等に使うツール。
- `lsb-release`: "lsb = Linux Standard Base" Linuxのバージョン等を表示してくれるツール。

上記パッケージがなければインストール、あればアップデートをします。

## リポジトリ追加
DockerのGPG鍵を入手します。
GPGとは・・・リポジトリの正当性を確かめる手段・技術
(参考)[GNU Privacy Guard \- Wikipedia](https://ja.wikipedia.org/wiki/GNU_Privacy_Guard)

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```


次にリポジトリを追加します。
⚠ **x86_64 / amd64**版です。他のアーキテクチャを利用している方は公式ドキュメントをお読みください。

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

## パッケージインストール
最後に各種Docker関連パッケージをインストールします。
**※Docker Composeは含まれておりません。**

```
sudo apt-get update

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

## Hello World

```console
sudo docker run hello-world
```

```:実行結果
$ sudo docker run hello-world
[sudo] user のパスワード:

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/
```
hello world 実行できたらOKです。

Q. Hello Worldイメージはどこからきたの？
A. インストール時に自動的にDocker Hubからダウンロードされています。


# Docker Composeインストール
続いてDocker Composeのインストールです。
## docker用のユーザの追加
dockerをsudoなしでroot権限で利用するために以下の作業をします。必須ではないようですが、作業が簡単になります。
※root権限なし版（ルートレス）のDockerもあります。
(公式)[Post\-installation steps for Linux \| Docker Documentation](https://docs.docker.com/engine/install/linux-postinstall/)

既にある作業用ユーザを流用してもいいですが、Docker用のユーザーを作っても構いません。

まず、dockerグループを作ります。

```
sudo groupadd docker
```

次にユーザーをdockerグループに追加します。
`<USER>`は各人のユーザー名を入れてください。

```
sudo usermod -aG docker <USER>
```

sudoなしでdockerを実行できることを確認します。（ユーザーは切り替えてください）

```
docker run hello-world
```

実行できればOKです。


## Docker Composeのダウンロード
公式ドキュメント↓
[Install Docker Compose \| Docker Documentation](https://docs.docker.com/compose/install/)

Docker Compose本体をダウンロードします。

```
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

実行権限をつけます。

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

`docker-compose --version`を実行してバージョンが出ればOKです。

```
$ docker-compose --version
docker-compose version 1.28.5, build c4eb3a1f
```

# おわり
次回はWordPress等を立ち上げます。
来週あたりに書きます。
3/27 書きました↓
[自宅鯖のDocker内でWordPressを構築する \- Qiita](https://qiita.com/daemokra/items/d23c0c6eb71ac4a49dbb)