概要
本記事では、「Dockerとはなにか」から解説し、実際にコンテナを立ててみるところまでを書きました。コンテナやDockerについて「名前だけは聞いたことあるけど、使い方がわからない」という疑問がある方の一助になれば幸いです。
Dockerとは
Dockerとは、コンテナ型仮想化を行うためのソフトウェアプラットフォームのことです。
コンテナ型仮想化技術自体は古くからあり、Dockerはそのコンテナ型仮想化を簡易なコマンドで実行できるようにしたものです。これにより、アプリケーションを動かすための環境を即座に用意でき、不要になればすぐ削除するという動きができるようになりました。
Dockerを使う理由
上述したように、Dockerを使うことにより、アプリケーションを動かすための環境を即座に用意できるようになりました。これにより、開発スピードがあがることは確かですが、他にも以下のような利点があります。
- 複数立てたコンテナ同士は互いに干渉しないため、例えばPythonのバージョンが違う事によるプログラムの挙動の変化を考慮する必要がない。
- Docker Hub というプラットフォームから、企業および個人が作ったDockerイメージを自由にダウンロードでき、必要な環境を”ある程度”すぐに揃えられる。
- 自分が作った環境をDocker イメージととして書き出しておけば、それを他の人に与えることで全く同じ環境をすぐに作り出せる。
特に、複数人で作業をするプロジェクトなどでは、個々の環境の違いによってプログラム、アプリケーションの挙動の差異が出るのは好ましくありません。そこで、全く同じ環境を用意してあげることで、そのようなことに悩まされることなく開発をすることができます。
もちろん個人で使う場合であっても、自分のPCの環境を汚したくない等の理由で、Dockerを使って専用の開発環境を用意することで、安全に開発を行うことができます。
他の仮想化技術との違い
Dockerはコンテナ型仮想化技術を扱うためのプラットフォームですが、そもそもコンテナ型仮想化技術と他の仮想化技術(ハイパーバイザ型、ホスト型、準仮想化)との違いをまとめてみます。
- OSがインストールされた通常のハードウェア(物理サーバ)上に、仮想化ソフトウェアをインストールし、その上で仮想マシンを動作させる。有名なソフトウェアとしては以下。
- VirtualBox
- UTM
- 環境構築がしやすく、通常のアプリケーションをインストールする感覚で導入できる。
- ホストOS上で動かすため、処理性能が遅い。
- ホストOS上に、コンテナと呼ばれるアプリケーションを動かすために必要なモノ(サーバ、ミドルウェア、ライブラリ等)をひとまとめにしたものを作成する。有名なソフトウェアとしては以下。
- VMよりも起動が遥かに速く、また環境構築もコマンド一つで可能。
- ホストOSと異なるOSのシステムを動かすことは基本的に不可能(Windowsの場合はWindows Subsystem for Linux (WSL)を使うことでLinuxカーネルのOSを動かせる)
Dockerを使ってみよう!
Dockerについて学んだところで、実際にDockerを使ってみましょう。
Dockerのインストール
まず、Dockerの公式サイトにアクセスし、ページ内の [Docker Desktopをダウンロードする]にマウスオーバします。
そうすると、インストールできるOSが並ぶので、自分の環境にあったものをクリックしてインストーラをダウンロードします。

