Docker 基本編

Docker

久々の投稿でございます。

今回はDockerを触ってみようと思いマッスル!

今まで、Dockerについては聞いたことはあったのですが全く使ったことがなかったので

この機会にDockerコミュニティにジョインしたいと思います!

では、早速Dockerについて書いていきたいと思います

1:Dockerとはなんぞや

まずここですが、私もそんなに詳しくはわかってないです笑

わかってる範囲で説明すると、例えばWebアプリをローカルで開発したとします

Webアプリを動かすにはもちろんただソースコードがあればいい訳ではなくて、そのアプリを動かすためのWebサーバであったり、データを保存するデータベースなんかが必要ですよね(Apache, nginxであったり、mysql,porsgreなんかです)

これをインストールして各々適切な設定を行なって初めてWebアプリが動く訳です。

ま、そりゃそやわなって感じですよね笑

環境構築が第一歩だと。。

で!ここで障害が発生するんですよね

自分のローカルで作成して動いているWebアプリをテストしてもらったり他の人にも挙動を確認してもらったりするためには、同じ環境を構築する必要が出てくる訳です。。

バージョンが違ったりするだけで正しく動かないなんてこともザラに出て来ます。。

もうおわかりいただけましたよね!

そう!Dockerは、同じ環境を誰にでもOS問わずすぐに共有することができるんです!

何が嬉しいかって、先ほどの例でもそうだし、共同で1つのアプリを開発する際にも同じ環境で開発しないと思わぬバグ(というか環境依存による不具合)が発生したりなんてことも起こりえます。

そんなしょうもない問題に時間を費やさなくてよくなるんです!

これ凄くないですか?

Dockerの素晴らしさについて十分わかってもらえてたかは不安ですが、気にせずDockerの基本コマンドについて書いていきます!

2:Dockerの基本コマンド

基本コマンドについて羅列する前に、Dockerのライフサイクルについて見ていきたいと思います。

Youtubeのこの方のが凄くわかりやすかったので、皆様も参考にしてみてください。

Docker Tutorial | Docker Tutorial for Beginners | What is Docker | Intellipaat

この方のものを抜粋して説明しますとDockerのライフサイクルはこんな感じです。

オンライン上にDockerHubというサイトがありまして

そこには、有志の方が色んな環境を構築してあるイメージというものが多数あります。

そのイメージ(例えばnginxのイメージ)をpullしてくると、自分の端末上にnginxのイメージがダウンロードされます。

で、このnginxのイメージからnginxが搭載された環境(コンテナ)が立ち上がるって仕組みです。

文字だけで説明してもわかりづらいと思うので実際にやってみます!

・Docker Engineをインストール

まずは、Dockerコマンドを使用できるようにするためにDockerをインストールしましょう!

ブラウザでdockerインストールなんて調べたら出てきます。

ちなみに、私はhomebrewでインストールしました。(どうでもいいか。。)

インストールが完了したら、下記コマンドでバージョン情報が出力されることを確認してください。

・Docker imageの取得

では、dockerhubから今回はubuntuのイメージをpullしてきましょう!

無事にpullできたみたいなので、dockerイメージが入っているか確認してみます。

私のは他にイメージをpullしてきているので複数出てきますが

ハイライトをつけたものが皆さんのターミナルにも表示されるはずです。

これで、下記の図のDocker imagesの部分までは完了です。

・Dockerコンテナの起動

では、取得したイメージからコンテナを起動してみましょう!

docker run ubuntu

???

は?ですよね笑

コンテナが起動しているかを確認する下記コマンドを実行してみます

docker ps

???

はーー??ですね笑

はい、これ実は、dockerコンテナは起動して処理が完了したら自動でコンテナが停止するようになっています。正確には、docker imageの中身を見れば分かります。

Cmdのブロックを見てわかるように、このイメージはコンテナを起動後、「/bin/bash」を実行します。

