はじめてのDocker：インストールから実行まで

本記事ではDockerをサーバーにインストールし、Dockerを利用する下準備をまずは実施します。
その後、実際にDockerを使用してWebサーバーを動かしてみるところまで実践します。

# 目次
1.概要
2.Dockerのインストール
3.Dockerの実行

# 1.概要
・EC2インスタンス（Ubuntu）にDockerをインストールします。
・Dockerを利用してWebサーバーを稼働させます。
・参考：https://codezine.jp/article/detail/12830

### 【基本用語】
・コンテナ：アプリケーションを実行環境とともに「コンテナ」としてパッケージ化し、異なるコンピューティング環境間で利用できます。

・Docker：Docker社が開発したコンテナ実行環境のこと。

・Dockerイメージ: アプリケーションとその実行に必要なすべてのファイルと依存関係が含まれる静的なファイルです。これをもとにコンテナが生成されます。

・Dockerコンテナ: Dockerイメージからインスタンス化された、実行中のアプリケーション環境です。イメージを基にして動的に作成され、削除が容易です。

・Docker Hub: Dockerイメージを共有するための公式なリポジトリです。ユーザーはここからイメージをダウンロード（pull）したり、自分のカスタムイメージをアップロード（push）したりできます。
https://www.docker.com/ja-jp/products/docker-hub/

# 2.Dockerのインストール
### 【概要】
EC2インスタンス（Ubuntu）にDockerをインストールし、Dockerを利用できる環境を構築します。

### 【参考】
https://www.kagoya.jp/howto/cloud/container/dockerubuntu/

### 【手順】
・パッケージリストを更新
```ruby
sudo apt-get update
```

・パッケージをインストール
```ruby
sudo apt-get install
```

・公式のGPGキーを保存するディレクトリを作成
```ruby
sudo mkdir -p /etc/apt/keyrings
```
※GPGキーとは：「GnuPG」（GNU Privacy Guard）という暗号化ソフトで生成される公開鍵のことです。
Linuxの場合、apt-getやyumコマンドを利用してインターネットから入手するパッケージが正しい配布先からのものかどうか公開鍵方式にてチェックします。

・GPGキーを取得
```ruby
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```

・公式のDockerリポジトリを追加
```
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
```
・改めてパッケージリストを更新
```ruby
sudo apt-get update
```

・Dockerをインストール
```ruby
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
これでDockerのインストールは完了です。

・sudo権限なしでDockerを実行できるようにする。
```
sudo usermod -aG docker $USER
su - ${USER}
```

・Dockerの動作確認
　DockerコマンドでDockerのバージョンを確認できたら正常にインストールされています。
```
docker -v
```

# 3.Dockerの実行
### 【概要】
・Dockerのインストールが完了した為、実際に動かしてみる
・DockerイメージはDocker hubからとってくる
・Docker hubからApacheのイメージを取得する 


### 【参考】
https://qiita.com/hamburg-love/items/ec6efdcac82d59eeb4ac


### 【手順】
・Dockerのイメージを選択
　Dockerhub（`https://hub.docker.com/`）からイメージをダウンロードします。
　今回は「Apache」を選択します。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763418/9863e060-2a57-b7ef-3231-169842fc9d9d.png)

・Dockerイメージをダウンロード
　Docker pullコマンドを実行しダウンロードする。
　バージョンを指定しない場合、最新（latest）バージョンがダウンロードされます。
```
docker pull httpd
```
出力結果例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763418/c5da8c28-1fcd-9faa-d83e-4a9c0b633ae9.png)


・ダウンロードの確認
　Dockerイメージがダウンロードされ、コンテナはまだ存在していない状態です。
```
docker image ls
```

・コンテナの作成と実行
　Docker runコマンドで、dockerイメージからコンテナを作成・実行します。
```
docker run -d -p 8080:80 -v "/opt/app/:/usr/local/apache2/htdocs/" httpd:latest
```
◆オプション
-d ：コンテナをバックグラウンド実行するオプション。ターミナルから独立してコンテナを実行する際に利用され、ターミナルを閉じてもコンテナは稼働し続けます。

-p ：ホストOSのポートとコンテナのポートをマッピングできます。特定のポートでリッスンしているコンテナを外部（ホストマシンやネットワーク上の外部マシン）からアクセスするために使用されます。今回の場合、Apacheのコンテナはポート80番で実行されているため、外部からApacheにアクセスするには、ホストOSのポート（8080番）をコンテナのポート80番に対してマッピングする必要があります。

-v：ホストOSとファイルシステムを共有するために利用され、ホストのディレクトリまたはファイルをコンテナのファイルシステムにマウントできます。WebサーバーなどのHTMLファイルの静的ファイルはホストOS上に配置し、コンテナにマウントするのが一般的みたいです。（ファイルの更新がスムーズになる）

・コンテナが作成されたのか確認
```
docker ps -a
```

・ホストOS側のコンテナに紐づくディレクトリにてHTMLファイルを配置
　Index.htmlファイルを編集し、“hello world”を記載。
```
sudo vi /opt/app/index.html
```

・ブラウザでサーバーのIPとコンテナに紐づけているポート番号を指定しアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763418/1ce6b040-5227-ce90-58e2-30f3c52d27e4.png)
稼働しているコンテナのWebサーバーにアクセスできました。

# まとめ
今回はDockerのインストールからコンテナを作成してWebサーバーにアクセスまで実践しました。