Docker超入門~通常レベルまで Part1

目次

1. Dockerとは?なんで必要?

Dockerとは、インフラ関係、DevOpsで注目されている技術の一つでDocker社によって開発されています。

アプリケーションをすばやく構築、テスト、デプロイできるソフトウェアプラットフォームです。Docker は、コンテナと呼ばれる標準化されたユニットにソフトウェアをパッケージ化します。コンテナには、ライブラリ、システムツール、コード、ランタイムなど、ソフトウェアの実行に必要なすべてのものが含まれています。Docker を使用すると、どのような環境にもアプリケーションをすばやくデプロイおよびスケールでき、コードを実行することができます。

Docker を AWS で運用することで、開発者や管理者は、どのような規模の分散アプリケーションでも、高信頼性と低価格を実現した方法ですばやくビルド、出荷、実行できます。

aws

Dockerがあると何が嬉しいの?

一言で言うと、どのパソコンやOSでも、同じ環境下で開発できる!ところです。

とはいえ、初学者は何を言っているのかわからないかと思います。

例えば、野菜や果物などの農作物を想像してみてください。

米は、田んぼで育ちます。

バナナや、パイナップルなどは、温暖な気候で育ちます。

サボテンは、乾燥している土で育っているのがわかると思います。

それぞれには、それぞれ適した環境があり、これが、互いに入れ替わった環境になることを想像してみてください。今まで通り美味しいものは育つでしょうか?答えは、NOです。

成長過程で枯れたり、病気になったりするでしょう。

実際には農業の現場において作物の共有なんてものは存在せず、それぞれ適した環境で育てればいいです。

しかし、ソフトウェアではいろんな人が、同じものを作るため環境の統一は不可欠になります。

では、どのようにすべきなのでしょうか?

ソフトウェア界隈の天才たちは以下のように考えました。ビニールハウス作れば、寒いとこでもあったかい気候と同じ感じで開発できるんじゃね?(厳密には全然違いますが、大雑把にこんな感じです)

2. 環境を統一するための仮想化技術の始まり

では、環境の統一方法。ビニールハウスのようなものを作る技術として、コンピュータの世界では、仮想化技術と呼びます。

イメージとしては、一般的な畑を整備して、ビニールハウスを建てたり、コンテナや工場、プランターなどを用意して、栽培環境を整えるようなイメージです。

2.1. 仮想化技術

どのようにして、仮想化技術がコンピュータ上で構成されているのか。

仮想化技術について以下の3つ紹介します。

  • ホストOS型
  • ハイパーバイザー型
  • コンテナ型

2.1.1. ホストOS型

ホストOS型は、画像の左の図ようにコンピュータに搭載されている、OSの上に仮想化基盤を構築し、作業環境を整えている。

先ほどの図で例えるならば、畑の一部にビニールハウスを建てて環境をできるだけ同じものに揃えようとしている感じである。

2.1.2. ハイパーバイザー型

画像の真ん中の図である。ハイパーバイザー型は、ホストOS型と似ている。しかし、根本的に違うことは、コンピュータ上に搭載されているOSがなく、そのまま仮想化を行なっている点だ。

先ほどの図で例えるなら、工場などを作る。または、畑全体をビニールハウス化するというものである。

2.1.3. コンテナ型

コンテナ型は、画像の右図のようにホストOS上にコンテナエンジンと呼ばれるシステムがあり、その上でコンテナと呼ばれる箱の中にアプリケーションを内包し開発を行う。

このコンテナ型こそが、Dockerの仕組みである。

先ほどの例で例えるなら、畑の上で、プランターや、コンテナを使って、育てるといった感じです。

2.1.4. Dockerと他の仮想技術は何が違うの?

画像を見た通りです。と言いたいですが、簡単に例で例えると、

ホストOS型やハイパーバイザー型は、畑の上にビニールハウスや工場を建てているイメージです。工場だといいですが、ビニールハウスの場合、土は基本的にその環境の土になっているので、少なからず影響が出ます。

また、完全に同じ環境にするためには、移動する必要がありませんか?要するに、北海道で作ったビニールハウスと沖縄で作ったビニールハウス 完全に同じものにするためには、北海道から沖縄へ、または沖縄から北海道へビニールハウスごと移動する必要がある。現実的にちょっと厳しいですよね💦

しかし、コンテナ型のDockerはどうでしょうか?プランター、コンテナの中で育てているのと同じであるため、移動も楽です。環境をほとんど同じものに揃えることができます。

3. Dockerはなぜ注目されているのか?

前章で述べたように、移動が楽で、どの環境で開発しようが、コンテナの中身の環境が変わらないため特化したものが作れるのです。

注目されている理由は、もちろんチーム開発で環境が共有しやすいというところもありますが、最大な部分はDevOpsです。

従来の手法では、開発する人、運用構築する人は、別の人が担っていました。

この時、開発時に使っていた環境と、運用時に使用する環境が異なることがあり、開発時は問題なく動いていたが、運用では動かなくなってしまうという問題が発生しやすくなる。これは、環境によるものでもあり、開発していない人が運用するため開発者と運用者の開発されたサービスに対する認識の違いによるものもある。

