Docker~入門編~ 私家版_ハンズオン#1
本記事について
仮想化ソフトのデファクトスタンダートと呼んでも差し支えないほど今や普及したDocker。
くじらのマスコットかわいい
そんなDockerをこれまで触る機会がなかった、という方へ向けて入門用ハンズオンを作成しました。
最低限の関連知識をおさえた後、実際の仮想環境立ち上げを通して、Dockerの概要と基礎を理解することを目的としています。
※各コマンドのオプションや細かいテクニックは本記事では基本扱いませんのでご了承ください。
導入
ーDockerとは
アプリケーションを開発・実行・デプロイするためのコンテナ型仮想化技術を提供するオープンソースプラットフォーム。仮想化は歴史がある技術ですが、従来の仮想化よりも軽量に動作する利点を持つコンテナ型仮想化は、ソフトウェアエンジニアリングの世界に急速に普及しました。
ーDockerを学ぶメリット
・開発環境の統一
OSや既存環境に縛られることない、画一的な実行(開発)環境を作成、管理し、共有することができます。そのため、非常に多くのプロジェクトで採用されていますね。
・多様な環境をシンプルかつ迅速に作成
数分あれば任意の言語、サービスが動作する環境を構築することができます。個人的に一番革新的だと感じたのは、いろんな言語/技術/サービスに手が出しやすくなった点(=初学コスト/参入障壁を下げてくれた点)です。例えば、linuxを勉強したい、nginxを勉強したい、MySQLを勉強したい、といったときに、Dockerを使えば数個のコマンドで勉強できる環境を一瞬で構築することができます。
目次
ハンズオンの目次は以下となります。
- インストール
- おさえておきたいDocker用語
- イメージの操作
- コンテナの操作
- まとめ
1. インストール
上記URLからインストールが可能です。
インストール完了後、下記コマンドを入力し、バージョン情報が表示されたらOKです。
docker --version
Docker version 20.10.12, build e91ed57
※dockerをGUIで操作できるDocker Desktopが同時にインストールされていると思いますが、本ハンズオンではCUI(コマンド)でdockerを操作しながら基礎理解を試みます。本ハンズオンが終わった頃にはGUIでも直感的に操作できるようになっているかなと思います。
2. おさえておきたいDocker用語
Dockerを利用するにあたり、おさえておきたい用語をみていきましょう。
・コンテナ
dockerによって立ち上がる仮想環境のこと。
・イメージ
コンテナを作成するための設計ファイルのこと。
・DockerHub
様々なイメージを蓄積しているライブラリ、レポジトリサービス。
・DockerFile
イメージをカスタマイズするための設計ファイルのこと。ビルドすることでイメージを作成することができる。
※DockerFileについては別記事で。
まずは、公式ドキュメントにある資料で視覚的にイメージを掴んでいきましょう。
3つの層に分かれていますが、それぞれざっくり以下のように解釈しましょう。
・Client : ホストPC(dockerをインストールした自分のPC)
・Docker Host : インストールしたdocker
・Registory : DockerHub
画像上のフロー(矢印)をそれぞれ説明すると以下のようになります。
①DockerHubからイメージを取得する。
②DockerFileをビルドしイメージを作成する
③イメージからコンテナを起動する
実際に利用する際は、①or②の方法でイメージを手元に準備してから③、といったフローとなります。
例えるなら、dockerがゲーム機本体、ソフトがイメージで、起動したゲームがコンテナでしょうか。
「Dockerで仮想環境を構築する」とは、言い換えるなら、イメージをもとにコンテナを立ち上げるということになります。
※DockerHub公式サイトでは、多くの種類のイメージを確認することができます。
リンクを貼っていますがユーザー登録が必要なため、余裕があればのぞいてみてください。
3. イメージの操作
ここからは実際にコマンドをたたきながらdockerを操作していきます。
本ハンズオンでは最もメジャーなwebサーバーアプリケーションの一つ”nginx”のコンテナを立ち上げたいと思います。
本項のロードマップは以下です。
・イメージの一覧
・イメージをDockerHubから取得
・イメージの削除
まずは、イメージの一覧取得から。取得しているイメージを確認するコマンドは以下です。
docker images
#イメージをまだ取得していないのでヘッダーのみ表示されています
REPOSITORY TAG IMAGE ID CREATED SIZE
次に、DockerHubからイメージを取得します。
docker image pull <取得したいイメージ名>
で、任意のイメージを取得できます。
今回は"nginx"のイメージを取得したいので以下のようになります。
docker image pull nginx
上記コマンド実行後、イメージ一覧を確認してみましょう。
docker images
#nginxのimageが取得できている
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6efc10a0510f 8 days ago 142MB
次にイメージの削除について。
docker rmi <削除したいイメージのIMAGE ID>
で、任意のイメージを削除できます。
先ほど取得した"nginx"のイメージを削除してみましょう。
docker rmi 6efc10a0510f
※IMAGE IDは自身の端末で確認したものに置き換えてください。
再度イメージ一覧を確認し、イメージがなければOKです。
以上がイメージの基本操作となります。
4. コンテナの操作
本項からはコンテナの操作に入っていきます。
本項のロードマップは以下です。
・コンテナの一覧
・コンテナの起動
・コンテナの停止
・コンテナの再起動
・コンテナ内部の操作
・コンテナの削除
ロードマップに入る前に、前項でイメージを削除しているので、再度"nginx"のイメージを取得してみてください。
イメージの取得が完了していることを確認してから、コンテナの一覧と起動に進みましょう。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6efc10a0510f 8 days ago 142MB
イメージが準備できたら、まずは、起動しているコンテナの一覧を取得するコマンドです。
docker ps
#コンテナがまだ起動していないのでヘッダーのみ表示されています
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
次にコンテナを立ち上げてみましょう。
コンテナを起動するコマンドは以下です。
docker run <立ち上げたいイメージ/IMAGE ID>
今回はnginxを立ち上げたいので以下のようになります。
docker run -d nginx
※"-d"に関してはバックグラウンド実行というオプションなのですが、本記事では説明を割愛します。
上記コマンドをたたいたら、起動しているコンテナ一覧を確認してみましょう。
docker ps
CONTAINER ID IMAGE ~ CREATED STATUS ~ NAMES
6587318c7be4 nginx ~ 23 seconds ago Up 23 seconds ~ friendly_nobel
※一部項目を省略しています。
STATUSがUPとなっていればOKです。
さて、今回立ち上げたコンテナは"nginx"コンテナ、
"nginx"はwebサーバーアプリケーションなので、この段階でブラウザ上から"nginx"が提供する画面を見ることができるようになっているはずです。
ブラウザのURL入力欄に”localhost”と入力して、"nginx"のindex画面が確認できたら、"nginx"コンテナの立ち上げは成功です。
それでは、次にコンテナを停止してみます。
コンテナを停止するコマンドは以下です。
docker stop <停止したいCONTAINER ID/NAMES>
私が立ち上げたコンテナの場合は、以下のいずれかになります。
docker stop 6587318c7be4
docker stop friendly_nobel
上記コマンドをたたいたら、以下を確認してみましょう。
・起動中のコンテナ一覧
・プラウザでhttp:localhost
起動中のコンテナがなく、また、"nginx"の画面が見れなくなっていたら、コンテナの停止は成功です。
余談ですが、これまでコンテナ一覧を確認する際にたたいていたコマンドdocker psは起動中のコンテナ一覧を確認するコマンドでした。
停止したコンテナも含めて一覧確認したい場合は"-a"オプションをつけます。
docker ps -a
#先ほど停止したコンテナが表示される
CONTAINER ID IMAGE COMMAND CREATED STATUS ~
6587318c7be4 nginx "/dock…" 2 hours ago Exited (0) 5 seconds ago ~
※一部項目を省略しています。
STATUSがUPからExitedになっていることが確認できます。
それでは、次に停止したコンテナを再開(再起動)してみましょう。
停止したコンテナを起動(再起動)するコマンドは以下のいずれかです。
docker start <起動したいCONTAINER ID/NAMES>
docker restart <再起動したいCONTAINER ID/NAMES>
私が立ち上げたコンテナの場合は、以下のいずれかになります。
docker start 6587318c7be4
※restartでも可
docker start friendly_nobel
※restartでも可
上記コマンドをたたいたら、docker psまたは、docker ps -aでコンテナのSTATUSを
確認してみてください。
UPとなっていれば再起動が完了です。
次は立ち上げたコンテナの、コンテナ自体ではなくコンテナ内部での操作です。
コンテナ内部での操作とはどういうことでしょうか。
今立ち上げているコンテナの中で動いているのは"nginx"なのですが、"nginx"をはじめとするアプリケーションには設定用のファイルがあることがほとんどです。
"nginx"が動いているのはコンテナ内部なので、"nginx"の設定ファイルがあるのはコンテナ外部(ホストPC)ではなくコンテナ内部。よって、設定ファイルの編集は行う時はコンテナの内部でお願いしますね、ということになリます。
コンテナの中に入るコマンドは以下です。
docker exec -it <操作したいCONTAINER ID/NAMES> bash
※"-it"に関しては、"ttyの割り当て"&"標準入力を開く"オプションなのですが、本記事では説明を割愛します。
※"bash"に関しては、"shellの指定”ですが、本記事では説明を割愛します。
docker exec -it 6587318c7be4 bash
#root@<CONTAINER ID>が表示されていればコンテナ内部に入ることができています。
root@6587318c7be4:/#
多くのイメージにおいて、コンテナの中のOSには軽量linuxが搭載されています。
そのまま、以下のコマンドをたたいてみてください。
cat /etc/nginx/nginx.conf
#nignxの設定ファイルが表示されます
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
~
※catコマンドはlinuxのコマンドです。指定ファイルの中身を確認することができます。
コンテナ内部の操作がしたい場合は、このような流れでコンテナに入ってから、任意の操作を行なっていくことになります。
コンテナから出たい(=ホストOSに戻りたい)時は、以下のコマンドをたたきます。
exit
以上が、コンテナ内部の操作となります。
最後に、コンテナを削除してみましょう。
コンテナを削除するコマンドは以下です。
docker rm <削除したいCONTAINER ID/NAMES>
削除時の注意点として、削除できるコンテナは停止中のコンテナのみとなります。
私が立ち上げたコンテナの場合は、以下のいずれかになります。
docker rm 6587318c7be4
#docker rm friendly_nobelでも可
コンテナを停止させた後に上記コマンドをたたいたら、docker ps -aでコンテナ一覧を確認し、コンテナが表示されていなければ削除成功です。
以上、コンテナの立ち上げ、停止、再開、削除といったコンテナ操作の基本でした。
5. まとめ
本記事で登場したコマンドを表にまとめて、結びといたします。
最後まで閲覧いただきありがとうございました。
分類 | コマンド | 内容 |
---|---|---|
- | docker --version | インストールしているdockerのバージョンを表示 |
イメージ | docker images | 取得したイメージを一覧で表示 |
イメージ | docker image pull ~ | イメージを取得 |
イメージ | docker rmi ~ | イメージを削除 |
コンテナ | docker ps | 起動中のコンテナを一覧で表示 |
コンテナ | docker ps -a | (起動、停止問わず)コンテナを一覧で表示 |
コンテナ | docker run ~ | イメージからコンテナを起動 |
コンテナ | docker stop ~ | コンテナを停止 |
コンテナ | docker start/restart ~ | コンテナを起動/再起動 |
コンテナ | docker exec -it ~ bash | コンテナに内部に入る |
コンテナ | docker rm ~ | (停止中の)コンテナを削除 |
Discussion