よく使うDockerコマンド


はじめてDockerを触った時にサブコマンドやオプションで混乱しましたが、いくつかのパターンを覚えておくと応用が効きそうなのでまとめてみました。
上から順にコマンドが試せるように構成しています。

# コンテナの作成とコマンドの実行

## コンテナをつくってログインする: docker run -it

オプション`-it`をつけることでコンテナ内で操作できます。また`--name [好きな名前]`をつけることで、`docker`コマンドのコンテナの指定にここでつけた名前が使えます。

```shell-session
docker@default:~$ docker run -it --name ubuntu ubuntu:14.04 /bin/bash
root@e2f601749c4f:/# hostname
e2f601749c4f
```

## コンテナをバックグランドで動作させる: docker run -d

オプション`-d`をつけることでバックグランドで動作します。また`-p 8080:80`とすることで、ホストのポート8080がコンテナのポート80にマップされます。

```shell-session
docker@default:~$ docker run -d --name nginx -p 8080:80 nginx
3d3549e9cf59456ffbbcefd26c2c504e5318c76c793f462eb24265e26b80cf1b
```

## コンテナを環境変数で設定する: docker run -e

`-e [変数名]=[値]`でコンテナに環境変数を設定できます。下記の例はMySQLの管理者パスワードを環境変数経由で設定しています。

```shell-session
docker@default:~$ docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql
60e3bce8d7676d345400462c2d396d23a85d9c8b0c9fb135bd6ff505f8537039
```

## コンテナ同士を連携させる: docker run --link

`--link [コンテナ名]:[エイリアス]`でコンテナを連携させることができます。下の例はMySQLコンテナとWordpressコンテナを連携させています。

```shell-session
docker@default:~$ docker run -d --name wordpress -p 8000:80 --link mysql:mysql wordpress
6fc9713647d10276b740c833e430463a5958645eb6c55d7acb86235d686dd422
```

## 動作中のコンテナでコマンドを実行: docker exec

コンテナ内部の状況を確認したい時に使います。

```shell-session
docker@default:~$ docker exec wordpress cat /var/www/html/wp-config.php
<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
...

docker@default:~$ docker exec wordpress ps alx
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0     1     0  20   0 177768 18820 -      Ss   ?          0:00 apache2 -DFOREGROUND
5    33   170     1  20   0 177856 11060 ?      S    ?          0:00 apache2 -DFOREGROUND
5    33   171     1  20   0 272468 35880 ?      S    ?          0:00 apache2 -DFOREGROUND
5    33   172     1  20   0 272468 36496 ?      S    ?          0:02 apache2 -DFOREGROUND
5    33   173     1  20   0 263588 28128 ?      S    ?          0:00 apache2 -DFOREGROUND
5    33   174     1  20   0 178528 11828 ?      S    ?          0:00 apache2 -DFOREGROUND
5    33   175     1  20   0 178032  7856 ?      S    ?          0:00 apache2 -DFOREGROUND
5    33   177     1  20   0 177800  6408 ?      S    ?          0:00 apache2 -DFOREGROUND
5    33   187     1  20   0 177800  6408 ?      S    ?          0:00 apache2 -DFOREGROUND
4     0   284     0  20   0   9080   808 -      Rs   ?          0:00 ps alx
```

# コンテナの確認、削除

## 動いているコンテナの表示: docker ps

```shell-session
docker@default:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
6fc9713647d1        wordpress           "/entrypoint.sh apach"   9 minutes ago       Up 9 minutes        0.0.0.0:8000->80/tcp            wordpress
60e3bce8d767        mysql               "/entrypoint.sh mysql"   21 minutes ago      Up 21 minutes       0.0.0.0:3306->3306/tcp          mysql
3d3549e9cf59        nginx               "nginx -g 'daemon off"   23 minutes ago      Up 23 minutes       443/tcp, 0.0.0.0:8080->80/tcp   nginx
```

