【Docker入門②】『Docker』のセットアップと基本操作

>この記事では、《Docker や コンテナ》について、
業務を通して学習した内容をまとめています。

- __『Docker』のセットアップ__
- __『Docker』の基本操作__

こういった疑問についてまとめています。

__※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。__

__＜前回のお話＞__
[【Docker入門①】そもそも『Docker』とは…？](https://qiita.com/yaaabu51/items/674a9482188742a76632)

##（参考）サーバーの準備

![shells_script_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/d758df9d-6776-206e-b73b-3899e3252eef.jpeg)

まずは・・・

『Docker』を使用する環境を準備しましょう！

>本記事では、詳しく触れませんが…

>今回は『CentOS』を前提として、解説していきます。

ですので・・・

『[VirtualBox](https://www.virtualbox.org/)』や『[VMware](https://www.vmware.com/jp/products/workstation-player.html)』などを利用して、仮想マシンを準備してみて下さい。

__*※『仮想マシン作成』の記事に関しては、今後まとめる予定です。*__

##（参考）『Docker』のセットアップ

![school-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/e999416d-b8e6-3041-0a9e-81ea62ffdc5a.jpeg)

yumのリポジトリ設定などを行って、__『Docker CE』__をインストールしていきます。

###Docker CE をインストールするためのリポジトリ設定

ホストOS上に『Docker CE』をインストールする前に、『Docker リポジトリ』のセットアップが必要です。

そのため、まずは・・・

- __yum-utils__
- __devicemapper__

で必要とされるパッケージをインストールします。

>__『yum-utils』__は、`yum-config-manager`などのコマンドが含まれます。

>そして・・・

>『device-mapper-persistent-data』と『lvm2』は、__『devicemapper』__の使用に必要です。

>devicemapperに関して知りたい方は、下記の記事で丁寧に解説されていますので、参照してみて下さい。
[》Dockerのストレージドライバを理解する](https://qiita.com/NaotoHanaue/items/b9f395a63f7aae2a41b7)

~~~
$ yum install -y yum-utils device-mapper-persistent-data lvm2
~~~

次に・・・

『Docker CE』をインストールするために、『yumリポジトリ』を追加します。

>『CentOS 7』では、パッケージ管理ソフトウェアとして『yum』を利用していますが、『Docker』は公式の『yumリポジトリ』を提供していますので、その公式『yumリポジトリ』からインストールすることができます。 

>そのため・・・

>__『CentOS 7』に『Docker』の公式『yumリポジトリ』の情報を追加して、リポジトリを使えるようにします。__

~~~
$ yum-config-manager \
  --add-repo \
  https://download.docker.com/linux/centos/docker-ce.repo
~~~

下記コマンドで、リポジトリが追加され、有効化されていることを確認しましょう。

~~~
$ yum repolist all | grep -i docker
~~~

次に・・・

以下のコマンドで『edgeリポジトリ』を無効化します。

>__【余談】『Docker CE』の『edge』『stable』について__

>『Docker CE』のDockerエンジンには、頻繁にリリースされる__『edge』__と約半年ごとに安定版としてリリースされる__『stable』__の__２種類__あります。

>今回は、安定版の『stable』のみを利用ので、『edgeリポジトリ』を無効にします。

~~~
$ yum-config-manager --disable docker-ce-edge
~~~

パッケージの最新情報を取得します。

~~~
$ yum makecache fast
~~~

それでは、インストール可能な『Docker』をリストアップしてみましょう。

>『edgeリポジトリ』の有効・無効かで表示が異なるので、気になる方は確認してみてください。

~~~
$ yum list docker-ce.x86_64  --showduplicates
~~~

そして・・・

お待ちかねの『Docker CE』のインストールです。

~~~
$ yum install docker-ce
~~~

これで『Docker CE』がインストールできました。

ついでに、以下のコマンドでインストールされているか確認しておきましょう。

~~~
$ yum list installed | grep docker-ce
~~~

再読込し、設定を反映させます。

>新規にユニットファイルを作った際や、/etc/systemd/system/配下のファイルを編集した際にリロードします。

~~~
$ systemctl daemon-reload
~~~

『Docker』を起動します。

~~~
$ systemctl start docker
~~~

以下のコマンドでサービス自動起動設定をしておくと、マシンの再起動後も自動で『Docker』が起動します。

~~~
$ systemctl enable docker
~~~

以上で『Docker』のセットアップは終了です。

次は、__『Docker』の基本操作__について見ていきましょう。

##『Docker』の基本操作

![manipulation-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/9849c98a-e62a-7ced-70ba-dce59f546b76.jpeg)


ここからは、公開されている『Dockerイメージ』を使用し、下記の４つの基本操作について見ていきましょう。

1. &ensp;__公開されている『Dockerイメージ』の取得__
2. &ensp;__それを元にコンテナを起動__
3. &ensp;__起動の確認ができたら、コンテナの停止__
4. &ensp;__停止したコンテナの削除__

###STEP①：『Dockerイメージ』の取得

####『Dockerイメージ』の一覧を表示

以下のコマンドで、ローカル環境の『Dockerイメージ』の一覧を確認できます。

~~~
$ docker images
~~~

現状、ヘッダーのみで、何も表示されないと思います。

####『Dockerイメージ』のダウンロード

それでは、『Dockerイメージ』を取得してみましょう。 

>『Dockerイメージ』は、[Docker Hub](https://hub.docker.com/)と呼ばれるオンラインサービスが提供されており、そこでイメージの共有やダウンロードが可能です。

[Docker Hub](https://hub.docker.com/)からイメージを取得するには、`docker pull`コマンドを使用します。

`docker pull`コマンドの書式は、以下の通りです。

~~~
$ docker pull NAME[:TAG]
~~~

- NAME：イメージ名
- TAG：タグ名（省略した場合はlatest）

今回は最新の『Apache httpd』を含んだイメージを取得しますので、コマンドの引数に`httpd`を指定します。 

~~~
$ docker pull httpd
~~~

>タグ名にはバージョンを指定することが一般的ですが、タグ名を省略した場合はデフォルトで`latest`を指定したことになり、最新版がインストールされます。

####『Dockerイメージ』の確認

『httpd イメージ』のダウンロードが完了し、イメージに追加されたことを確認するため、`docker images`コマンドを実行します。 

~~~
$ docker images
~~~

『httpd イメージ』が追加されたことが分かるかと思います。

これで『Dockerイメージ』の取得は完了です。 

###STEP②：コンテナの起動

以下のコマンドでは、ローカル環境のコンテナの一覧を確認できます。

~~~
$ docker ps
~~~

まだコンテナの起動は行っていないので、ヘッダーのみしか表示されません。

####『httpd イメージ』を使ってコンテナを動かしてみる

イメージからコンテナを作成して起動するには、`docker run`コマンドを実行します。 

`docker run`コマンドの書式は、次の通りです。

~~~
$ docker run [OPTION] NAME[：TAG] [COMMAND]
~~~

- OPTION：オプション
- NAME：Dockerイメージ名
- TAG：タグ名（省略した場合はlatest）
- COMMAND：実行時に上書きしたいコマンド

さっそく`docker run`コマンドを実行して、コンテナを作成・起動してみましょう。
（コマンドのオプションについては、次で解説します）

~~~
$ docker run --name httpd -p 8080:80 -d httpd
~~~

|オプション|概要|
|:-:|:--|
|__-d__|__コンテナの実行をバックグラウンドで行うオプション。__<br>仮に、このオプションを指定しなかった場合は、ターミナルのコマンド操作が`Ctrl+C`を実行するまでコンテナに奪われてしまいます。|
|__–name__|__コンテナ名を指定。__<br>（指定しなかった場合は、自動で名前が付けられます）|
|__-p__|__コンテナのポート番号とローカルのコンピュータのポート番号を紐づけるオプション。__<br>今回実行したコンテナは、80番ポートでhttpdが開始されます。 ただし、80番ポートで設定されているのは『コンテナ』であり、『Docker』を実行しているローカルマシンではありません。<br> そこで、この`-p`オプションで、『コンテナ』と『ローカルマシン』のポートを紐づけることで、あたかもローカルマシンでhttpdがサービスを提供しているかのような状態を作ることができます。 <br>__今回の例では、ローカルマシンの8080番ポートをコンテナの80番ポートに紐づけています。__|

これで『httpd コンテナ』の実行が完了しましたので・・・

http://localhost:8080

にアクセスしてみてください。

すると・・・

みなさんおなじみの『It work!』が表示されるはずです。

####実行中のコンテナを確認する

次に、実行中のコンテナの状態を確認してみましょう。

本記事に沿って操作をしている場合、現時点で『httpd コンテナ』が実行中かと思うので、`docker ps`コマンドで確認してみましょう。

~~~
$ docker ps
~~~

実行中のコンテナが１つあることが確認できるかと思います。 

###STEP③：コンテナの停止

実行中のコンテナを停止したい場合は、`docker stop`コマンドを使用します。 

~~~
$ docker stop [CONTAINER]
~~~

- CONTAINER：CONTAINER ID（コンテナID）、NAMES（コンテナ名）

コマンドの引数として、『コンテナID』または『コンテナ名』を指定します。

今回は、起動したコンテナに『httpd』という名前を付けたので…

~~~
$ docker stop httpd
~~~

として、コンテナを停止させます。

####停止したコンテナの確認

コンテナを停止したら、同様に`docker ps`コマンドで停止したかを確認しましょう。 

~~~
$ docker ps
~~~

実行結果にコンテナが表示されなくなったかと思います。

>停止させたコンテナも表示させたい場合は…
`docker ps`コマンドに`-a`オプションをつけて実行します。 

~~~
$ docker ps -a
~~~

表示された結果の『STATUS』欄に`Exited`と表示されているのが確認できるかと思います。

###STEP④：コンテナの削除

停止中のコンテナを削除せずそのままにしておくと、ゴミが残ったままになり、容量の圧迫にもつながるので…

不要になったコンテナは、削除するようにしましょう。

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

~~~
$ docker rm [CONTAINER]
~~~

- CONTAINER：CONTAINER ID（コンテナID）、NAMES（コンテナ名）

今回は、起動したコンテナに『httpd』という名前を付けたので…

~~~
$ docker rm httpd
~~~

として、コンテナを削除します。

####削除したコンテナの確認

コンテナを削除したら、同様に`docker ps -a`コマンドで削除されたか確認しましょう。 

~~~
$ docker ps -a
~~~

一覧にコンテナが表示されなくなったかと思います。

##まとめ

![surfing-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/2a32ad95-b115-a7ec-8808-ee10f8843f47.jpeg)

最後に、今回ご紹介した『Docker コマンド』についてまとめます。

- イメージのダウンロード：`docker pull`
- イメージの一覧の確認：`docker images`
- コンテナの実行：`docker run`
- コンテナの一覧確認：`docker ps`、`docker ps -a`
- コンテナの削除：`docker rm`