Windows
docker
Windows10

俺のDocker - Windowsでいろいろやってみる

More than 1 year has passed since last update.

こちらも参考にすると良い → Docker for Windowsで環境構築してみる – その弐

おさらい

前回のおさらい

前回の流れ

  1. Windows 10 HomeエディションからWindows 10 Proエディションにアップグレード(有償)
  2. 「Windowsの機能の有効化または無効化」でHyper-Vを有効化
  3. Windows 10 ProにDocker for Windowsをインストール
    • Hyper-V(仮想マシンソフト)にLinux(MobyLinuxVM)がセットアップされる
      • DockerはLinuxカーネル専用なのでWindowsでは仮想OSとして動かしておく
      • このModyLinuxVMをつかってDockerを動かす

用語

  • プロセス
    • コンテナ内で動いてるプログラム
  • コンテナ
    • ホストOSから隔離された領域
    • この中でプロセスを動かす
  • イメージ
    • コンテナの構成図みたいなもの
      • 好きな構成でイメージを作ることが出来る
      • 出来たイメージは他者と共有出来る
      • Docker hubで公開することも出来る
    • イメージを落として実行するとコンテナとして動く
    • 1つのイメージからコンテナは何個でも起動出来る

コマンド入力に関して

  • コマンドプロンプトは廃止予定なのと使いにくいので使わない
  • 基本的にWindows PowerShellを使う
    • ただしPowerShell ISEはttyが反応しないので使わない
    • 回避策があるのかもしれないが面倒くさいから無視
  • 個人的にはWindowsのコマンドラインはCMDerを強くおすすめする
    • Git Bash、PowerShellなどがすべてこれ一つで対応可能
      • 個別に無効化出来る
    • フォントや色など好きに設定できる
    • タブで画面切り替えできる

実際にDockerを使ってみる

イメージを落としてみる

  1. 試しにhttpdをインストールと同時に実行してみる
    • docker run -d -p 8080:80 httpd
    • -dはバックグラウンド実行の指定
    • -pはポートフォワード。8080からきたら80で受けるという設定
    • httpdはまだインストールしてないが、なければ自動的にダウンロードされる
    • 落としたイメージはdocker imagesで確認可能
  2. ホストマシンのIPが192.168.11.5だとしたら、ブラウザでhttp://192.168.11.5:8080を見てみる
    • IPアドレスがわからなければipconfigコマンドを使う
    • ブラウザでIt works!と表示されたらOK
      • httpdのDocumentRootにおいてあるhtmlにそのように書いてあるだけ
    • これで「Hyper-VのMobyLinuxVM上でhttpdが動いた」ということになる

稼働中のコンテナを確認する

  • docker ps -aで稼働中のコンテナ、停止中のコンテナが一覧出来る
    • -aは実行中と停止中両方という意味。無指定なら実行中だけ表示される
  • 停止や起動は、一番右側に表示されたNAMES項目にある名前で指定する
    • 起動時に名前は指定出来るが、指定しない場合はDockerがランダムに名前を生成する仕組み
  • 上記で起動したhttpdを停止させるには以下のコマンドを使用する
    • docker stop <NAMESの名前>
    • 例えばdocker stop reverent_kowalevskiなど

Windows側のhtmlファイルを表示してみる

ホストOSであるWindowsにindex.htmlを作り、それをDockerのコンテナ内で表示させてみる。
index.htmlはC\:Users\<ユーザ名>\www\html\index.htmlとする。

index.html

<html>
<head>
<meta charset="utf-8">
<title>my firsr docker doucmnet</title>
</head>
<body>
<header>
    <h1>MobyLinuxVM</h1>
    <h2>httpd</h2>
</header>
</body>
</html>
  1. 上記htmlファイルを作成する
  2. マウントオプション-vを使用して起動してみる
    • docker run -d -p 8080:80 -v C:\Users\ogaaaan\www\html:/usr/local/apache2/htdocs httpd
    • コンテナ内のhttpdは/usr/local/apache2/htdocs内のファイルを表示しているそうだ
    • つまりここにホストOSであるWindowsのフォルダをマウントしてしまえば良いということになる
  3. docker: Error response from daemon:とエラーが出る
    • C: drive is not shared. Please share it in Docker for Windows Settings.
    • つまり設定でCドライブを共有できる設定にしてくれという意味
      1. タスクトレイのDockerを右クリックしSettingを開く
      2. 「Shared Drives」でCドライブにチェックを入れApplyする
      3. Windowsログオンのパスワードを登録する
      4. これでDockerコンテナからCドライブにアクセスが可能になった
  4. 再度同じコマンドを打ってみる
    • ブラウザでMobyLinuxVMとhttpdという文字が表示されればOK

オリジナルのコンテナを作ってみる

任意のLinuxディストリビューションを落とし、システムをアップデートした状態のものを、あらためてコンテナとして動かしたい。そのためのイメージを作る作業をしてみる。

まずはFedoraをアップデート。

  1. 任意のディストロ(ここではFedora)を落とす
    • docker pull fedora
    • バージョン指定しないと最新が落とせる
  2. 対話式で起動する
    • 対話の-iとttyの-tを使ってFedoraのbashと対話
    • docker run -it fedora /bin/bash
    • プロンプトがFedoraのものになる
    • rootでのログインになる
  3. 通常のアップデートを行う
    • dnf -y update
    • CentOSならyum -y update
    • Ubuntuならapt-get -y updateした後apt-get -y upgrade
  4. 終わったら対話終了
    • exitでdockerに戻る

次にこのコンテナをイメージ化する。
イメージ化する際に気をつけることは、イメージ化したいコンテナが停止しているかどうか。
稼働していたら停止させる。

イメージ化コマンド

docker commit <コンテナIDもしくはコンテナ名> <任意のイメージ名>:<タグ名>

システムをアップデートしたfedoraのコンテナIDを調べるには、docker ps -aで、fedoraイメージで一番最近の物を見れば分かる。Exited (0) 4 seconds agoなら、4秒前に停止したという意味になる。
今回は4秒前に停止したこのFedoraのコンテナIDは50907fda3515だったので、これを使う。
タグ名はバージョンやlatestなどの名前を入れておくと便利。今回は年月日を入れる。

docker commit 50907fda3515 fedora25:20161220

つくったイメージはdocker imagesで表示される。

次回からこのイメージをrunさせてコンテナ化し、そのコンテナで作業すれば良い。

もしイメージを消したかったら、docker rmi <イメージ名>で削除出来る(イメージを起動しすぎて無駄にコンテナが増えてしまった場合、docker rm <コンテナ名>で停止してるコンテナを消せる)。

ここまでのまとめ

tmp00064.png

QiitaはPlantUMLもMermaidもつかえないというやる気の無さ全開なので、図を画像化して張っておくよ。