docker コマンドメモ

## dockerイメージダウンロード＆実行
```
docker run <dockerイメージ名>

docker run <dockerイメージ名> <コンテナ起動後にコンテナ内で実行するコマンド>

docker run --network <接続したいネットワーク名> <dockerイメージ名>
```

# 例）nginxコンテナの実行コマンド
ポート指定、起動後の実行コマンド指定、停止時に削除指定

```
docker run --name <コンテナ名> -p <ホスト側のポート番号>:<コンテナ側のポート番号> -it -d --rm nginx /bin/bash

オプション
--name：起動するコンテナの名前
-p：コンテナのポートをホストのポートとマッピングし、外部に公開するための指定
-d：デタッチモード指定（バックグラウンド実行）
-t：Dockerコンテナ内の標準出力とホスト側の出力をつなげる（これつけないとコンテナ操作が不便になる）
-i：ホスト側の入力をコンテナの標準出力をつなげる（これつけないとコンテナ操作ができない）
```

## コンテナ終了＆削除
```
docker stop <コンテナ名>
docker rm <コンテナ名>
```

## ローカル上にダウンロード済のdockerイメージ一覧
```
docker images
```

## ローカル上にダウンロード済のdockerイメージにタグ付けする
```
docker tag <元のイメージ名> <新しいイメージ名>
```

## dockerイメージの詳細情報の表示
```
docker inspect <dockerイメージ名>
```

## dockerイメージの削除
```
docker rmi <dockerイメージ名>
docker rmi -r <dockerイメージ名>  ## -fを付けると強制削除

--タグ削除の場合もほぼ同様 (参考：http://www.memotansu.jp/docker/703/)
docker rmi <dockerイメージ名>:<タグ名>
```

## dockerイメージの取得
```
docker pull <dockerイメージ名>
```

## dockerイメージの構築
1. Dockerfileの作成
2. Dockerfileからイメージをビルド

## dockerコンテナファイルのコピー
```
#ローカルホストからコンテナへ
docker cp <ローカルホスト上のコピーしたいファイル> <コンテナ名>:<コピー先パス>

#コンテナからローカルホストへ
docker cp <コンテナ名>:<コンテナ上のコピーしたいファイル> <ローカルホスト上のコピー先パス>
```

## 起動中のコンテナ一覧
```
docker ps
docker container list
```

## 停止中のコンテナ一覧
```
docker ps -a
docker container list -a
```

## コンテナへの接続
```
docker attach <コンテナ名>  # exitで抜けるとコンテナが終了してしまう。Ctrl + P + Q　で抜けることができる。
docker exec -it <コンテナ名> /bin/bash  # exitで抜けてもコンテナは起動し続ける
```

## コンテナからイメージ作成
```
docker commit <コンテナ名> <イメージ名>:<タグ名>
```

## docker for mac の仮想環境
docker for mac での仮想環境は VirtualBox ではなく、HyperKitというMacネイティブの仮想化環境が裏で動いている。

## コンテナのネットワーク関連コマンド
```
# 一覧表示
docker network ls
# 詳細表示
docker network inspect bridge  #bridgeドライバのネットワーク詳細情報の確認
# ネットワーク作成
docker network create <ネットワーク名>
# コンテナを作成したネットワークへ接続
docker network connect <ネットワーク名> <コンテナ名>
# コンテナを作成したネットワークから切断
docker network disconnect <ネットワーク名> <コンテナ名>
# 作成したネットワークを削除
docker network rm <ネットワーク名>
```

## docker-machin関連コマンド
```
# 一覧表示
docker-machine ls
# 仮想マシン作成（gcpの場合）
gcpコンソール上でサービスアカウント作成し、プロジェクトオーナ権限付与
キーをダウンロード
export GOOGLE_APPLICATION_CREDENTIALS=<jsonファイルパス>
docker-machine create --driver google --google-project <プロジェクトID> --google-zone asia-northeast1-a <仮想マシン名>
# 仮想マシンへssh
docker-machine ssh <仮想マシン名>
# 仮想マシンを停止
docker-machine stop <仮想マシン名>
# 仮想マシンを削除
docker-machine rm <仮想マシン名>
# dockerコマンドの実行時に、特定のマシンを指し示せるような環境変数を表示
docker-machine env <仮想マシン名>
# 上記で表示された環境変数を適用
eval $(docker-machine env <仮想マシン名>)
# IPアドレスを確認
docker-machine ip <仮想マシン名>
```

## コンテナのボリューム関連コマンド
```
# volume作成
docker volume create <volume名>
# 一覧表示
docker volume ls
# 詳細表示
docker volume inspect <volume名>
# 作成したvolumeを削除
docker volume rm <volume名>
# volume指定しdocker起動
docker run -itd --name <コンテナ名> --mount source=<volume名>,destination=<コンテナのマウント先>,readonly nginx
docker run -itd --name <コンテナ名> -v <volume名>:<コンテナのマウント先>:ro nginx
# bindmount（仮想マシンのファイルをコンテナでマウント）
sudo docker run -itd --name vol-test06 --mount type=bind,source="$(pwd)"/hogehoge,target=/app/hogehoge nginx
```

## docker-compose関連コマンド
```
# コンテナの一覧表示
docker-compose ps
# コンテナを作成して、起動
docker-compose up -d  # -dはバックグラウンド実行の指定
docker-compose -f <docker-composeのyamlファイル> up -d  #yamlで指定したコンテナの起動
# 引数で指定したサービスのコンテナ内でコマンドを実行
docker-compose run <サービス> <サービスで実行するコマンド>
docker-compose run -d <サービス> <サービスで実行するコマンド> # バックグラウンド実行の場合
# コンテナの停止
docker-compose stop
# コンテナの削除
docker-compose down
docker-compose -f <docker-composeのyamlファイル> down  #yamlで指定したコンテナの削除
```