Docker コンテナの操作方法について

カスタマイズする前に、Docker イメージの操作を簡単に確認します。

## Docker イメージを探す

まずは Docker イメージを探してみます。

下記のコマンドは [Docker Hub](https://hub.docker.com/) で探すのと同じ結果が返ってきます。

```
> docker search php
NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
php                                                       While designed for web development, the PHP …   3330                [OK]
richarvey/nginx-php-fpm                                   Container running Nginx + PHP-FPM capable of…   547                                     [OK]
phpmyadmin/phpmyadmin                                     A web interface for MySQL and MariaDB.          503                                     [OK]
php-zendserver                                            Zend Server - the integrated PHP application…   140                 [OK]
eboraas/apache-php                                        PHP5 on Apache (with SSL support), built on …   136                                     [OK]
webdevops/php-nginx                                       Nginx with PHP-FPM                              100                                     [OK]
adminer                                                   Database management in a single PHP file.       89                  [OK]
webdevops/php-apache                                      Apache with PHP-FPM (based on webdevops/php)    61                                      [OK]
nazarpc/phpmyadmin                                        phpMyAdmin as Docker container, based on off…   57                                      [OK]
phpunit/phpunit                                           PHPUnit is a programmer-oriented testing fra…   57                                      [OK]
webdevops/php-apache-dev                                  PHP with Apache for Development (eg. with xd…   50                                      [OK]
osixia/phpldapadmin                                       phpLDAPadmin with easy configuration via env…   44
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          33                                      [OK]
tetraweb/php                                              PHP 5.5, 5.6, 7.0, 7.1 for CI and running te…   28                                      [OK]
webdevops/php                                             PHP (FPM and CLI) service container             19                                      [OK]
wodby/drupal-php                                          PHP for Drupal                                  18                                      [OK]
centos/php-56-centos7                                     Platform for building and running PHP 5.6 ap…   12
phpdocker/phpdocker                                       PHP, MariaDB, Composer, PHP CodeSniffer.        10                                      [OK]
clinta/phpipam                                            phpIPAM web IP address management applicatio…   10                                      [OK]
graze/php-alpine                                          Smallish php7 alpine image with some common …   9                                       [OK]
antage/apache2-php5                                       Docker image for running Apache 2.x with PHP…   7                                       [OK]
appsvc/php                                                Azure App Service php dockerfiles               5                                       [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mariadb-10   ubuntu-16-nginx-php-phpmyadmin-mariadb-10       4                                       [OK]
lephare/php                                               PHP container                                   4                                       [OK]
isotopab/php                                              Docker PHP                                      0                                       [OK]
```

## Docker イメージを起動する

ローカルに Docker イメージがない場合は、指定したイメージをダウンロードしてから起動されます。

今回は公式の [PHP の Docker イメージ](https://hub.docker.com/_/php/)を利用します。

複数あるイメージの中から `5.6.35-apache-jessie` を選択します。これは、PHP のバージョンが 5.6.35 で Apache が同梱されている Debian Jessie のイメージになります。

[docker run](https://docs.docker.com/engine/reference/commandline/run/) は Docker イメージからコンテナを新規作成して稼働します。コマンドオプションの `-d` はコンテナをバックグラウンドで稼働させます。

```
> docker run -d php:5.6.35-apache-jessie
Unable to find image 'php:5.6.35-apache-jessie' locally
5.6.35-apache-jessie: Pulling from library/php
f2b6b4884fc8: Pull complete
8db887c45800: Pull complete
6e0e41c52c70: Pull complete
fbc9ac078c49: Pull complete
c4c6f6be7488: Pull complete
a28db8adaf05: Pull complete
61afa9c0aff1: Pull complete
a30b1659c046: Pull complete
b04c4f5caef7: Pull complete
98d401b50a56: Pull complete
bf457562a4ec: Pull complete
4ed2d6d10d33: Pull complete
51a58424d64c: Pull complete
3b15601614ab: Pull complete
Digest: sha256:14a48377c2cecaaf5daed21d328c693d07ade6d0effef5526d2340f255df178c
Status: Downloaded newer image for php:5.6.35-apache-jessie
```

ダウンロードした Docker イメージが起動されたコンテナの状態を確認します。

```
> docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED              STATUS              PORTS               NAMES
e2cdea8c94d0        php:5.6.35-apache-jessie   "docker-php-entrypoi…"   About a minute ago   Up About a minute   80/tcp              heuristic_chatterjee
```

`heuristic_chatterjee` は Docker イメージ `php:5.6.35-apache-jessie` のコンテナ名になります。コンテナ名は指定することができます。指定しない場合は Docker が自動的に命名します。今回は Docker が自動的に命名したコンテナ名になります。

## コンテナに接続する

[docker exec](https://docs.docker.com/engine/reference/commandline/exec/) にコマンドオプションと接続するコンテナ名 (今回は `heuristic_chatterjee`) を指定して、コンテナ名のコマンド /bin/bash を実行します。

```
> docker exec -it heuristic_chatterjee /bin/bash
root@e2cdea8c94d0:/var/www/html# uname -a
Linux e2cdea8c94d0 4.9.87-linuxkit-aufs #1 SMP Wed Mar 14 15:12:16 UTC 2018 x86_64 GNU/Linux
root@e2cdea8c94d0:/var/www/html# pwd
/var/www/html
```

コンテナの接続は `exit` で切断できます。また、`exit` した後もコンテナが稼働していれば、上記のコマンドで接続できます。

```
root@e2cdea8c94d0:/var/www/html# exit
exit

> docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS               NAMES
e2cdea8c94d0        php:5.6.35-apache-jessie   "docker-php-entrypoi…"   28 minutes ago      Up 28 minutes       80/tcp              heuristic_chatterjee

> docker exec -it heuristic_chatterjee /bin/bash
root@e2cdea8c94d0:/var/www/html#
```

`docker exec` に似たコマンドに [docker attach](https://docs.docker.com/engine/reference/commandline/attach/) があります。`docker exec` との違いは、`docker attach` は `exit` した時点でコンテナが終了してしまいます。
(`docker exec` は `exit` しても、コンテナは稼働したままです)

通常の利用ならば、`docker exec` の方が意図せずにコンテナが停止することはないので、こちらのコマンドの使用をお勧めします。

## コンテナを停止する

[docker stop](https://docs.docker.com/engine/reference/commandline/stop/) コマンドで停止したいコンテナ名を指定する。

```
> docker stop heuristic_chatterjee
heuristic_chatterjee

> docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                     PORTS               NAMES
e2cdea8c94d0        php:5.6.35-apache-jessie   "docker-php-entrypoi…"   30 minutes ago      Exited (0) 7 seconds ago                       heuristic_chatterjee
```

## コンテナを起動する

[docker start](https://docs.docker.com/engine/reference/commandline/start/) でコンテナ名を指定すると、該当のコンテナが起動します。

```
> docker start heuristic_chatterjee
heuristic_chatterjee

> docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS               NAMES
e2cdea8c94d0        php:5.6.35-apache-jessie   "docker-php-entrypoi…"   36 minutes ago      Up 5 seconds        80/tcp              heuristic_chatterjee
```

`docker run` と `docker start` の違いは、`docker run` する度に指定した Docker イメージからコンテナを生成します。`docker start` は既に生成されたコンテナを稼働させるという違いがあります。

## コンテナを削除する

コンテナを削除する前に、コンテナが稼働しているか確認します。

```
> docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS               NAMES
e2cdea8c94d0        php:5.6.35-apache-jessie   "docker-php-entrypoi…"   36 minutes ago      Up 5 seconds        80/tcp              heuristic_chatterjee
```

稼働していれば、コンテナを停止します。

```
> docker stop heuristic_chatterjee
heuristic_chatterjee

> docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                     PORTS               NAMES
e2cdea8c94d0        php:5.6.35-apache-jessie   "docker-php-entrypoi…"   About an hour ago   Exited (0) 5 seconds ago                       heuristic_chatterjee
```

停止しているのを確認したら、削除したいコンテナ名を指定して [docker rm](https://docs.docker.com/engine/reference/commandline/rm/) コマンドで削除します。

```
> docker rm heuristic_chatterjee
heuristic_chatterjee

> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

`docker rm` でコンテナを削除しても、Docker イメージは残っています。ですので、再び `docker run -d php:5.6.35-apache-jessie` を実行すれば、(おそらく異なる名称で) 新たにコンテナが生成されて稼働します。

## Docker を終了する

Docker そのものを終了したい場合は、Windows だとタスクバーから Quit Docker を選択すれば、Docker が終了します。

![quit-docker.png](https://qiita-image-store.s3.amazonaws.com/0/248967/74d0056a-7e9f-48e9-3386-786ffc1b2d55.png)