初心者がコンテナを学ぶ(´･ω･`)

# この記事について
 

■ 対象：<font color="DeepSkyBlue">**IT初心者しょぼん君：**</font color>(´･ω･`)
・初心者向け、イメージを掴むキッカケになることが目的の記事
・砕いた理解であり、一部正確ではない場合があります。

■ しょぼん君のぼやき
<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『コンテナ化ってどゆこと』


# コンテナとは
コンテナとは、OSやカーネルを共通する自己完結のソフトです。
最初はアプリケーションを動かす方法・場所とイメージしたら良いかもしれません。

コンテナ と聞くと、箱のようなイメージを持つかもしれませんね。実際に港などにあるコンテナと絡めた解説もよくあるかもしれませんが、あまり単語にこだわらなくても良いです。

これまで開発したアプリを動かす場合はどうしていたでしょうか。
<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『実効環境にアプリを置いて動かすな』

はい、サーバー上の実効環境にアプリケーションをデプロイをして動かしたりしますよね。
この方法はポピュラーです。この時アプリケーションはどこで動いているの？というとサーバーです。そりゃそうですね。

しかし、技術は進歩し人類はアプリケーションの構成・ライブラリ・プロセスなどをまとめ1つのプロセスとして稼働させたのであります。そしてそれを「コンテナ」と名づけたのであった！ 

〜 終 〜

<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『終わるな』

簡易的な図ですが、基盤となるLinuxサーバーのOS機能(カーネルなど)を使い、コンテナランタイムと呼ばれるものがサーバーからリソースなどレンタルして、アプリをプロセスとして稼働させる場を提供しています。

そして、このような技術や提供される空間のことをコンテナと呼んでいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147613/e57a30ea-5791-9d05-7a77-d18d3a4ceb56.png)



<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『サーバーとの間になんかおるんだね』


別空間という点では、仮想サーバーと似ていると感じるかもしれませんが異なります。
例えば、仮想サーバーではOSレベルで仮想環境を分離するため目的やメリットが異なります（LinuxやWindowsなど様々なOSを混在させることが可能など）

コンテナではOSを含まないことで軽量でありつつも、基盤となるLinuxサーバーのOSバージョンや他のアプリケーションの変更による影響が最小限になる点がメリットの1つです。また、別のサーバー上で同じアプリケーションを起動する際にも、コンテナランタイムが導入されていればすぐに同環境で起動することが可能であり、再利用性にも優れています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147613/50a41a29-7c6e-dded-03b9-246a90f52fde.png)


<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『環境依存が少ないのはいいね』

設定方法など、コンテナ起動までの流れは実際にコンテナを起動して体感してみましょう。

# Docker
コンテナは、Dockerなどのコンテナランタイムを含むコンテナを管理するためのソフトウェアを導入して利用します。

### (0)Dockerインストール（Docker for Mac）
まずは、Dockerをインストールします。利用するには Docker ID が必要です。
まだ持っていない場合は、以下から「Docker ID」を取得します。

https://hub.docker.com/

ID取得後、ソフトウェアをダウンロードしましょう。
https://store.docker.com/editions/community/docker-ce-desktop-mac

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147613/bf36d882-167c-a3a5-67e3-4cff00e31e56.png)


ダウンロードした「Docer.dmg」を実行し、作成した「Docker ID」でログインします。
アプリケーションからDockerを起動し、ターミナルでDockerコマンドが使えるか確認してみましょう

``` 確認コマンド.
% docker version
```


### (1) Dockerfile を作成
コンテナは、バージョンの指定や、ディレクトリ構成などの構築設定をコードベースで管理（Infrastructure as Code）します。
Dockerでは、Dockerfileと呼ばれる、構築内容が書かれたファイル（構築内容が書かれたレシピ）をベースにして構築するため、まずは任意のディレクトリでDockerfileを作成しましょう。

今回は流れを把握するために単純なサンプルファイルを用意しました。

```:Dockerfileを作成
% mkdir Docker && cd $_ && vi Dockerfile

# 内容サンプル
FROM ubuntu:18.04
RUN echo "Hello world" > /tmp/test
```
>
`FROM　<レポジトリ：タグ>`
コンテナの基になるイメージを指定。
FROM命令では、コンテナの基となるイメージを指定しますが、ローカルにない場合はDockerレジストリ（docker hub など）からダウンロードされます。
`RUN　<コマンド>`
コマンドを実行

