Dockerの初期設定と操作メモ

GCAにアプリをデプロイするのに必要なDocfile
それの書き方を理解するためにDockerを触ったので記録してきます。

私の環境はWindows10です。
Docker自体はWindowsの場合は64bitでないと動かないので注意ください。


# 環境設定

https://www.docker.com/products/docker-desktop

インストール画面で下記がでますが、
WSL2はWindowsでLinuxを動かすツールで
Dokcerの開発に必要なのでチェックをつけておきましょう。

![2021-07-11_15h23_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/8621b7f7-ab55-0d2b-ca50-45d68eed1f2b.png)

再起動するとまだWSL2がインストールされていないと表示されるので、
リンクから`x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ`をクリックしてインストールをします。

![2021-07-11_15h28_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/d61b1d69-0d11-1b80-cae7-7def91d284a2.png)


インストールが終わったら`Restart`ボタンをクリックしてDockerが開けるようになっています。


先ほどWSL2をインストールした画面で手順4までが完了しているので、
ドキュメントの手順5,6を実行していきます。

https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#step-5---set-wsl-2-as-your-default-version


powershellで下記コマンドを実行してデフォルトのバージョンを設定

```
wsl --set-default-version 2
```

その後、[Microsoft Store](https://aka.ms/wslstore)でUbuntuのインストールとユーザー、PW設定を行います。


終わったら右下のDockerのアイコンを右クリック ⇒ settingsで
Ubuntuのボタンにチェックをつけます。

![2021-07-11_15h48_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/365fc93a-3a19-1b84-6f7c-c74d3751174d.png)

先程開いたUbuntuのターミナルで下記コマンドを実行し、dockerのバージョンが確認できたら設定完了です。

```bash
docker --version
```

VSCodeで実行する場合は
`Ctrl + Shift + P`を押して、
`create new integrated terminal`をクリックします。

ターミナルの種類でUbuntu(WSL)を選択して同じくdockerのバージョンが確認できるか確認しましょう。

![2021-07-24_08h15_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/c39ffcba-db7b-b66c-770c-fdd7782c724e.png)

Ubuntuのターミナルで実行してもよいですが、
VSCodeだけ開いて操作できたほうが楽でよいと思います。

# コマンド

よく使用するコマンドです。
基本的にはDockerfileをおいているディレクトリで実行します。

```bash:作成時

# Dockerfileでイメージの作成、tオプションでイメージ名とタグを指定可能
docker image build [-t image_name[:tag_name]] .

# イメージ名からコンテナ作成実行(image pull, container create, container start)をまとめたもの
docker container run [option] image_name
# オプション例
docker container run -d -p 8000:8080 --name container_name -v ${PWD}/src:/src image_name
```

オプションについて`docker-compose.yml`ファイルを作成したらその中で記載が可能です。

```docker:docker-compose.ymlで使用
# docker-compose.ymlでimage build, container create, container startの動作が行われる
# imageが作成されていたらimege buildは行われない
docker compose up -d

# イメージの作成
docker compose build

# コンテナを作成してコマンド実行
docker-compose run [コンテナ名] [コマンド]

# 起動中のコンテナでコマンド実行
docker-compose exec [コンテナ名] [コマンド]

# コンテナの終了
dokcer compose down
```
## オプション

オプション | 実行内容
- | -
--name コンテナ名 | コンテナ名の指定
-p ホストのポート番号:コンテナのポート番号| ポート番号の指定
-v ホストのディレクトリ:コンテナのディレクトリ|ボリュームのマウント
--net=ネットワーク名|コンテナをネットワークに接続
-e 環境変数名=名前|環境変数を指定
-d|バックグラウンド(detach)で実行
-i|コンテナに操作端末(キーボード)をつなぐ(interactive)
-t|特殊キーを使用可能にする(tty)
--help|ヘルプを参照


# 削除コマンド

よく使いそうなコマンドです。

```bash:削除コマンド
# コンテナの確認
docker ps [-a]
dokcer container list [-a]

# コンテナを止める
docker compose stop
docker container stop container_name

# 動いていないコンテナ、イメージ、ネットワークを削除
docker system prune -a
```

他の一括削除についてはこちらを参考にさせていただいています。
https://qiita.com/reflet/items/5caa88abcf1e8964783a

`system prune`でVolumeは削除されない？確認必要


# error


```
[internal] load metadata for docker.io/library/python:3
```

このエラーがで出た場合はこちらの記事を参考に変更したら動きました。

https://qiita.com/rasuk/items/a36b29b8c79d02fc551a


# Dockerで作成した環境

JupyterLab環境

https://qiita.com/plumfield56/items/335cad3b58afe55f6529

Streamlit環境

https://qiita.com/plumfield56/items/809c0a514ec90fa26941