40歳から始めたエンジニアブログ

ColdFusionのエンジニアを10年強やってきたエンジニアが他の技術も学びたくて勉強しているブログ

Dockerを学ぶ その1 DockerDesktop入手からコンテナの起動までの練習

えっ?Docker使うの?

今やっている仕事での開発環境の定義が、

「Docker Compose のMySQL コンテナを使用」となっていて、

今までの10年間が

開発端末:WindowsEclipse or VSCode

社内(本番)開発環境:WindowsServer +Coldfusion

だった人間からは「えっ?」という状態。

 

で、Dockerというのは「なんかクジラのアイコンのVMWareみたいな仮想マシン」というニュアンスの認識はしていたんだけど、利用しないと駄目か、、、と勉強開始。

 

解説が全部Linux、、、

ということで、Dockerを使うために、、、と調べると
全部って言っていいほど「Linux上でCUI」している解説ブログばかり、、、

Linuxも多少のコマンドラインは叩けるけどもVMWareみたいにWindowsで操作できないの?と混乱。

 

Dockerをインストール

一応、「Docker Desktop for Windows」っていうのがあるようなので

インストール。>そして成功。

f:id:aki40-dev:20211226082533p:plain

インストールは成功した

まずは基本的なことを学ぶ

まずはどういったものなのか、初心者用の解説ブログがあったので

qiita.com

上記のページを読んでいって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~

え、、、なにこれ。

検索したらこんなのを見つける。

stackoverflow.com

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

hub.docker.com

で見れるとのこと。

 

ちなみに、、、URLを削って「https://hub.docker.com/

hub.docker.com

に行くと自分のダウンロードしたイメージ?が置いてあった。

このメニューの中で

f:id:aki40-dev:20211226193306p:plain

このメニューをクリックすると、さっきのイメージ一覧のページに行く

 

実際にコマンド打って使ってみる

ブログには「チュートリアル」として

nginx のイメージを利用して Web サーバーを立ててみます。

とあるので、1つずつ実行していってみる。

手順は以下のようだ。

  1. イメージを取得(searchとpull、そして取得確認でimages)
  2. コンテナを生成して起動(run)
  3. コンテナ内で作業をする

そもそもコマンドラインでは「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

成功したのかな。

f:id:aki40-dev:20211226204244p:plain

nginxが増えてる!

コマンドラインでも「images」で一覧表示できるようだ。

>docker images
REPOSITORY                      TAG       IMAGE ID       CREATED       SIZE
nginx                           latest    f6987c8d6ed5   5 days ago    141MB

よし!

 

コンテナの作成と起動

コンテナはホストOSとは別のものなので、ホスト上で情報が見れるように、

コンテナのディレクトリをホストのフォルダにマウントして見れるようにする

ことを先に作業をします。と。

f:id:aki40-dev:20211226231141p:plain

Googleドライブに「Docker」ってフォルダを作ろう

Dockerフォルダにマウントを受け付けるフォルダ「nginx\log」を作成

>mkdir -p nginx\log
    ディレクトリ: H:\マイドライブ\Docker\nginx
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2021/12/26     23:12                log

f:id:aki40-dev:20211226231519p:plain

出来たできた

コンテナ生成と起動を同時に行うのが「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が見れるはず、、、!!!

f:id:aki40-dev:20211226233732p:plain

nginxが動いてる!!

Docker Desktopも、、、

f:id:aki40-dev:20211226233908p:plain

つけた名前で起動してるね

ただし、、、

f:id:aki40-dev:20211226234322p:plain

マウントしたフォルダにlogファイルが見えない、、、

何故だ、、、

調べたら、、、

-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

f:id:aki40-dev:20211227001511p:plain

パスを直したら無事にlogファイルは出てきました、良かったー。

ちょっと長くなってきたので、まずは今日はここまで。