Dockerは、開発時にも運用時にも基盤として使えるため、同一環境下で進めることが可能であり、また、環境の構築スピードも早い。よって注目されているのである。

4. Docker超入門スタート

4.1. Dockerのインストール

Docker公式ページこちらよりDocker Desktopというアプリケーションをインストールしてください。

こちらが、図のコンテナエンジン~コンテナまでを担うアプリケーションになります。

英語で見づらいかもしれないですが、公式サイトがインストールのやり方をドキュメントにまとめているので参考にしてみてください。

Docker初めての方は、こちらのドキュメントに従って、Dockerのアカウントを作成してください。Dockerの機能を使うためにログインが必須のようです。

4.2. Dockerを起動

インストールしたDockerアプリを起動してみてください。

また、ターミナルもしくは、コマンドラインなどで、dockerというコマンドを実行してみてください。

docker

画像のように、表示されていれば、インストール成功でdockerを使用することができます。

4.3. DockerでHello World!

以下のコマンドを実行しましょう。

Dockerの世界へようこそ!ということで初めのコマンドとして実行します。

Docker run hello-world

以下のように表示されているはずです。

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
478afc919002: Pull complete
Digest: sha256:a26bff933ddc26d5cdf7faa98b4ae1e3ec20c4985e6f87ac0973052224d24302
Status: Downloaded newer image for hello-world:latest

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.
    (arm64v8)
 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/

4.4. Dockerイメージ

Dockerの基本的な使い方は以下のようになる。

環境は、Dockerコンテナと呼ばれるコンテナであり、アプリケーションの開発環境は、Dockerコンテナの内部ということだ。2.1.で説明したコンテナは、このDockerの場合、Dockerコンテナのことを指す。

ここで、覚えていて欲しいことは、コンテナのことではなく、真ん中のImageである。

Dockerのすごいところは、コンテナ化し、それを手軽に共有、別のものと簡単に組み合わせて、開発ができる点だが、重要になるのは、真ん中のImageが共有時に必要なデータなのだ。

共有は、コンテナを共有するのではなく、コンテナ情報をImageと呼ばれるデータに書き換え、共有。

使用する際は、Imageをもらい、コンテナ化する。

4.4.1. Dockerイメージをpullしてコンテナを作成しよう

ubuntuのイメージをpullしてみましょう

docker pull ubuntu
または
docker image pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
70104cd59e2a: Pull complete
Digest: sha256:1b8d8ff4777f36f19bfe73ee4df61e3a0b789caeff29caa019539ec7c9a57f95
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

docker desktopで確認するとubuntuの名前が、imagesの中で確認できます。

コマンドで確認する場合は、

docker images
または
docker image ls

先ほど、pullしたhello-worldとubuntuのイメージが確認できます。

REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
ubuntu        latest    dfbcc2701b93   10 days ago     69.2MB
hello-world   latest    ee301c921b8a   11 months ago   9.14kB

では、コンテナを作ってみましょう

Dockerのコンテナを起動する! 何を? ubuntuを!というコマンドを実行しましょう.

docker container run ubuntu

おや?何も変化はありませんね。

どういうことでしょうか?

docker desktopを見てみると何やら、containerのimageがubuntuのレコードが一つできています。

実はこれ、ちゃんと起動はしているのです。

Dockerの仕様上、どうやら正常終了してしまったようです。ドキュメント

では起動できるようにコマンドにオプションをつけましょう。

docker container run -it ubuntu

-itはオプションです。-i-tを組み合わせて-itになっています。ドキュメント

iは、interactiveの略でアタッチしていなくても、標準入力を開き続ける!って意味になります。

-tは、ttyという意味で linuxなどのコマンドでDocker上では、疑似 TTY を割り当てという意味があるそうです。

よくわかりませんよね。コマンドで試してみましょう。!!

2つのターミナルを起動させてみてください。

これは、標準出力の接続先デバイス事です。

ちょっと難しいですが、出力されている値が違うのがわかると思います。

ここで面白いことをやってみましょう。一方から、入力した値が、もう一方へ出力される。

指定した出力先へ出力ができるようです。面白いですね。

さて、docker container run -it ubuntuこちらの実行結果を見てみましょう。

docker container run -it ubuntu                                                                                                                                    ✔  17:19:41 
root@45vrdfefsdva9:/#
root@45vrdfefsdva9:/# ls
bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

以上のように表示されていれば問題ないです。これでコンテナの内部へ入り、ubuntuは起動し続けています。

さて、もうちょい深掘りましょう。exitコマンドを実行し、通常の画面へ戻ってください。

-iだけでやってみましょう。

docker container run -i ubuntu                                                                                                                           ✔  2m 6s   17:24:45 

ん?何も表示されませんね。ですが、起動はしっかりできています。これは、-tがないためです。

標準入力はできるのでlsコマンドなどを実行してみてください。

docker container run -i ubuntu                                                                                                                           ✔  2m 6s   17:24:45 
ls
bin
boot
dev
etc
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

ちゃんと出力されます。また、-itの時と同じ出力になっていることがわかるでしょう。

5. 終わりに

Part1はここまでとします。

次回は、 Part2です。お楽しみに!

コメントを送信

You May Have Missed