dockerメモ

#dockerfile
##FROM
Dockerイメージを指定する。
FROMで取得するイメージはDockerHubに公開されているものになる。

```dockerfile:FROM
FROM イメージ名：タグ
#タグは「3.6」等のバージョン名が一般的
```

##RUN
Dockerイメージビルド時に、コンテナ内で実行するコマンドを定義する。

```dockerfile:RUN
RUN mkdir /tmp
RUN mkdir /test
#/tmpと/testというディレクトリをビルド時にコンテナ内に作成する
#以下でも結果同じになる
RUN mkdir /tmp \
    && mkdir /test
```

##COPY
Dockerを動作させているホストマシンのファイルやディレクトリをコンテナにコピーする。

```dockerfile:COPY
COPY test.py /test
#ホストにあるtest.pyをコンテナの/testにコピー
```

##CMD
コンテナ起動時に実行されるプロセスを指定する。

```dockerfile:CMD
CMD ["実行ファイル", "引数1", "引数2", ...]
#空白が入る部分でコマンドを区切り、配列化した形にするのが推奨
```
docker container runの指定の方が優先される。

##ENV
コンテナ内で使用する環境変数を指定する。

```dockerfile:ENV
ENV test="envtest"
```

##ARG
イメージをビルドする時のみ使用する一時的な環境変数。

```dockerfile:ARG
ARG argtest
#dockerfile内では上記のように記載
#イメージビルドするときに以下のように実行
docker image build --build-arg argtest=test -t イメージ名 .
```

##VOLUME
コンテナ内のデータを永続化する時に指定。
指定したコンテナディレクトリをホストのディレクトリにマウントする。
DB等のDataVolumeコンテナとして使用する時等に使う。
その際のイメージはbusyboxが一般的。（軽量のため）