bashはシェルスクリプトで、ターミナルからの入力を受け付けるのですが

ターミナルが検出できないため、シェルスクリプトは処理が終了し、それによってコンテナは停止するという仕組みです。

ユニバのセーラームーンを助けにきたタキシード仮面並にすぐに失せる訳です

その証拠に、停止したコンテナを表示する下記コマンドを実行してみます

IMAGEの箇所にubuntuと書いてあるコンテナがありますね

STATUSがExited(停止)となっています。

これじゃせっかく手に入れたubuntuにwebサーバをインストールしたりできません

ではどうするのか。

bashのシェルスクリプトは、ターミナルを検出できればコマンドを受け付けるため

dockerイメージからコンテナを立ち上げる際に、ターミナルを紐付けるように明示してやればいいのです。

-iオプションはinteractiveとは、stdin(標準入力)をコンテナ側が受け付けるようにするオプションで、こいつがないとキーボードでコンテナ内の操作をすることができません。

-tオプションは、つけないと、ローカル(dockerホスト)とコンテナのstdin(標準入力)とstdout(標準出力)が接続されないため、コマンドを実行しても結果が見えず、コンテナの操作がやりにくくなります

-dオプションは、バックグラウンドでこのコンテナを起動することを意味します。

では、docker psコマンドで起動しているコンテナを見てみましょう!

イエーイ!!起動してますね!

・Dockerコンテナの操作

では、コンテナ内に入ってみましょう!

はい!入れました!このコマンドはもう覚えてください!笑

こいつにnginxをインストールしてみましょう!

その前に、このコンテナ内にnginxが入っていないことを確認しておきます。

では、パッケージをアップデートしてnginxをインストールします。

無事にインストールが完了したら、下記コマンドでnginxのステータスを確認します。

よし!無事にインストールされてますね!

では、nginxを起動させてアクセス(http://localhost)してみましょう!

すると。。。

な。。んだ、、と。。。

これはですね、コンテナのポートとdockerホスト(ローカル環境)のポートが紐付けされていないからなんです!

nginxはポート80でリッスンしているので、ローカル環境のポート80をそれに紐付けてやらなければなりません。

これをするには、イメージからコンテナを起動する際にポートバインディングをしてやらねばなりません。。(コンテナ起動後にポート紐付けする方法があれば誰か教えてください。。。)

なので、このコンテナは使い物になりません。。

またイメージからコンテナを起動する必要があるのです。

ここで注意が必要です!

このように、再度イメージからコンテナを立ち上げた場合、

nginxが入っていない状態に戻ってしまいます。

また、1から入れるのは面倒なので

nginxをインストールしたコンテナをイメージ化してしまいましょう!

イメージ化できたかどうか下記コマンドで確認してみます

作成したイメージ名のものがありますね!

それでは、ポートバインディングできていない不要なコンテナは下記コマンで削除しましょう!

※起動しているコンテナを削除する場合は、-fオプションをつけましょう!

では、作成したイメージをポートバインディングしてコンテナ起動します。

-pオプションは「ローカルのポート:コンテナのポート」となってますので

今回は80番で指定したときにnginxの80番へポートをバインディングさせています。

コンテナ内のnginxを起動させたら、アクセスしてみましょう!(http://localhost)

大成功!おめでとうございまっする!

これで君もDockerマスターだ!

では、最後に作成したdockerイメージをdockerhubにプッシュしておきましょう!

こうしておくことで、みんながこのdockerhubからイメージを落としてこれるので

環境構築の共有が楽ちんになります

プッシュするためにdockerhubにログインします。

プッシュが完了したら、dockerhubのサイトに入って確認します!

はい!ありましたね!

以上!簡単ではありますが、Docker基本編でした!

ちなみに、私はVSCodeの拡張機能のDockerを使用しているので

こんな感じでdockerhubの確認ができます!

よかったら試してみてね!

ばいちゃ!

コメント

タイトルとURLをコピーしました