[初心者向け]Dockerチュートリアル

# はじめに

- DockerではWindows仮想環境・Linux仮想環境どちらも利用することが可能です。

- ただし、Windows仮想環境を利用するためには、Dockerを起動する（ホスト）OSがWindows 10 Professional/EnterpriseやWindows Serverなどでなければなりません。詳細は以下のURLを参照してください。
https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/deploy-containers/system-requirements

- Linux仮想環境を利用する際にはホストOSに特別な制限は無いようで、Dockerが利用できる環境であれば大丈夫です。


# 1. Dockerのインストール

まずは使用するマシンにDockerをインストールします。こちらからインストーラーをダウンロードします。
https://www.docker.com/products/docker-desktop
ダウンロードした後は案内に従ってインストールするだけです。

インストールが完了したらPowerShellを開き、以下のコマンドを実行します。

```
> docker --version
Docker version 20.10.7, build f0df350
```

Dockerのバージョンが表示されればインストールは成功です。


# 2. Dockerを使う

## 2.1 イメージとコンテナ

Dockerを使う前に必要な概念を説明しておきます。

- イメージ  

”イメージ”というのは、Dockerで構築する環境の設計図のようなものです。例えば「CentOSのイメージ」、「Ubuntuのイメージ」などがあります。単にOSを指定するだけでなく、「CentOSにpython3.8をインストールしたイメージ」や「Ubuntuにgccをインストールしたイメージ」などを作成することも可能です。このように、Dockerでは必要な仮想環境を自分でカスタマイズし、利用することが可能です。

DockerHubというサイトでは多くのイメージが公開されています。

https://hub.docker.com/

DockerHubで公開されているイメージを使用するためには、以下のコマンドを実行します。

```
> docker pull ubuntu
```

イメージを取得したら以下のコマンドを実行して、ローカルに保存されているイメージを確認できます。

```
> docker images
REPOSITORY       TAG       IMAGE ID       CREATED        SIZE
ubuntu           latest    7e0aa2d69a15   3 months ago   72.7MB
```

`REPOSITORY`というのがイメージの名前、`TAG`というのがタグです。タグは例えばバージョン違いを選択する際に使用するもので、ubuntuの場合には"18.04"や"20.04"などがあります。"latest"というのは最新バージョンを使用するという意味です。

- コンテナ

実際に仮想環境を利用するためには、イメージからコンテナと呼ばれるものを作成する必要があります。例えば、ubuntuのイメージからubuntu-container1というコンテナを作成し、ubuntu-container1の中で様々な作業を行います。同じubuntuのイメージから別のubuntu-container2というコンテナを作成して、別の作業を行うこともできます。


## 2.2 コンテナの作成・起動

では実際にDockerを使ってみます。

```
> docker run -it ubuntu
root@31b9f780fe43:/#
```

上記のrunコマンドを実行すると、コンテナを作成し、起動してログインするところまでを一括して行なえます。
コンテナから抜けたい場合は`exit`と入力すれば良いです。

作成されたコンテナの状態を確認するには`ps`コマンドを使用します。

```
> docker ps -a
CONTAINER ID   IMAGE          COMMAND        CREATED        STATUS                        PORTS   NAMES
f1e4bc9b1885   ubuntu:latest  "/bin/bash"    2 months ago   Exited (0) 2 minutes ago               ubuntu-container
```

"ubuntu-container"のところはコンテナの名前ですが、今回は特に指定していませんのでDockerが適当な名前を自動でつけていると思います。

一度作成したコンテナを再び起動する場合は`start`コマンドを使用します。

```
> docker start ubuntu-container
```

起動しているコンテナの中に入って操作をする場合は`exec`コマンドを使用します。

```
> docker exec -it ubuntu-container /bin/bash
```

`-it`というオプションは起動したコンテナをインタラクティブに操作するというような意味合いです。コンテナ名の後には、そのコンテナで使用するシェルを指定しています。

起動しているコンテナを終了する場合は`stop`コマンドを使用します。

```
> docker stop ubuntu-container
```

コンテナを削除する場合は`rm`コマンドを使用します。

```
> docker rm ubuntu-container
```


# 3. Dockerfileを使う

ここまではDockerHubから取得したイメージをそのまま利用していました。ただ、実務ではpythonやgccをインストールして利用したいということがあると思います。そういったときに毎回コンテナを起動してから手動で設定するのは面倒です。そこで、そいういったカスタマイズを簡単に行うDockerfileを使ってみます。

適当なフォルダに"Dockerfile"というテキストファイルを作成し、以下のように記述します。

```Dockerfile:Dockerfile
FROM ubuntu
RUN yum install python3.8
```

一行目の`FROM`ではコンテナのもとになるイメージを指定します。ここではubuntuを使用します。

二行目の`RUN`ではコンテナを起動した後に自動で実行するコマンドを指定します。ここでは`yum`でpython3.8をインストールしています。

次にこのDockerfileを使用してイメージを作成します。Dockerfileが存在するディレクトリで次のコマンドを実行します。

```
> docker build -t ubuntu-image .
```

作成されたイメージを使うと、設定通りpython3.8のインストールされたコンテナを作成することができます。

```
> docker run -it -d --name ubuntu-container-1 -p 8081:80 ubuntu-image
```

このようにDockerfileを使うとコンテナの設定をテキストファイルの形で作成・保存することができます。つまり、Dockerfileを共有すれば同じ仮想環境を簡単に複製することが可能です。


# 4. Docker-composeを使う

Dockerfileを使った例ではコンテナを作成する際にポートやコンテナ名を設定するために長ったらしいコマンドを入力する必要がありました。これを毎回行うのは大変です。そこでコンテナの設定もテキストファイルに保存し、手軽にコンテナを作成できるようになるのがdocker-composeです。

docker-composeを使用するためにはdocker-compose.ymlというファイルを作成します。

```yml:docker-compose.yml
version: '3' 
services: 
    ubuntu:
        build:
            context: ./django
        image: django-image
        container_name: django01
        stdin_open: true
        tty: true
        ports: 
            - "8081:8080"
        volumes: 
            - ./share:/share
```

準備が整ったら次のコマンドでイメージ・コンテナを作成・起動します。
```
> docker-compose up -d
```

作成されたコンテナを確認するにはpsオプションを使用します。
```
> docker-commpose ps
```

コンテナの中に入るにはexecコマンドを使用します。
```
> docker-compose exec django01 bash
```

使用し終わったコンテナとイメージをまとめて削除するには次のコマンドを使用します。
```
> docker-compose down --rmi all
```


# 参考記事

こちらの記事が分かりやすいです。
https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53


# 補足

ご意見ご指摘や質問など、コメントお待ちしています。