WindowsのPCにDockerを導入
2020年6月に中古で購入したthinkpad x260にDockerを導入してみたく、実践記です。
これまで、macbookProで仮想マシン、Vagrantでのローカル開発環境を作って使用していました。そんな開発環境をガッツリ使うわけじゃないので、仮想マシンでもよいかもですが、せっかくなので、勉強のためにもDockerを導入してみようと思いました。
ちなみに、まったくの初心者なので、Dockerは開発環境ということはなんとなくわかりますが、どんなものなのかは全く知りませんでした。
そこで、ググってDockerについて調べました。難しそうだったり、ネット上に僕でも理解できる情報が少なさそうだったら、本を買って勉強するつもりでしたが、非常に分かりやすいサイトを発見しました。
仮想マシンとDocker、コンテナの違い~Dockerの実際の使われる場面まで、概要を知ることができました。
windowsでDockerを導入するには、HYPER-VまたはWSLのどちらを使うのかを決める必要があるみたいです。
HYPER-VとWSLの違いについてもググってみました。
結局HYPER-Vに決めたのですが、こちらの記事を参考にしました。
簡潔にまとまっていて、ざっくりどんな違いがあるかの目安になりました。
ガッツリと開発環境をつくりたいなら、HYPER-Vを利用する感じと解釈しました。
Docker導入にあたって参考にさせていただいた先ほどのサイトでもDockerの導入にHYPER-Vを使った手順だったので、こちらの選択で間違いなさそうです。
ここからはメモ的な感じで記載していきます。
Docker導入手順メモ
・HYPER-Vを有効化する方法
デスクトップの検索に「コントロールパネル」と入力すると、コントロールパネルが開く。
「プログラム」をクリック。
「windowsの機能の有効化または無効化」をクリック。
「HYPER-V」をクリックして適用させる。
→処理が始まり、すこし待っていると適用されます。
→ここまで、簡単ですが、意外と忘れそうなので、しっかり忘備録。
※windows10homeだとHYPER-Vの機能自体が存在しないので、10proが必要です。
重要な追記:
HYPER-Vを有効化するだけでは、実は有効化されていませんでした!
その場合は、BIOS設定を変更する必要があります。
BIOSの立ち上げ方は、PCのメーカーによって異なりますので、ググっていただくとBIOS立ち上げ方法が出てきます。
thinkpad bios みたいなキーワード検索です。
F-1~F-12キーのどれかをPC起動時に押すと、立ち上がります。
僕の場合は、thinkpadなのでF-1キーらしいですが、単にEnterキーだけでよかったような気もします。
BIOSが立ち上がったら、Vidualized(仮想化についての設定)みたいなメニューがあるので、DisabledからEnabledに変更します。
以上でHYPER-Vは有効化されます。
Dockerのインストールから各種使い方まで
僕が進めていて、つまづいてできなかったとかなかったので、最初にご紹介したサイトの記事を参照しつつ進めていきます。
DockerのインストールはDockerのサイトで行います。
Docker for windows desktopをダウンロード、インストールして各種設定を行います。
コマンドでDockerの操作
Dockerをインストールできましたら、コマンドでDockerの操作をしていけます。
Dockerを操作するためのコマンドは今回はwindows標準のPowerShellを使います。
Windowsなので、普通はPowerShellにてDockerコマンドのPATHが通っているので、MSYS2など他のシェルで操作を行いたい場合は、そちらにPATHを通す必要があります。
勉強のためにも、近いうちにMSYS2にDockerコマンドのPATHを通してみたいと思います。今回はとりあえずPowerShellで作業進めます。
各種コマンド
覚えておきたい各種コマンドをメモしておきます。
どんなコマンドがあるかなど、コマンドの一覧を辞書的に調べるには、
docker help
でズラーっとdockerコマンドの一覧が表示されたので、サラッとどんなコマンドがあるのか眺めておくのもよいかもです。
具体的なコマンドの詳細をみたいときは、
docker [command] --help
でoptionの詳細など見れます。
例えば、プロセスを表示するpsコマンドの詳細をみたいときは、
docker ps --help
にて見れる感じです。
上記の例でpsコマンドのhelpをみると、-a(allの意)オプションで停止中のコンテナもみれることがわかります。
お好みのimageをDockerのコンテナに取り入れる
docker pull (image名):(tag名)
例)centOSのimage、具体的なtag名がcentOS8の場合
docker pull centos:centos8
上記により、DockerコンテナにcentOS8がインストールされる。
imageやtag名の探し方:docker hubにアクセスして探せる。
コンテナの起動・停止・再開
通常、コンテナはあえて起動という操作をしないと、停止状態になっている。
docker runにて起動
runなので覚えやすく、何回かすると自然と覚えられそうですね。
具体例:
// 新たにhogeというコンテナ名を付けて、centos8のimageで/bin/echo helloというコマンドを実行する
docker run --name hoge centos:centos8 /bin/echo hello
docker stopにて停止
こっちもstopなので覚えやすいですね。
具体例:
// stopの引数にコンテナ名またはコンテナIDを渡す
// この例ではコンテナ名を渡している
// コンテナIDはdocker psコマンドで確認できる
docker stop hoge
稼働中のすべてのコンテナを一括で停止
docker stop $(docker ps -q)
docker ps -qとqオプションをつけることで、稼働中のコンテナのIDが抽出されます。これを対象にして、docker stopで停止する感じです。
docker startにて再開
stopと引数は同じで、stopの部分をstartにすると、再開できます。
// コンテナ名hogeを再開
docker start hoge
作成したコンテナの削除(停止中のコンテナ)
// コンテナ名:hoge を削除
docker rm hoge
すべてのコンテナを削除するには、
docker rm $(docker ps -aq)
-qオプションは、IDを抽出します。-aqとすることで、すべてのコンテナのIDだけを抽出します。これを対象に、rmで削除します。
ここはdocker rm --help で調べても、なんかググって出てくる外部記事を見ても説明にギャップを感じ、説明がしっくりこない。
こんなときは、実際にdocker ps -aとdocker ps -aqを実行してみて違いを試してみるのが一番良さそう。
試してみると、-aqとしてみると、すべてのコンテナのIDだけ表示されました。-qオプションにすることで、IDだけを抽出して、ほかの情報をそぎ落とし、処理をシンプル化する感じですかね。
作成したDockerコンテナをimage化する方法
Docker Hubなどのパブリックなリポジトリやプライベートなリポジトリに作成したコンテナを公開するために、イメージ化を行います。
コンテナを誰かが使えるようにパッケージ化する感じです。
イメージ化して、イメージをリポジトリにpushすることで、作成した自分だけでなく、第3者の人もリポジトリからイメージをpull・引っ張ってこれるようになる。
githubみたいな感じかな。
docker commitにてdockerコンテナのimage化
僕的にはcommitとimage化って結びつきにくい気がするので、少々覚えにくいコマンドですね。
// commitの引数にコンテナ名とイメージ名を順番に渡す。
// hogeというコンテナをhoge1というイメージ名にしてイメージを作成
docker commit hoge hoge1
作成したイメージを確認する方法
docker images
作成したimageが一覧で表示されます。
イメージを削除する方法
docker rmi [イメージ名]
イメージを削除なので、rmにimageのiを付ける感じで、推測はしやすいコマンドですね。
danglingなimageを全消し削除する方法
詳細はあまり詳しく分からないですが、dockerをどんどん使っていくと、僕もdanglingなimageができていくかもしれません。
どのコンテナにも関係しないブラブラぶら下がった宙に浮いた、中途半端なimageのことみたいです。使わないやつは削除するみたいな感じでしょうか。
docker rmi $(docker images -f "dangling=true" -q)
docker images -f は、フィルターをかけるオプション。この場合は、"dangling=true"の条件でフィルターをかける。
-qは、IDのみを表示させるオプション。
dangling=trueの条件のimageのIDを抽出し、それを削除する。という意味のコマンドです。
danglingなimageもそれ以外の停止中のコンテナも全部削除する方法
docker system prune
練習でゼロからやり直したいときなど、便利そうなコマンドですね。
commitで作成したイメージをリポジトリにpush
Docker Hubにアカウントを作成したらDocker Hubのリポジトリにイメージをpushできます。
アカウント作成してログインしたら、イメージをpushできる自分専用のリポジトリを持てる感じかも。
アカウント作成し、Google Chromeのお気に入りに登録するなどして、すぐDocker Hubの自分のページに入れるようにしておくと良さげです。
アカウント作成したら、イメージをpushできる状態になってますので、pushしてみましょう。
docker hubにログイン
docker login
usernameとpasswordが聞かれるので、docker hubのユーザー名とパスワードを入力してログインします。
これで、ターミナル(端末)からdocker hubと繋がった状態になります。
この繋がった状態から、push作業をしていくことになります。
まず、イメージ化したイメージのimage IDが必要なのでメモまたはコピーしておきます。
// image IDを確認する
docker images
docker tagで公開するイメージを所定の書式に従ってタグ付けする。
ぶっちゃけよくわからないけど、とりあえずpushするために必要だと覚えておけば問題なさげ。
docker tag [imageID] [dockerID]/[image名]:[tag名]
tag名はバージョン情報で、初めてな場合は1.0とかで良いみたい。
具体例:
docker tag 1234567abc noabou/hoge1:1.0
tag A BでAにBをタグ付けするみたいな感じで、
image IDにイメージ名、ユーザー名、バージョン情報など情報を関連付けるために行っていると思われます。
これでpushの準備は完了です。
tag名をdocker pushの引数に渡してpushする
先ほどの例でいくと、
docker push noabou/hoge1:1.0
でpushできます。
Docker Hubのウェブサイトにアクセスしてみると、イメージが追加されていることが確認できます。
ここまで進めた感想、思ったよりも簡単だけど、何回か操作しないとすぐ忘れそうですね。
ここまでの作業が一区切りになりそうです。
コンテナにログインして作業
コンテナにログインして作業する方法。docker loginと違うの?と一瞬思ってしまいました。docker loginというコマンドは、docker hubにログインするためのコマンドで、コンテナにログインするのとは別物だということをしっかり覚えておきたいです。
コンテナにログインするのは、
docker run -it --name hoge centos:centos7 /bin/bash
のようにコマンドを打ちます。
-itは、
iオプションは、標準入力を開き続けるという意味。キーボードからの入力を受け付けている状態になる。
tは、tty、端末を開くという意味。
なので、-itでコンテナ内の端末を操作できることになります。
docker runコマンドを、
PowerShellからdocker run --helpで調べてみました。スクショをみると、
・run:新規のコンテナにコマンドを実行する。
・用法も書いてありますね。基本的なコマンドを覚えたら、用法やオプションは都度調べるのが便利そうですね。
コンテナにログインすると、プロンプトが変わるので、コンテナにログインできていることが見た目でわかります。
Apacheを利用してウェブページを作成してみる
Apacheとは俗称で、1995年から使われているHTTPサーバー。Docker Hubにも説明が載っています。
Docker HubのイメージのリポジトリからApacheを利用してみます。
httpdというDocker official imageがあります。Docker Hubが公式で出しているイメージです。
Docker Hubの検索バーでhttpdと検索するとApacheのページが表示され、右側のView Available Tagsをクリックすると、各種バージョンのtagが表示されます。
Apacheの入ったコンテナを新規で作成します。
docker run -p 8080:80 --name helloworld httpd:2.4.43
httpd:2.4.43の部分がView Available Tagsに挙げられているApacheのイメージの一つです。他にもバージョンがいっぱいあります。
Alpaine版がありますが、分からないので調べたところ、Alpine Linuxがヒットしました。Alpine Linuxは軽量なLinuxみたいです。具体的には良くわからないけど、Apacheの軽量版みたいな感じかもと思いました。
とりあえず普通のバージョンを使えば問題なし。
-pオプションは、ホストのポートからコンテナのポートへの転送を作成します。
webブラウザからlocalhost:8080、すなわちポート番号8080番にアクセスしたら、コンテナのポート番号80に転送されます。
これで、localhost:8080をブラウザのURL入力するところに入力したら、
webサーバーであるApacheに転送され、結果としてApacheサーバー側で持っている情報がレスポンスとしてブラウザのlocalhost:8080に返され、表示されます。
今回の具体例では、Apacheの入ったコンテナの中に作成した情報・htmlファイルの内容が表示されます。
デフォルトでindex.htmlファイルが準備されているので、その中身が表示されます。
コンテナの中身をlsコマンドで確認してみます。
その前に、作ったコンテナからexitして、またコンテナに入る方法が意外とわからなかったので、見てみましょう。
コンテナへのログインは、コンテナが起動していないとできないみたいです。
なので、作ったコンテナにログインするには、
docker start hogehoge
などとしてコンテナを動かしておきます。
そして、
docker exec -it hogehoge /bin/bash
とすることで、コンテナにログインできます。
コンテナにログインすることで、コンテナの中でいろいろ操作できます。
execコマンドも調べてみると、用法とコマンドの意味、オプションの意味が表示されます。
execは起動中のコンテナでコマンドを実行するという意味のコマンド。
例では、hogehogeコンテナで/bin/bashを実行するという意味になります。
/bin/bashとは、binディレクトリのbashファイル。
bashはシェルのことです。
なので、hogehogeコンテナの中でシェルを実行、起動するということになり、事実上として、コンテナ内のシェルを動かしていることになり、コンテナにログインしていることになります。
コンテナに入る方法が分かったので、先ほど表示された「It works!」のファイルであるIndex.htmlファイルをlsで見てみます。
すると、ズラーっとディレクトリが表示されました。index.htmlファイルはhtdocsディレクトリの中にあります。
このファイルが表示されていたのですね。
次は、ついでに、このhtdocs内に別のhtmlファイルを作って表示してみます。
// htmlファイルをつくるためにvimをインストール
apt-get update;apt-get install vim
コンテナにどんなパッケージ管理ツールが使えるかは、コンテナ内でwhich aptとかwhich yumとかで調べて、あればファイルのありかが表示されます。
追記:
コンテナが稼働中であれば、コンテナにログインしていなくても、ディレクトリの中身が確認できます。軽く確認したいときに便利ですね。
// 停止中のコンテナ名:testweb を起動
docker start testweb
// testwebのディレクトリを/bin/lsコマンドで確認
docker exec testweb /bin/ls
他にも、
docker exec testweb /bin/which apt
としたら、コンテナにログインしていなくても、コンテナの中のaptを探せます。実際はコンテナの中にログインして作業するのが基本な気もするので、そんな使わないかもですが、できるということを覚えておきたいと思います。
logを確認する方法
docker logs [コンテナ名]
このコマンドで、操作したlogが表示されます。便利ですね。
Dockerfile
Doclerfileとは、何か全然わからないので、ググってみました。
コンテナ作成~image作成まで自動化したスクリプトファイルみたいな感じかなと解釈。Dockerfileを実行することで、自動作成する感じ。
dockerfileからイメージを作るコマンド
docker build -t [イメージ名]
dockerfileについても、手を動かしつつ、また内容をアップデートします。
また追ってメモついかします。
この記事が気に入ったらサポートをしてみませんか?