Dockerを学ぶ その1 DockerDesktop入手からコンテナの起動までの練習
えっ?Docker使うの?
今やっている仕事での開発環境の定義が、
「Docker Compose のMySQL コンテナを使用」となっていて、
今までの10年間が
開発端末:Windows+Eclipse or VSCode
社内(本番)開発環境:WindowsServer +Coldfusion
だった人間からは「えっ?」という状態。
で、Dockerというのは「なんかクジラのアイコンのVMWareみたいな仮想マシン」というニュアンスの認識はしていたんだけど、利用しないと駄目か、、、と勉強開始。
解説が全部Linux、、、
ということで、Dockerを使うために、、、と調べると
全部って言っていいほど「Linux上でCUI」している解説ブログばかり、、、
Linuxも多少のコマンドラインは叩けるけどもVMWareみたいにWindowsで操作できないの?と混乱。
Dockerをインストール
一応、「Docker Desktop for Windows」っていうのがあるようなので
インストール。>そして成功。
まずは基本的なことを学ぶ
まずはどういったものなのか、初心者用の解説ブログがあったので
上記のページを読んでいって1から学ぶことにした。
Windows の場合も Windows 10 以上かつ Home でなければ Docker for Windows をインストールするだけです。
そうだったのか。先日PCが起動しなくなったのでもともと入っていたHomeからProへインストールを変更して再インストールしたので、
DesktopWindowsを入れることが出来ていたみたいだ。
ラッキーだ。
docker --version で起動確認
> docker --version
Docker version 20.10.11, build dea9396
よし動いているようだ。
--version
だと簡易確認、version
だと詳細確認。
とのことなので、version パターンも試してみる。
> docker version
Client:
Cloud integration: v1.0.22
Version: 20.10.11
API version: 1.41
Go version: go1.16.10
Git commit: dea9396
Built: Thu Nov 18 00:42:51 2021
OS/Arch: windows/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.11
API version: 1.41 (minimum version 1.12)
Go version: go1.16.9
Git commit: 847da18
Built: Thu Nov 18 00:35:39 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.12
GitCommit: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc:
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2
docker-init:
Version: 0.19.0
GitCommit: de40ad0
OKOK。
docker infoの罠
docker info
で動作状況を確認できます。
なるほどね。実行してみるか。
>docker info
。。。
WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support
WARNING: No blkio~
え、、、なにこれ。
検索したらこんなのを見つける。
I determined that this Docker "Warning" is nothing important. And this warning is really just an unnecessary warning.
Google翻訳によると
このDockerの「警告」は重要ではないと判断しました。 そして、この警告は本当に不必要な警告です。
だって。なので気にしないことにする。
用語を覚える
上記の説明ブログに用語を各種関係性とともにイラストでわかりやすく書いてある。
なるほどね。
ホストOSの上にDockerがあって、その上にコンテナという仮想マシン(複数可能みたい)があって、イメージというゲストOSのファイルがあるようだ。
で、ネット越しにDocker Hubというものがあって、そこにはイメージが沢山用意されていると。それをダウンロードしてイメージ置き場に置いておくと。
あとはゲストOSはLinux限定なのか。
また、「イメージはコンテナを生成するもととなるもの」とあるから、
まずイメージがあって、イメージを仮想マシン化したものが「コンテナ」となるのかな。
(用語ごとに解説を書くと、上記ブログの丸コピーになってしまうので、自分が理解したニュアンスだけ当ブログに書く)
DockerHubは「https://hub.docker.com/search」
で見れるとのこと。
ちなみに、、、URLを削って「https://hub.docker.com/」
に行くと自分のダウンロードしたイメージ?が置いてあった。
このメニューの中で
実際にコマンド打って使ってみる
ブログには「チュートリアル」として
nginx のイメージを利用して Web サーバーを立ててみます。
とあるので、1つずつ実行していってみる。
手順は以下のようだ。
- イメージを取得(searchとpull、そして取得確認でimages)
- コンテナを生成して起動(run)
- コンテナ内で作業をする
そもそもコマンドラインでは「docker なんたら」とdockerの後ろに上記のコマンドを打って処理を切り分けているみたいだ。
sqlplus なんたらー みたいなもんかな。
>docker help
で色々なdockerコマンドが表示された。あとで慣れてから見てみよう。
イメージを取得
searchコマンドでイメージが検索できるようで、かつ種類もコマンドで打てばその種類のイメージを検索できるようだ。
>docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 16021 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2103 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 820 [OK]
以下略
一番上の「Official build of Nginx.」を使うので、そのNAMEの「nginx」をコマンドで使う。
今度はイメージ取得で「pull」だ。
>docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
f3409a9a9e73: Pull complete
9919a6cbae9c: Pull complete
fc1ce43285d7: Pull complete
1f01ab499216: Pull complete
13cfaf79ff6d: Pull complete
Digest: sha256:366e9f1ddebdb844044c2fafd13b75271a9f620819370f8971220c2b330a9254
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
成功したのかな。
コマンドラインでも「images」で一覧表示できるようだ。
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f6987c8d6ed5 5 days ago 141MB
よし!
コンテナの作成と起動
コンテナはホストOSとは別のものなので、ホスト上で情報が見れるように、
コンテナのディレクトリをホストのフォルダにマウントして見れるようにする
ことを先に作業をします。と。
Dockerフォルダにマウントを受け付けるフォルダ「nginx\log」を作成
>mkdir -p nginx\log
ディレクトリ: H:\マイドライブ\Docker\nginx
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/12/26 23:12 log
コンテナ生成と起動を同時に行うのが「run」なのね、、、
-d がバックグラウンド起動の指定で、つけ忘れるとこのターミナルの入力が受け付けなくなる、、、と。そりゃそっか。つけ忘れないようにしないとな。
つけ忘れたら別のターミナルを起動して、そっちでコンテナの停止をすればOKとのこと。
-p がホストのポートとコンテナのポートをつなげる指定で、80:80ってやると80同士がつながると。
コロンの前がホストのポートで後ろがコンテナのポート。
だから -p 8080:80 ってやれば、8080ポートを指定したときにコンテナ側のポートに行くので内部のnginxの80ポートで動作するってこと。
-v がさっきのフォルダのマウントの指定で、
$(pwd)/nginx/log:/var/log/nginx
て書くと、ホスト側の「$(pwd)/nginx/log」と、コンテナ内の「/var/log/nginx」がマウントでつながると。
ただしこのブログはLinux上で操作しているので、ホスト側はWindows記述で書かないといけない。
だからこうなる。
>docker run -d -p 80:80 --name webserver_test -v H:\マイドライブ\Docker\nginx\log:/ver/log/nginx nginx
Windows側だから「\」でフォルダ区切り。コンテナはLinuxだから「/」区切り。
使い方が
docker run [OPTIONS] IMAGE
だから、
docker run ---> docker run
[OPTIONS] ---> -d -p 80:80 --name webserver_test -v H:\マイドライブ\Docker\nginx\log:/ver/log/nginx
IMAGE ---> nginx
になっている。
OPTIONSを全部指定してから、IMAGE指定なのね。
、、、なんとなく docker run IMAGE [OPTIONS] の記述順の方が
自分の脳内→「docker で IMAGEをrunします。オプションはこれとこれです」となるのになあと思ってしまった。
さて、これでdockerでnginxが起動できたわけなので、
http://localhost/ でnginxのwebrootのindex.htmlが見れるはず、、、!!!
Docker Desktopも、、、
ただし、、、
何故だ、、、
調べたら、、、
-v H:\マイドライブ\Docker\nginx\log:/ver/log/nginx
varだよ、、、versionじゃないよ、、、
やり直すためには
stop > rm で停止して、削除して、を行わないといけないようだ。
stopだけだと
>docker stop webserver_test
webserver_test
>docker run -d -p 80:80 --name webserver_test -v H:\マイドライブ\Docker\nginx\log:/var/log/nginx nginx
docker: Error response from daemon: Conflict. The container name "/webserver_test" is already in use by container "6f0410ece110d84a701652888896061d68c6f61b4239a78a92ccea703d857ef1". You have to remove (or rename) that container to be able to reuse that name.
と、コンテナが競合しているって出てしまう。
だから、rmでコンテナを削除して再度run。今度はマウント設定を間違えないように、、、
>docker rm webserver_test
webserver_test
>docker run -d -p 80:80 --name webserver_test -v H:\マイドライブ\Docker\nginx\log:/var/log/nginx nginx
316001cb3a84ebc5ce64d7083162142505ae773bdafcb9f21521bf18cd87a627
ちょっと長くなってきたので、まずは今日はここまで。