Docker for Windowsの基礎コマンド(Windows10 Pro)
Hyper-VマネージャーやDockerのインストールが終わったところから、DockerクライアントとしてPowerShell ISEでDockerデーモンを操作してDockerをいじっていきます。
Dockerは、プロセス分離(1プロセス=1コンテナ)を実現していて、仮想マシン仮想化概念ではない。ホストOSのユーザープロセスの上にそのまま1コンテナ(1プロセス)が乗っかっている感じ。AUFS(Another Union File System)やLXC(LinuxContainer)を学ぶとよくわかる。1サーバー内でphp4とphp5のコンフリクトなど、プロセス間で起こる問題を防止できるのもDockerコンテナ型のメリット!ある程度、基礎学習の順番に並べました。
細かい環境設定は確認していませんが、Dockerインストール後、git for windowsのgit bash、コマンドプロンプト、Windows Power ShellでもDockerコマンド使えました。
Power Shell ISEは起動がやや遅く、ウィンドウがややデカいので、PowerShellで十分という方はISEを選ぶ必要は無いかもしれません。
bashシェルに入るアタッチのコマンド周辺でhangしてしまい、プロンプト点滅の膠着状態となり、うんともすんとも動かなくなる状態が何度も頻出。attachやexecまわりのトラブルは、実用化したい側にとって超致命傷です。
問題の解決には、DockerイメージやDockerコンテナの採番方式など、DockerレジストリでどのようにDockerコンテナが管理され、Dockerイメージもどの様に管理されているのか?詳細を調べる必要が有りそうです。コンテナ自体のユーザー認証を通過してbashにたどり着くまでのロジック、docker image pullからdocker runまでのプロヴィジョニングのオプション設定などが関係ありそう。Dockerイメ―ジもDockerコンテナも変化するたびにIDが与えられ、gitライクにバージョン管理されるという点、うまく使えばとても良さそう。Dockerレジストリもリポジトリの様なものでパブリックなDockerHubとプライベートレジストリがある。
Dockerを使う時の注意点
既製のDockerイメージなどを使うと基本的にコンテナ内にphp.iniなどが無く設定出できません。そのため、画像ファイルの容量上限やmax_execution_timeなどで開発を継続できなくなる事がある。最初からdocker-compose.yml、Dockerfile(、Ansible、Terraform)などを使い、細かい設定ができるようにしておく必要あり。
Dockerバージョン確認コマンド
管理者権限実行していないPower Shell ISEで各種Dockerコマンド操作を行いました。
docker version
docker --version
ISEって何?と思いますが、IDE(Integrated Development Environment)と比べて、Scriptingという事で、PowerShellスクリプトやモジュール専用のコードエディタ、実行環境、デバッグ環境が統合されたGUI環境との事。制限事項があるかどうか?まで調べていませんが、Power ShellにGUI補助が付いて色々便利になったと認識して使えばいいと思う。
起動時に、右クリックで管理者として実行なども出来ます。
「Windowsの機能」の設定確認
コントロールパネル⇒プログラム⇒「Windowsの機能の有効化または無効化」にて「Hyper-V」だけでなく、「コンテナー」と「Windows Subsystem for Linux」もチェックを一応入れておく。
「Windows Subsystem for Linux」をチェックしないと、もしかしてbashシェルが使えない可能性あるかも。時間待ち発生しますが、「開発者モードの有効化」なども有効にしておいたほうがいいかも。
Docker状態確認コマンド
docker info
Dockerが動くか確認する
docker runコマンドはプロセス単位で出来ているdockerコンテナのプロセス単位の起動と考える。
docker run hello-world
※Hello from Docker!というメッセージがPowerShellのコンソール内に出てきたらOK。
そのメッセージの中に以下の様なコマンドもやってみて!と出てくる。
docker run -it ubuntu bash
PowerShell上でbashシェルに入られるはずですが、ダメ・・・。出来る事を色々と原因追及向けに試したが全てダメ。24時間程度盗まれた。最終的にdockerのアンインストール、再インストールしたら問題が解消されました。と思ったら再発、現在、原因解明中・・・。ホストOSの再起動を行うと同じ病気を繰り返す・・・。24時間以上、時間を絶賛盗まれ中・・・。
プロンプトが進まない膠着状態の脱出は、PowerShell ISEの上部に「停止」の赤い四角のボタンがあるのでそれで出来る。もしくは、定番の『Ctrl+C』で処理を停止してプロンプトは正常になる。
docker pull hello-worldごときで 『Error response from daemon: Get https://registry-1・・・』で思いっきりpullがrefuseされています。ダウンロード先に対する名前解決ができていないらしい。これは以下の様にSettings⇒Network⇒DNS Server⇒Fixedで8.8.8.8にする。おそらくDocker for Windowsを使う方は必ずハマる落とし穴だと思われる。Windowsって常に悲しい。落とし穴がいつも多い。環境構築のコスト高い。
新規Hyper-VのDocker環境をカオスには絶対にしたくない。中途半端な失敗作のDockerイメージとDockerコンテナは全て削除したいので削除コマンドも記事内で後述します。
また、docker runコマンドが遅い時は、米国で実行する、ミラーを使う、など、いろいろと遅い状態にハマらない様に回避策もあるらしい。
以下のコマンドを打ち、http://localhost:8080 でNginxの起動をブラウザで確認できる。
docker run --name some-nginx -d -p 8080:80 nginx
Dockerコンテナにアタッチする
PowerShell上でコンテナに入りbashシェルで操作する。
コンテナがゲストOSとして起動している状態に対して次のコマンドを行う。
docker attach コンテナID
もしくは
docker attach コンテナNAME
※コンテナIDやイメージIDは後述の一覧確認で簡単に入手できます。
※docker stopでコンテナ停止、ホストOS再起動後、execでもattachでもbashシェルにアタッチ出来ない。execとattach以前にコンテナ起動時のオプションなどで注意が必要なのかもしれない。落とし穴がある。
Dockerコンテナからデタッチする
コンテナを停止せずにbashシェルを脱出する。PowerShell ISEのDockerクライアントによる純粋なDockerデーモンのコンソール操作に戻る。
[Ctrl+p+q]
※exitをするとコンテナ停止もしてしまう。コンテナ停止せずに脱出するという点に注意。
Dockerコンテナの中に入る
docker exec -i -t コンテナ名 bash
Dockerイメージの一覧確認
docker images
docker image list
Dockerイメージは、Vagrantboxみたいなもので、AWSでいうところのAMI。OSのISOファイル設計図的なもの。リードオンリー(読み込み専門)のテンプレート。イメージを元にコンテナが作られる。Kitematicはイメージのオープンマーケット(vagrantbox.esみたいな感じ)。DockerイメージはDockerコンテナのRW(Read-Write)に比べてRO(Read-Only)です。
Dockerイメージ削除
docker imagesなどで『IMAGE ID』を確認して
docker rmi イメージID
か
docker image rm イメージID
でもいける。どちらか、レガシーで非推奨などはあるかもしれない。
Dockerイメージ探し
公式リポジトリのDocker Hubで探す。
docker search centos
※centosの部分を自由に変える。
Dockerボリューム一覧
docker volume list
Dockerネットワーク一覧
docker network list
Dockerコンテナの一覧確認
Dockerコンテナは、Dockerイメージに対する実態。プロヴィジョニング前のコンテナという可能性はありえるので、ホットスタンバイ前後の仮想マシンやらインスタンスと言った感じだと思う。
実行中のコンテナだけ
docker ps
docker container list
コンテナ全部
docker ps -all
docker container list -all
最後に起動したコンテナ
docker ps -i
Dockerコンテナの停止
docker ps などで『CONTAINER ID』を確認して
docker stop コンテナID
Dockerコンテナの起動
どちらかというとプロヴィジョニング(たぶん)
docker run コンテナID
どちらかというと2回目以降の起動(たぶん)
docker start コンテナID
Dockerコンテナの再起動
docker restart コンテナID
Dockerコンテナ削除
docker ps などで『CONTAINER ID』を確認して
docker rm コンテナID
か
docker container rm コンテナID
でもいける。どちらか、レガシーで非推奨などはあるかもしれない。
ネットワークのポートフォワーデイング設定
docker port
などのコマンドを使って行う。
Docker Composeとは
複数のコンテナを定義する。
Docker for Windows更新方法
ホストのWindows10 proを起動すると、おそらく、勝手にウィンドウが以下の様に立ち上がってきます。無視すると、起動の度に毎回出てくるのでウザい。
ウィンドウの下部に色々な選択肢が出てくるので、『Install Update』を実行すると、パッケージのダウンロードが開始されます。更新の完了後、ホストのWindows10を再起動すると、Hyper-Vマネージャーで確認すると、MobyLinuxVMの実行中(稼動中)を確認できます。
Docker for Windowsの更新を確認したい場合
上記の様に『Check for Update…』で確認。その他、SettingsやKitematicなど、いろいろ必要な際はここから使える。
Dockerクラスタ環境構築
Docker SwarmというDockerクラスタ環境構築で複数コンテナをグループ化したやつらとDockerクライアントの間でAPIによりコンテナを操作するものもあるが、Google Compute Engine」(GCE)との連携が意識されたGoogleのDocker管理ツールKubernetes(クーベルネイテス)が優勢ですね。
DockerコンテナからホストOSにファイルをコピー
docker cp <コンテナID>:<ファイルパス> <ローカルの保存先ファイルパス>
ホストOSからDockerコンテナにファイルをコピー
docker cp <ローカルの保存先ファイルパス> <コンテナID>:<ファイルパス>