ホストのどこにマウントされているかは、docker inspect {コンテナID}で確認できる。
「"Mounts": [{"Source":」の部分

例
"Source": "/var/lib/docker/volumes/a033974964bb2412ba7e8a7fe89d5ac2dce8b121a885121e3c95d37262eb111e/_data"

```dockerfile:VOLUME
VOLUME /var/lib/mysql
```



#dockerコマンド
似たようなコマンドが結構あったりするが、比較情報については以下記事参照。
https://qiita.com/zembutsu/items/6e1ad18f0d548ce6c266#%E6%A6%82%E8%A6%81

##docker image
###docker image build（docker build）
```docker:imagebuild
docker image build -t イメージ名[:タグ名] Dockerfile配置ディレクトリパス
#カレントディレクトリがDockerfileある場所ならばディレクトリパスは「.」でよい
#-f ファイル名 : Dockerfile名を指定。デフォルトはDockerfileという名前のファイルを探す
#--pull : --pull=trueとすることで、キャッシュを使わずイメージを強制的に再取得する
```

###docker image ls（docker images）
作成したイメージの一覧を表示する。

###docker image pull（docker pull）
DockerHubに存在するリポジトリとタグを指定する。
タグを省略した場合はデフォルトタグ（大体latest）が利用される。

```docker:imagepull
docker image pull [options] リポジトリ名[:タグ名]
```

###docker image tag
Dockerイメージのバージョン（イメージID）にタグ付けをする。
1つのタグに紐付けられるイメージは1つ。同一リポジトリ、同一タグのイメージは最新以外はNoneになる。

```docker:imagetag
docker image tag 元イメージ名[:タグ] 新イメージ名[:タグ]
```

###docker image push
Dockerレジストリにイメージをpushする。
先にdocker loginしておく前提。

```docker:imagepush
docker image push [options] リポジトリ名[:タグ]
```

###docker image prune
実行中コンテナのイメージでないイメージを一括で削除する

```docker:imageprune
docker image prune [options]
```


##docker container
###docker container run（docker run）
```docker:containerrun
docker container run イメージ名[:タグ名] [コマンド] [コマンド引数・・・]
#-d : バックグラウンド実行オプション
#-it : コンテナ側の標準入力をつなぎっぱなしにする
#--rm : コンテナ終了時にコンテナを削除する
#-p : ポートフォワーディング。指定したホスト側ポートを指定したコンテナポートにフォワーディングする {ホスト側ポート}:{コンテナポート}
      ホスト側のポートは記載省略できる。ホストのどのポートが割り当てられたかはdocker container lsで確認できる。
#--name [コンテナ名] : コンテナ名称を指定
#--volumes-from [コンテナ名] : DataVolumeコンテナをマウントする。マウントはDataVolumeコンテナの設定通り。
```

###docker container ls（docker ps）
実行コンテナ一覧を表示する。

```docker:containerls
docker container ls [options] 
#-a : 停止しているコンテナも含めて表示する
#-q : コンテナIDだけを抽出する
#--filter "filter名=値" : 条件に当てはまるコンテナだけを抽出
　　　　　　　　　　　　　　　 docker container ls --fileter "name=test" #コンテナ名でフィルタ
　　　　　　　　　　　　　　　 docker container ls --fileter "ancestor=test" #イメージでフィルタ
#--limit 件数 : 表示件数を制限する
```

###docker container stop
実行しているコンテナを停止する

```docker:containerstop
docker container stop コンテナID（省略可）もしくはコンテナ名
```

###docker container restart
コンテナを再起動する。
動き的にはstop→start。元々stopしているコンテナにも使える。

```docker:containerrestart
docker container restart コンテナID（省略可）もしくはコンテナ名
```

###docker container rm（docker rm）
コンテナをディスクから削除する。

```docker:containerrm
docker container rm コンテナID（省略可）もしくはコンテナ名
#-f : 実行中のコンテナを停止、削除
```

###docker container logs（docker logs）
コンテナの標準出力を表示する。
一般的にDockerコンテナにおけるログは、コンテナに標準出力として出されるものを指す。

```docker:containerlogs
docker container logs [options] コンテナID（省略可）もしくはコンテナ名
#-f : 標準出力をリアルタイムで出し続ける（tail -f のイメージ）
```

###docker container exec（docker exec）
実行中のコンテナの中で任意のコマンドを実行できる。

```docker:containerexec
docker container exec [options] コンテナID（省略可）もしくはコンテナ名 コンテナ内で実行するコマンド
#docker container exec -it コンテナID /bin/bashでコンテナ内を操作することが多い
```

###docker container cp（docker cp）
実行中のコンテナとホスト間でファイルをコピーできる。

```docker:containercp
docker container cp [options] コンテナIDもしくはコンテナ名：コンテナ内のコピー元 ホストのコピー先
docker container cp [options] ホストのコピー元 コンテナIDもしくはコンテナ名：コンテナ内のコピー先
```

###docker container prune
実行していないコンテナを一括で削除する。

```docker:containerprune
docker container prune [options]
```

###docker container stats
コンテナタインにのシステムリソースの利用状況を表示する。
（topコマンドのdocker版）

```docker:containerstats
docker container stats [options] [表示するコンテナID]
```


##docker search
Docker Hubレジストリに登録されているリポジトリを検索する。

```docker:search
docker search [options] 検索キーワード
#--limit 件数 : 表示件数を制限する
```

##docker system
###docker system prune
利用していないコンテナ、イメージ、ボリューム等のリソースを一括で削除する

```docker:systemuprune
docker system prune [options]
```

#docker-compose
複数のコンテナ構成を管理するツール。
##docker-compose.yml
コンテナの構成を記載するファイル。
サービス（services）、ネットワーク（networks）、ボリューム（volumes）を定義する。
###services
####container_name
コンテナ名を指定する

####image
dockerイメージを指定する

####ports
公開するポートを指定する
ホスト:コンテナでの指定やコンテナのみの指定（ホスト側はランダムになる）もできる

```
ports:
 - 3000
 - 5000:5000
```

####volumes
ホストのディレクトリをマウントする

```
volumes:
  - /opt/data:/var/lib/mysql
```

####privileged
コンテナに権限を与える時に付与する。

```
privileged: true
```

####tty
コンテナを終了させずに起動させ続ける。

```
tty: true
```

####depends_on
コンテナの依存関係を指定する。
指定したサービスが先に起動される。

```
depends_on:
  - manager
```

####expose
docker-compose内でだけ開放されるポートを指定する。

```
expose:
  - 3375
```


##docker-compose up
docker-compose.ymlを作成したディレクトリで実行し、yamlファイルに従ったコンテナ群を起動する。

docker-compose.ymlのあるディレクトリで実行する。

```docker-compose:up
docker-compose up [options]
#-d : バックグラウンドで実行する
#--build : upの際に必ずDockerイメージのビルドをさせる
```

##docker-compose down
docker-compose.ymlを作成したディレクトリで実行し、yamlファイルに従ったコンテナ群をすべて停止、削除する。
docker-compose.ymlのあるディレクトリで実行する。

```docker-compose:down
docker-compose down
```

#docker swarm
複数のDockerホストをクラスタ化するツール。