My Docker チートシート

DockerコマンドやDockerfileの書き方など、自分用の覚書です。

#ドキュメント
- [Docker Documentation](https://docs.docker.com/)
- [Docker ドキュメント（日本語）](http://docs.docker.jp/index.html)

#Dockerコマンド

##ビルド（build）

####Dockerfileを指定する
```bash
docker build -f <ファイルパス> .
```

####タグを付ける
```bash
docker build -t <タグ名> .
```

##起動（run）

####名前を指定する
```bash
docker run --name <コンテナ名> <イメージ名>
```

####コンソールを表示する
```bash
docker run -t -i <イメージ名>
```

####終了したときにコンテナを残さない
```bash
docker run --rm <イメージ名>
```

####VOLUMEを指定する（マウントする）
VOLUMEを利用することで、コンテナ外の定義ファイルを読み込んだり、コンテナ内で出力されるファイルを保存したり、といったことが可能になり、本番環境での運用などでは重要な内容になる。

```bash
docker run -v <ホストのパス>:<コンテナのパス> <イメージ名>
```
- ホストのパス／コンテナのパスは、絶対パスで指定する。そうしないと、名前として認識されてしまい、異なる意味の指定になる。
- 例えば、シェルであれば、以下のように記述することで、絶対パスを指定できる。

    ```bash
    CURRENT_PATH=$(cd $(dirname $0) && pwd)
    HOST_PATH=${CURRENT_PATH}/config
    
    docker run -v ${HOST_PATH}:/opt/config docker/example
    ```

####総合
```bash
docker run --rm --name <コンテナ名> -t -i \
     -v <ホストのパス>:<コンテナのパス> \
     -p <ホストのポート番号>:<コンテナのポート番号> \
     <イメージ名>
```
- ```-v```や```-p```などは、複数指定することが可能。


##イメージに対する操作

####一覧を表示する
```bash
docker images
```

####イメージを指定して削除する
```bash
docker rmi <イメージID>
```

####利用されていないイメージを削除する
```bash
docker rmi $(docker images | awk '/^<none>/ { print $3 }')
```

- Windowsの場合

```bat
for /f "usebackq tokens=1-5" %I IN (`docker images ^| findstr "^<none>"`) do docker rmi %K
```

####イメージの一括削除（要注意）
```bash
docker rmi `docker images -aq`
```

##コンテナに対する操作

####停止中のコンテナも含めて、一覧を表示する
```bash
docker ps -a
```

####停止中のコンテナを削除する
```bash
docker rm `docker ps -a -q`
```

####古いコンテナを削除する
```bash
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
```

- Windowsの場合

```bat
for /f "usebackq" %I IN (`docker ps -a -q`) do docker rm %I
```

#Dockerfile

####ひな形
自分の場合は、おおよそ、以下のような流れで記述する。

- ホストのcontainer-filesディレクリに、Dockerイメージに含めたいファイルを準備しておき、COPYでコンテナ内に配置する。
- 永続化する必要のあるファイルは、VOLUMEでマウントしておく（ホスト側のパスは、runを実行時に指定）。
- プロセス実行ユーザは、個別に設ける。rootで実行しない。
- ```entrypoint.sh``` という、対象となるプロセスを実行するシェルを外部に用意する。そこで環境変数や定義ファイルを参照できるようにし、コンテナ起動時に、環境変数や定義ファイルを指定できるようにしておく。

```bash
FROM centos:7

ENV JAVA_HOME=/usr/lib/jvm/jre-1.8.0

RUN yum -y install java-1.8.0-openjdk

# 必要なミドルウェアやソフトウェアをインストール

RUN yum -y clean all

# Config mount
VOLUME ["/opt/app/config"]

COPY container-files/entrypoint.sh /opt/
RUN chmod +x /opt/entrypoint.sh

# Output mount
RUN mkdir -p /opt/app/data; chown -R appuser:appgroup /opt/app/data
RUN mkdir -p /opt/app/logs; chown -R appuser:appgroup /opt/app/logs
VOLUME ["/opt/app/data", "/opt/app/logs"]

USER appuser

ENV PATH=${PATH}:${JAVA_HOME}/bin

# Expose ports.
#   - 8081: HTTP
EXPOSE 8081

# Exec
ENTRYPOINT ["/opt/entrypoint.sh"]
```


#docker-compose

####ひな形
```YAML
app1:
  build: ./app1
  volumes:
    - ./app1/config:/opt/app1/config
    - ./app1/log:/opt/app1/log
  ports:
    - "<ホストのポート番号>:<コンテナのポート番号>"

app2:
  build: ./app2
  volumes:
    - ./app2/config:/opt/app2/config
  ports:
    - "<ホストのポート番号>:<コンテナのポート番号>"
  links:
    - app1
```
- ```volumes```では、相対パスが利用できる。```./``` を指定すること。

#参考
- [Docker 虎の巻](https://gist.github.com/tcnksm/7700047)
- [docker コマンド チートシート(voluntas on Qiita)](http://qiita.com/voluntas/items/68c1fd04dd3d507d4083)