あとはインストーラの指示に従ってインストールすることで、Docker Desktopがインストールされます。
インストールがされたら、以下のコマンドでdockerのバージョンを確認してみましょう。
バージョン情報が出力されれば、無事インストールできてます。
$ docker -v
Docker version 20.10.17, build 100c701
コンテナを立てて接続してみよう
Docker Desktopのインストールが終わったら、早速コンテナを立ててみましょう。
プログラミング言語を勉強したときに、おそらく全員がやることとして「Hello World」と画面に出力させると思います。Dockerにも同じように、コンテナを初めて作るとき用のコンテナイメージが用意されています。
Dockerの公式が出してるhello-worldコンテナを起動してみます。
$ docker run hello-world
実際に実行すると、以下の出力を得ます。
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
198f93fd5094: Pull complete
Digest: sha256:a0dfb02aac212703bfcb339d77d47ec32c8706ff250850ecc0e19c8737b18567
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/
hello-worldイメージの処理自体は、「Hello from Docker!」から始まってます。それより上の5行は、dockerコマンドを使ってイメージを取得する場合に出力されるメッセージです。
意味を簡単にまとめると以下のようになります。
‘hello-world:latest’イメージがローカルにないから、library/hello-worldからダウンロードするよ。
今後も新しいイメージで docker run を走らせる場合は出てくるメッセージなので、覚えておきましょう。
さて、この hello-world イメージは、上記のメッセージをターミナルに出力すると自動で停止されます。実際、docker psで起動中のコンテナの一覧に表示されませんが、停止中のコンテナの一覧に表示されます。
- 起動中のコンテナの一覧
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 停止中のコンテナの一覧
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
093b9824c5da hello-world "/hello" 8 minutes ago Exited (0) 8 minutes ago modest_engelbart
それでは次に、hello-worldコンテナの出力にある docker run -it ubuntu bash
を実行してみましょう。以下、実行結果になります。
$ docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
cc43ec4c1381: Pull complete
Digest: sha256:9cbed754112939e914291337b5e554b07ad7c392491dba6daf25eef1332a22e8
Status: Downloaded newer image for ubuntu:latest
root@d2597f3c2c5c:/#
別のターミナルを開き、docker psコマンドを実行すると、コンテナが起動しているのがわかります。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d2597f3c2c5c ubuntu "bash" 13 seconds ago Up 13 seconds peaceful_pascal
また、今回実行したコマンドは、最新のubuntuイメージを取得して、ubuntu OSのコンテナを立ち上げるというコマンドです。オプションや引数が色々付いてるので、説明します。
- docker run
- 新しいコンテナを作成して起動します。
- -it オプション
- これは、 -i オプションと -t オプションをつなげて書いたものです。それぞれの説明は以下のとおりです。
- -i (–interactive): コンテナの標準入力を開いた状態を保ち、ユーザからの入力をコンテナに送る。
- -t (tty): 仮想端末を割り当てる。つまり、コンテナ内のシェルを普通のターミナルのように扱うようにする
- これは、 -i オプションと -t オプションをつなげて書いたものです。それぞれの説明は以下のとおりです。
- ubuntu
- ubuntu公式イメージの指定
- bash
- コンテナ内で実行するコマンド。ここではコンテナに接続したあとbashと自動入力して実行する(ubuntuの場合、この引数がなくても自動でbashを使うようになってるからあまり意味はない)
まとめると、
Ubuntuイメージから新しいコンテナを起動し、その中でbashを対話的に操作できる状態にする
というのが、このコマンドがやっていることです。もちろんubuntuの部分を変えることで、他のOS (AlamaLinux, Rocky Linux, debianなど)をOSにするコンテナを起動できます。
以上で、hello-worldとubuntuイメージを用いたコンテナ起動テストが終わったので、ダウンロードしたイメージを削除しておきましょう。
まず、停止済みのコンテナを削除します。以下のコマンドで、hello-world、ubuntuイメージで作ったコンテナのIDを確認します。
$ docker ps -a | grep -E "(hello|ubuntu)"
d2597f3c2c5c ubuntu "bash" 13 minutes ago Exited (0) 2 minutes ago peaceful_pascal
093b9824c5da hello-world "/hello" 47 minutes ago Exited (0) 47 minutes ago modest_engelbart
上記コマンド結果の一番左にあるIDを使って docker rm
コマンドを実行します(IDについては自身のターミナル画面に表示されている文字列を利用してください。)
$ docker rm d2597f3c2c5c
d2597f3c2c5c
$ docker rm 093b9824c5da
093b9824c5da
先ほど実行した docker ps コマンドをもう一度実行し、何も表示されなければOKです。
$ docker ps -a | grep -E "(hello|ubuntu)"
$
最後に、ダウンロードしたイメージを削除します。docker images
コマンドの結果の中から、hello-worldとubuntuイメージのIDを取得します。
$ docker images | grep -E "(hello|ubuntu)"
ubuntu latest b60cb74dfa1b 2 weeks ago 101MB
hello-world latest ca9905c726f0 4 weeks ago 5.2kB
あとはこの2つについて、 docker rmi
を実行すればOKです(IDについては自身のターミナル画面に表示されている文字列を利用してください。)
$ docker rmi b60cb74dfa1b
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:9cbed754112939e914291337b5e554b07ad7c392491dba6daf25eef1332a22e8
Deleted: sha256:b60cb74dfa1b0c0f6ed9a4aaaa3a56f6d04f7cc0cceb7b08ce2ad1803d29e61d
Deleted: sha256:187d2314ef56af033ce427b9fe84a085a232fb54127a75999f5173c057b6e225
$ docker rmi ca9905c726f0
Untagged: hello-world:latest
Untagged: hello-world@sha256:a0dfb02aac212703bfcb339d77d47ec32c8706ff250850ecc0e19c8737b18567
Deleted: sha256:ca9905c726f06de3cb54aaa54d4d1eade5403594e3fbfb050ccc970fd0212983
Deleted: sha256:50163a6b11927e67829dd6ba5d5ba2b52fae0a17adb18c1967e24c13a62bfffa
もう一度dokcer images
コマンドを実行し、何も表示されなければ無事削除されています。
$ docker images | grep -E "(hello|ubuntu)"
$
まとめ
今回は、Dockerのインストールから実際にコンテナを立ててみるところまで解説しました。dockerには他にも様々な機能があり、私も現在勉強中になります。コンテナ型仮想化を使いこなせるようになると、会社であれ個人であれ開発がかなりしやすくなると思うので、ぜひいろいろ触ってみてください。
それでは、ここまで読んでいただきありがとうございました!