## 止まっているコンテナも含めて表示: docker ps -a

```shell-session
docker@default:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                           NAMES
6fc9713647d1        wordpress           "/entrypoint.sh apach"   10 minutes ago      Up 9 minutes                0.0.0.0:8000->80/tcp            wordpress
60e3bce8d767        mysql               "/entrypoint.sh mysql"   22 minutes ago      Up 22 minutes               0.0.0.0:3306->3306/tcp          mysql
3d3549e9cf59        nginx               "nginx -g 'daemon off"   23 minutes ago      Up 23 minutes               443/tcp, 0.0.0.0:8080->80/tcp   nginx
46c941225d2e        ubuntu:14.04        "/bin/bash"              25 minutes ago      Exited (0) 25 minutes ago
```

## コンテナの削除: docker rm

```shell-session
docker@default:~$ docker rm ubuntu
ubuntu
```


## 停止中のコンテナの全削除: docker rm \`docker ps -a -q`

Dockerで作業を行っているといつの間にか、停止されているコンテナが溜まってくるので、下記コマンドで一度に削除します。

```shell-session
docker@default:~$ docker rm `docker ps -a -q`
```

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

## コンテナイメージの取得: docker pull

Dockerhubからコンテナイメージを取得します。`[イメージ名]:[タグ]`を指定します。どのようなタグがあるかはDocker Hubで調べられます。[Redmineの例](https://hub.docker.com/r/library/redmine/tags/)

```shell-session
docker@default:~$ docker pull redmine:latest
Using default tag: latest
latest: Pulling from library/redmine
afab6336a0ca: Pull complete
4f3f25af77e7: Pull complete
ff12c96c66ef: Pull complete
...
```

## コンテナイメージの確認: docker images

```shell-session
docker@default:~$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
wordpress               latest              2650eb09e142        5 days ago          512 MB
nginx                   latest              81415e35fc6c        5 days ago          132.8 MB
ubuntu                  14.04               e9ae3c220b23        6 days ago          187.9 MB
mysql                   latest              fb86ef4dd8b7        2 weeks ago         359.8 MB
redmine               latest              ad6e9e5c2313        5 days ago          448.5 MB
```
## コンテナイメージの削除: docker rmi

```shell-session
docker@default:~$ docker rmi redmine:latest
Untagged: redmine:latest
Deleted: ad6e9e5c2313ae8749db962c5dcd9aefbbad90dd2aa54aee9cdd30173d8da757
Deleted: 1c515065d99c5d372411bfa37438929de3eaaef610812d0684a8bc5b34c4b1a6
...
```


## Dockerfileのビルド: docker build

Dockerfileを準備します。下記の内容で`Dockerfile`というファイル名で保存します。

```Dockerfile
FROM nginx
WORKDIR /usr/share/nginx/html
RUN echo "<h1>hello world</h1>" > index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
```

ビルドする際に、Docker Registryに登録することを考えて、`-t [ユーザ名]/[イメージの名前]:[バージョン]`でタグをつけます。

```
docker@default:~$ docker build -t noralife/hello:latest .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM nginx
 ---> 81415e35fc6c
Step 2 : WORKDIR /usr/share/nginx/html
 ---> e286ba07068e
Step 3 : RUN echo "<h1>hello world</h1>" > index.html
 ---> 899a91f6c531
Step 4 : EXPOSE 80
 ---> 2922ac441f75
Step 5 : CMD nginx -g daemon off;
 ---> d4e55a0e5168
Successfully built d4e55a0e5168
```
## Docker Registryへの登録: docker login, docker push

Docker Hubへの登録には[アカウントの作成](https://hub.docker.com/)が必要です。

```
docker@default:~$ docker login
Username:
Password:
Email:
docker@default:~$ docker push noralife/hello:latest
The push refers to a repository [docker.io/noralife/hello] (len: 1)
d4e55a0e5168: Pushed
2922ac441f75: Pushing 1.024 kB
...
```