Dockerはよく聞くワードですが、エンジニアでも実際にどういうものか知っている・使っているという人はどれだけいるでしょうか。
ましてや僕のような非エンジニアであればなおさらです。
しかし、
このDockerはテクノロジーの教養として知っておく価値があるものだと思いました!
大学で「テクノロジー教養」という試験があったら、必ずDockerの問題は10%くらい出るんじゃないかというレベルです。
そこで、今回はDocker 初心者がDockerを使えるようになるまでを何回かに分けて書いていきます。
ここで書く内容は、Udemy で受講できる、かめ れおんさんの米国AI開発者がゼロから教えるDocker講座
で学んだ内容を自分の中で定着するために調べたり考えたりした内容を踏まえて進めていきます。
導入は文章より動画のほうがすっと入ってくる人も多いと思いますので、少し記事を読んでいただき
「Docker面白そうだし、簡単そう」
と思った人はぜひUdemyで米国AI開発者がゼロから教えるDocker講座を受けてみてください。
それでは、Dockerを使う準備をしていきましょう!
Dockerとは
まず、Dockerとはなにかという部分を書いていきます。
Docker ドキュメント日本語化プロジェクトにあるDocker 概要を見てみると、こう書いてあります。
Docker はアプリケーションを開発(developing)・移動(shipping)・実行(running)するための、オープンなプラットフォームです。Docker は皆さんのアプリケーションをより速く運ぶために設計されています。Docker を使うことで、アプリケーションをインフラから分離し、アプリケーションを管理するようにインフラを扱えるようにします。Dockerはコードの移動をより速く、テストを速く、デプロイを速くし、コードの記述とコードの実行におけるサイクルを短くします。
Docker はこれを実現するために、カーネルのコンテナ化機能(containerization;コンテナライゼーション)がもたらすワークフローと手法(ツール)を組みあわせます。それゆえ、アプリケーション管理とデプロイの手助けになるでしょう。
なんか、アプリケーションを速く開発やテストや本番化ができるような技術っぽいです。
そのために、コンテナ化機能というのを使っているっぽいということはわかります。
ここで、キーワードのコンテナが出てきました。
Dockerを論じる前に、コンテナという技術について知っておく必要があります。
コンテナ
コンテナは、貨物船が来る埠頭に積まれているあのでっかい箱です。
それを元にした技術で、具体的には仮想化技術に近い技術のことです。
仮想化技術はこんな感じの技術で、
ホストOSという自分のPC(MacやWindowsやLinuxなど)の上に仮想化のソフトウェア(Virtual Boxなどが有名)があり、そのソフトウェアによってゲストOSという別のOSを動かし、そのOSの上でアプリケーションやプロセス(Excelやnginxなど)を動かすことができるという技術のことです。
イメージつきやすいのは、Windows が入っているPCの上で仮想的にMac OSを動かすことができるという感じです。
めっちゃスゴイです!!!
で、これをもっと速くするために、コンテナを使うわけです。
ホストOS(MacやWindowsやLinuxなど)の上にはコンテナが乗っかっておりその中でプロセスが動くというイメージになります。
図を見比べる限り、速くなりそうですよね。
ここで僕も思ったのですがOSはどうするの??という疑問です。
OSは、ホストOS(のカーネル)を使ってコンテナの中のプロセスを動かしています。
僕はMacユーザーですので、MacOSのカーネルが使われることになります。なので、Ubuntuのコンテナを作って、プロセスを動かしていてもそれはMacOSのカーネルが動かしているということになります。
実際にはコンテナというのは、namespaceという
プロセス、ファイル構造、ユーザーID、グループIDなどを1つのOSの中で分離する事ができる技術でこのnamespaceで区切られた空間をコンテナといいます。
Docker
ここまで見た方であれば、先程引用した、
「Docker はアプリケーションを開発(developing)・移動(shipping)・実行(running)するための、オープンなプラットフォームです。・・・」
のところが分かってくるのではないでしょうか。
Dockerの特徴を挙げてみます。
今回は、Docker, Inc.が提供しているDockerHubというサービスを使っていきます。
Kubernetes
Dockerの話が出ると、Kubernetes(K8s)というワードも出ることが多いです。
読み方は、クバネティス/クバネテス/クーべネティス いろいろありますが、これは何かというと、ドキュメントを引用します。
Kubernetesは、宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースプラットホームです。
Kubernetesは膨大で、急速に成長しているエコシステムを備えており、それらのサービス、サポート、ツールは幅広い形で利用可能です。
Googleは2014年にKubernetesプロジェクトをオープンソース化しました。KubernetesはGoogleが大規模な本番ワークロードを動かしてきた10年半の経験と、コミュニティから得られた最善のアイデア、知見に基づいています。
Kubernetesには多くの機能があります。考えられるものとしては
コンテナ基盤、マイクロサービス基盤、ポータブルなクラウド基盤
など、他にもいろいろ
Kubernetesは、コンテナを中心とした管理基盤です。ユーザーワークロードの代表格であるコンピューティング、ネットワーキング、ストレージインフラストラクチャのオーケストレーションを行います。それによって、Platform as a Service(PaaS)の簡単さの大部分を、Infrastructure as a Service(IaaS)の柔軟さとともに提供し、インフラストラクチャプロバイダの垣根を超えたポータビリティを実現します。
ドキュメント
大手クラウドベンダーのサービスも充実
コンテナ、Kubernetesの技術は大手クラウドベンダーでもサービスになっているくらい利用されています。
Microsoft Azureだと
AWSだと
- Amazon Elastic Kubernetes Service(Amazon EKS)
- Amazon Elastic Container Service
- Amazon Elastic Container Registry
などがあります。
Docker Hub
さて、基本知識が分かったところで早速Docker Hubを見ていきましょう。
Docker Hubは、Docker Image(コンテナを実行するときに必要なファイルシステムのこと)をユーザーが作成したコンテナをアップロードして公開したり共有したりできるサービスのことです。
Docker Hubへの登録とDocker Desktopのダウンロード
Docker Hubに登録していない人は、登録しましょう。
Docker Hubのサイトに行き、Sign Upします。プランは、0円のプランで大丈夫です。
登録が終わって、Docker Hubのサイトに行くとDocker Desktopをダウンロードできるボタンが出てきますのでダウンロード、インストールしましょう。
Docker Desktopがダウンロードできると、
アプリケーションとしては、こんなアイコンのアプリが入っており、アプリを起動させると、画面上部にクジラマークのDockerアイコンが出るようになります。
自分のPCに入っているDockerのバージョンを確認するにはこのコマンドをターミナルで実行します。
バージョン情報が出てくれば入っています。
$ docker --version
Docker version 19.03.12, build 48a66213fe
Docker HubからDocker Image をpullしてみる
それでは、実際にDocker のコマンドをつかってみます。
Docker DesktopがRunningの状態であることを確認し、以下のコマンドを実行します。
$ docker login
ここでusernameとpasswordを聞かれますのでDocker Hubに登録したときのものを入力してログインします。
素っ気ないのですが、このメッセージが出ればログイン成功です。
Login Succeeded
ログインしたら、次はpullです。
$ docker pull hello-world
すると、こんな感じでDocker Hubからhello-worldのDocker Imageの最新版が入ります。
Using default tag: latest
latest: Pulling from library/hello-world
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
Status: Image is up to date for hello-world:latest
docker.io/library/hello-world:latest
今回持ってきたのは、Docker Hub上のこれです。
上手くったら、イメージを見てみましょう。
$ docker images
すると、
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 7 months ago 13.3kB
こういう表示があれば無事にpullできていることがわかります。
コンテナを動かす
pullしたコンテナを、docker runコマンドで動かしてみましょう。
docker run <image>で動かすイメージを指定できます。
$ docker run hello-world
出力はこうなっているはずです。
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
動きました!!
確認してみましょう。
$ docker ps
すると、
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
なにも出ていないです。
ドキュメントを見るとこう書いてあります。
デフォルトの
docker ps
は実行中のコンテナだけ表示します。全てのコンテナを表示するにはdocker ps -a
を使います。
ということなので、 -a オプションをつけてみます。
$ docker ps -a
すると、
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
672f87d4ea6c hello-world "/hello" 2 hours ago Exited (0) 2 hours ago strange_noether
出てきました。StatusがExitedになっているので、実行中ではないことがわかります。
今回はここまでです。
今回の内容をまとめてみます。
振り返ってみると、これだけのことをやっていました。
ややこしいdocker run hello-worldの部分を図にしてみました。
まとめ
今回は、プログラミングのはじめの1歩でもあるHello WorldのイメージをDockerで動かすまでをやってみました。
Dockerをインストールし、Docker HubからDocker Imageをpullしてきてhello worldを表示させたというのは大きな一歩です。
次からは、Dockerをもう少し深く掘ってみるところと、Ubuntuのコンテナを使ってWebページを表示してみたりなどなどを取り上げます。