### (2) Build
作成したDckerfileでビルドを実行すると image　が生成されます。
これはアプリケーションや依存関係を1つにまとめたファイルで、コンテナを起動するための元になります。

<font color="DeepSkyBlue">**しょぼん君：**</font color>(´･ω･`)『じゃあ再利用したい時は image を共有したらいいんだね』

ビルドの際は、管理しやすいように名前やタグをつけるのがオススメです。
今回は、shobon_imageという名前で、タグとしてバージョン1.0をつけてみました。

```:Dockerfileからimageをビルド
% docker build -t shobon_image:1.0 .

Sending build context to Docker daemon  9.216kB
Step 1/1 : FROM ubuntu:18.04
18.04: Pulling from library/ubuntu
35c102085707: Pull complete
251f5509d51d: Pull complete
8e829fe70a46: Pull complete
6001e1789921: Pull complete
Digest: sha256:d1d454df0f579c6be4d8161d227462d69e163a8ff9d20a847533989cf0c94d90
Status: Downloaded newer image for ubuntu:18.04
 ---> a2a15febcdf3
Successfully built a2a15febcdf3
Successfully tagged shobon_image:1.0

```

```:imageの確認
% docker images

REPOSITORY                                       TAG                 IMAGE ID            CREATED             SIZE
shobon_image                                     1.0                 df4620745396        16 seconds ago      64.2MB
ubuntu                                           18.04               a2a15febcdf3        7 days ago          64.2MB
```

### (3)RUN_起動

作成したイメージを指定し、コンテナを起動します。
起動したら、Dockerのプロセスとして動いたか確認してみましょう。

```:起動し、プロセスとして動いたことを確認
% docker run --name shobon_contener -itd shobon_image:1.0 /bin/bash

% docker ps
CONTAINER ID   IMAGE              COMMAND       CREATED         STATUS         PORTS     NAMES
edb3215685ee   shobon_image:1.0   "/bin/bash"   3 seconds ago   Up 2 seconds             shobon

```

Dockerfileに記載した内容で構築されたかコンテナ内部にログインして確認します。

```:コンテナ内部での確認
# execコマンドでコンテナ名やコンテナIDを指定し、コンテナにログインします。
% docker exec -it shobon /bin/bash

# コンテナ内部に入れたので、作成したtestファイルが存在するか確認
root@edb3215685ee:/# ls /tmp/
test

# OSのバージョン確認
root@edb3215685ee:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

```

Dockerfileで設定した内容で構築されていることが確認できました。

<font color="DeepSkyBlue">**しょぼん君：**</font color>(｀・ω・´)『Dcokerfikeで記載した内容でDockerプロセスとしてコンテナが起動するということがわかった』


ーENDー
# Tips
### お掃除
Dockerでコンテナを起動していると、たくさんのimageやpｓが溜まってくるので不要なものは削除します。

```:Dockerプロセスを確認し、停止、削除
% docker ps -a
CONTAINER ID   IMAGE                                          COMMAND                  CREATED          STATUS                      PORTS                                                       NAMES
edb3215685ee   shobon_image:1.0                               "/bin/bash"              29 minutes ago   Up 29 minutes                                                                           shobon

% docker stop edb3215685ee
edb3215685ee

% docker rm edb3215685ee
edb3215685ee

```
この時点では、image残っているため再度起動することが出来ます。
imageも消してしまいましょう。

```:imageの一覧を確認し、対象のイメージを指定して削除
% docker images
REPOSITORY                                      TAG             IMAGE ID       CREATED          SIZE
shobon_image                                    1.0             6f2828748274   34 minutes ago   63.1MB

% docker rmi 6f2828748274
Untagged: shobon_image:1.0
Deleted: sha256:6f282874827492876f496dfc26c1eb0174eec8a2ecec543f2b15d078c06f3d74
```

# Appendix
■ リンク
- [しょぼん君シリーズの他記事(´･ω･`)](https://qiita.com/shobooon/items/90b0d1d7db5e7bd6ca56)