Dockerでコンテナを操作してみよう

# Dockerとは？

コンテナ技術をベースに開発された仮想化技術です。
仮想化技術には仮想マシンとコンテナの2種類がありますが、コンテナは仮想マシンに比べて軽量であるというメリットがあります。


- ハイパーバイザ型の仮想マシン
実行環境ごとに個別のOS（ゲストOS）を用意します。
ex) VirtualBoxなど

- コンテナ
1つのOS上に、他プロセスから隔離したアプリケーション実行環境を構築しています。
仮想マシンやゲストOSがないので、軽量です。

# Dockerの基本操作

Dockerでよく使うコマンドの使い方を簡単に説明していきます。
今回紹介するコマンドは次の7つです。

- pull
- images
- ps
- create
- start
- attach
- rm

# Linuxを動かしてみよう
実際にコンテナをAlpine LinuxというLinuxのディストリビューション（配布形態）を使って、操作してみます。

##pullコマンドでイメージを取得する
```
docker pull alpine

```

dockerのコマンド`pull`をすることで`alpine`のイメージを`docker Hub`上から持ってくることができます。

##imagesコマンドで取得したイメージを確認する

「`docker Hub`からもってきたイメージが見当たらないんだけど!」

もちろん、ちゃんとdockerで確認のためのコマンド`images`が用意されています。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        9 days ago          1.84kB
alpine              latest              3f53bb00af94        2 weeks ago         4.41MB
```

`images`コマンドを使うと、このように取得したイメージの情報を一覧で表示してくれます。

## runコマンドでコンテナを起動する

それではいよいよコンテナを起動してみましょう！
`run`コマンドは

- create:コンテナの作成
- start:コンテナの起動

を一緒にやってくる便利なコマンドです。

`docker run イメージ コンテナで起動するコマンド`

で実行時できます。

```
$ docker run alpine echo hogehoge
hogehoge

```

## psコマンドで実行中のコンテナを確認する

psは実行中のコンテナを確認しましょう。

`echo`コマンドは実行後そのまま終了してしまうので、インタラクティブにコマンドを入力できる`-it`を`run`のオプションにつけて、実行してみます。

```
$ docker run -it alpine /bin/sh
/ # ls
bin    etc    lib    mnt    root   sbin   sys    usr
dev    home   media  proc   run    srv    tmp    var
/ #
```
こんな感じで対話的にLinuxのコマンドを入力できます。
現在、コンテナは実行状態にあります。

この状態で、もう1つターミナルを用意して、そこで`ps`コマンドを実行してみます。

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fc86a6156b6c        alpine              "/bin/sh"           4 minutes ago       Up 2 minutes                            hopeful_cocks
```
ちゃんとコマンド`/bin/sh`が実行中になっています。

## stopコマンドでコンテナを停止する

もちろん、このままコンテナをほったらかしておくわけにもいきません。

`stop`コマンドで実行を停止しましょう。

`docker stop コンテナID`

で停止できます。

```
$ docker stop fc86a6156b6c
fc86a6156b6c
```
インタラクティブにコマンド入力を受け付けていたターミナルを確認すると、dockerのコマンド入力を受け付ける状態に戻っています。

## startとattachコマンドで停止したコンテナを再び操作する

`stop`コマンドで停止したコンテナは`start`コマンドでコンテナを起動することができます。

`dokcer start コンテナID`

```
$ docker start fc86a6156b6c
fc86a6156b6c

```

コンテナを起動したはずなのに、先ほどのコマンド入力を受け付けるモードになっていませんね。
本当にコンテナが起動したのか`ps`コマンドで確認してみましょう。

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fc86a6156b6c        alpine              "/bin/sh"           23 minutes ago      Up 30 seconds                           hopeful_cocks
```
ちゃんとコンテナは起動していますね。

実は、コンテナを起動しただけではこのようにコンテナを操作できないのです。
そこで使うのが`attach`コマンドです。

`docker attach コンテナID`

これを実行すれば再びコンテナを操作することができます。

```
$ docker attach  fc86a6156b6c
/ # ls
bin    etc    lib    mnt    root   sbin   sys    usr
dev    home   media  proc   run    srv    tmp    var
/ #

```

## rmコマンドでコンテナを削除する

作成したコンテナを削除したいときに使うのが`rm`コマンドです。

`docekr stop コンテナID`

`docker rm コンテナID`

`rm`コマンドを使う場合は、コンテナを停止してから実行する必要があります。

コンテナを停止している状態では、便利ですが、実行中にコンテナを削除したいときは、ちょっとめんどくさいですよね。

実はショートカットキー`Ctrl-C`でコンテナの停止と削除を一緒に行うことができるのです。
これはシェルのコマンドの強制終了の方法と同じなので、シェルを使えれば、感覚的にこのショートカットキーを使えるかもしれませんね。