1. HOME
  2. »
  3. プログラミング・Web
  4. »
  5. Docker
  6. »
  7. 【Docker入門】仮想マシンとコンテナの違いから仮想環境の構築まで

【Docker入門】仮想マシンとコンテナの違いから仮想環境の構築まで

DockerよりもDoctorXが好きです。失敗しかしない@It_is_Rです。

Dockerは仮想環境の構築や、アプリケーションの実行、配布などが可能なプラットフォームです。
VirtualBoxなどの仮想マシン技術とにていますが、Dockerではコンテナという技術を使って仮想環境を構築します。

今回はVirtualBoxなどの仮想マシンとの違いや、仮想環境の構築方法などを記事にしました。

Dockerについて

Docker社が開発する仮想環境を構築することができるプラットフォームです。
環境構築以外にも、アプリケーションの実行や配布も可能です。

Dockerではコンテナ技術による仮想化を行います。
コンテナ技術というのは仮想環境を構築する技術の一つです。
コンテナという仮想環境を構築します。

コンテナ技術と似たものとして、VirtualBoxなどで使われる仮想マシンの技術があります。
仮想マシンの技術では、仮想化ソフトを使い仮想マシンを立ち上げます。

ではコンテナと仮想マシンは一体何が違うのでしょうか。

仮想マシンとコンテナの違い

では仮想マシンとコンテナの違いを見ていきましょう。

仮想マシン

仮想マシン技術による仮想化にはホストOS型ハイパーバイザ型の方式があります。

ホストOS型

みなさんがよくやる、パソコン上で仮想マシンを立ち上げるのはホストOS型です。
普段使用しているWindowsやMacなどのOS(ホストOS)に仮想化ソフトをインストールして、そこに仮想マシンを立ち上げます。
Mac上でVirtualBoxを使ってWindowsを立ち上げたりしますね。

ホストOS型では元々コンピュータに入っているOS(ホストOS)上で仮想化ソフトを使い、その上で仮想マシンを立ち上げます。それぞれの仮想マシンでは、仮想マシン用のOS(ゲストOS)を必要とします。
docker

また、ホストOS上で動作する仮想化ソフトをハイパーバイザとする場合もありますが、狭義においてのハイパーバイザは以下で記すようにハードウェアに直接乗せるものを指します。

ハイパーバイザ型

ホストOS型に対して、ハイパーバイザ型はハードウェアに直接ハイパーバイザ(仮想化OS)を乗せ、その上で仮想マシンを立ち上げます。
個人ではあまり使わない方式です。
docker

以上が仮想マシンについてです。

コンテナ

コンテナ型の仮想化ソフトの代表的なものがDockerです。
Dockerでは、Docker Engineという仮想化ソフトがホストOS上で動作し、Docker Engine上にコンテナという仮想環境が立ち上がります。
先ほど紹介した仮想マシンとの大きな違いとして、ゲストOSを必要としない点が挙げられます。
ゲストOSを必要としないことで、使用する領域も少なく、コンテナを素速く起動、停止することができます。
docker

軽量、起動や停止が速い、などがDockerのメリットですが、デメリットもあります。
例えば、仮想マシンではMac上でWindowsを起動するといったことができますが、コンテナではできません。

Dockerのインストール

Dockerはdocker storeからダウンロードすることができます。
The docker store

上記ページのGet started with Dockerから、使用したいエディションを選択します。
Community Edition( CE )は無償で使うことができます。Enterprise Edition(EE)は料金がかかります。
まずは無償で使えるCommunity Edition( CE )を使うのがいいと思います。

では、Community Edition( CE )をクリックします。
Community Edition

ここで自分の環境に合ったDockerをダウンロードします。
私は普段Macを使っているので、ここではDocker Community Edition for Macをダウンロードしていきます。
docker store

エディションをクリックすると、下のような画面が表示されます。
このページからダウンロードできるのですが、ダウンロードにはログインが必要です。
今はまだログインしていないので、「Please Login To Download」と表示されています。

では「Please Login To Download」をクリックします。
docker store

以下のようなログイン画面が表示されます。
Docker IDを持っている場合、ここからログインできます。
docker

Docker IDを持っていない場合、「Create Account」からアカウントを作ることができます。
docker

以下のように「Welcome to the Docker Store」というページが開きます。
Docker ID、 Email、 Passwordを入力し、上2箇所にチェックを入れます。

「I would like to receive email updates from Docker, including its various services and products.」の部分は、Docker製品のアップデートをメールで知らせて欲しい場合はチェックを入れます。

reCAPTCHAの認証にもチェックし、Sign Upをクリックします。
docker

以下のような画面が表示されたら、メールを確認します。
docker

Dockerから「Please confirm email for your Docker ID」というメールが届きますので、「Confirm Your Email」をクリックします。

すると先ほどのダウンロードページに飛びます。
Please Login To Downloadをクリックします。
docker store

今度は先ほど作ったDocker IDとPasswordを入力してLoginをクリックします。
docker

Get Dockerをクリックすると、Dockerのダウンロードが開始されます。
docker

あとはダウンロードしたファイルを開き、インストールしましょう。

Dockerの立ち上げ

ダウンロードしたDockerを開くと、立ち上がりまでに少し時間がかかります。
このように「Docker is Starting」と表示されている場合は、まだDockerが立ち上がっていません。
docker

しばらく待つと「Docker is running」に切り替わります。
これでDockerコマンドが正常に動くようになります。
docker

Dockerのバージョンを確認する

Dockerのバージョンを確認するには以下のコマンドを使います。

$ docker --version
Docker version 18.06.1-ce, build e68fc7a

$ docker -v
Docker version 18.06.1-ce, build e68fc7a

$ docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:21:31 2018
 OS/Arch:           darwin/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:29:02 2018
  OS/Arch:          linux/amd64
  Experimental:     true

イメージを取得と確認( docker pull, docker images)

docker pullコマンドで、Docker Hubからイメージを取得することができます。
Docker Hubというのは、イメージを公開したりダウンロードしたりすることができる、Docker社が運営するサービスです。

では実際にDocker Hubからイメージを取得してみましょう。
今回取得するイメージはhello-worldというイメージです。

$ docker pull hello-world   
Using default tag: latest
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete 
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

また取得したイメージを確認するにはdocker imagesコマンドを使います。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        7 weeks ago         1.84kB

コンテナの作成と確認( docker create, docker ps )

では先ほど取得したイメージからコンテナを作成してみます。
コンテナを作成するにはdocker createコマンドを使います。

$ docker create --name hello hello-world
f42f812e371ad2f3fe63287892a7141de1b7e6e7bca4c2d8c4f3ebcb2a841875

--name halloというのはdocker createコマンドのオプションで、作成するコンテナに名前をつけるものです。
つまり上記コマンドの意味は、hello-worldイメージからhelloという名前のコンテナを作成するという意味になります。

では作成したコンテナを確認してみましょう。
確認にはdocker psコマンドを使いますが、これは実行中のコンテナのみを表示するコマンドなので、-aというオプションを使います。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f42f812e371a        hello-world         "/hello"            7 seconds ago       Created                                 hello  

コンテナの起動( docker start )

では作成したコンテナを起動してみましょう。
コンテナの起動にはdocker startコマンドを使用します。

$ docker start -ia hello

Hello from Docker!
This message shows that your installation appears to be working correctly.
〜省略〜

「Hello from Docker!」と表示されれば成功です。
オプションとして-iaと入力しています。
-iはコンテナのSTDIN(標準入力)に、-aはSTDOUT(標準出力)、STDERR(標準エラー出力)にアタッチします。

しかし、イメージを取得して、コンテナを作って、立ち上げるという作業は大変ですよね。
そこで、これらのコマンドを一回で行ってくれるコマンドがあります。

……が、その前に今作成したコンテナを削除する方法を見ていきましょう。

コンテナの削除

コンテナの削除方法はいくつかあります。

docker rm

まずはdocker rmコマンドを使う方法です。
docker ps -aで表示される、削除したいコンテナのIDやコンテナ名を指定します。

$ docker rm 57b173c26517
57b173c26517

docker container prune

docker container pruneコマンドは、起動していないコンテナを削除するコマンドです。

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
e8013d8ba40964b6e6a573984b482a18710d37dbd9f28d1c7751a74157be07c3

Total reclaimed space: 0B

イメージの削除

取得したイメージの削除方法です。
イメージから作成したコンテナを削除しても、イメージは残ってしまいます。

イメージを削除するにはdocker rmiコマンドを使います。

$ docker rmi hello-world
Untagged: hello-world:latest
Untagged: [email protected]:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f
Deleted: sha256:428c97da766c4c13b19088a471de6b622b038f3ae8efa10ec5a37d6d31a2df0b

もしもコンテナがそのイメージを使用している場合、エラーになりますのでご注意ください。

docker run コマンド

では、docker pull, docker create, docker startを一回で実行してくれる、docker runコマンドを紹介します。docker runコマンドを使えば、イメージの取得、コンテナの作成、立ち上げまで一度のコマンドで行ってくれます。

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete 
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
〜省略〜

先ほどと同じように、「Hello from Docker!」と表示されています。

ローカルにWordPressの環境を作る

実用的な例として、ローカルにWordPress環境を作ってみましょう。
WordPressの環境を作るには、Networkという機能を使います。

Networkの作成

まず、WordPress専用のNetworkを作成してみましょう。
この例ではwp_networkをいうNetworkが作成されます。

$ docker network create wp_network
f4f56da9527c3ac70ac24696c7dcd123e41d9eea304f7c6ad75b98e320492226

MySQLコンテナの作成

次にMySQLコンテナを作成します。
--name mysqlはコンテナの名前を、--net wp_networkでは先ほど作成したネットワークを指定します。
-e MYSQL_ROOT_PASSWORD=p4ssw0rdは環境変数の指定です。
-dはデタッチモード(コンテナをバックグラウンドで実行)を指定します。
最後のmysql:5.7は、使用したいイメージを指定します。

$ docker run --name mysql --net wp_network -e MYSQL_ROOT_PASSWORD=p4ssw0rd -d mysql:5.7 
827a59398a0bbb0c5f29c967cb7dfaedd37e31ed9c44bd355c24bed2f744c51a

WordPressコンテナの作成

最後にWordPressコンテナを作成します。

$ docker run --name wp --net wp_network -e WORDPRESS_DB_PASSWORD=p4ssw0rd -d -p 8000:80 wordpress
9e4d9c9eb8447cf8187e3a086775bf7efa67048f9bf9ff507712ef8ec9713230

-p 8000:80はポート番号を指定しています。

docker psコマンドで確認してみると、このようになっています。

$ docker ps   
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                  NAMES
9e4d9c9eb844        wordpress           "docker-entrypoint.s…"   22 seconds ago       Up 21 seconds       0.0.0.0:8000->80/tcp   wp
827a59398a0b        mysql:5.7           "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp, 33060/tcp    mysql

ではhttp://localhost:8000/にアクセスしてみましょう。
下のような画面が表示されれば成功です。
docker

コンテナの停止

では最後に、先ほど作成したWordPress環境のコンテナを停止してみましょう。
停止するにはdocker stopコマンドを使用します。後ろには削除したいコンテナのIDか名前を入力します。

$ docker stop wp mysql

まとめ

Dockerを使うことで簡単に開発環境を構築することができます。
今回紹介したのはDockerの機能のほんの一部です。Dockerの機能はまだまだたくさんあります。
これ以外の機能は、後日別の記事で紹介させていただければと思います。

今回はDockerについての基本から、WordPress環境の構築までを紹介でした。

スポンサードリンク

関連コンテンツ

オススメ記事

Dockerでよく使うコマンドとオプション、その使い方を徹底解説!

人生に意味は求めない。それよりもDockerのコマンドの意味を理解する方が重要です。@It_is_Rです。 Dockerにはたくさんのコマンドがありますが、まずはよく使うコマンドを覚えていきまし

コメントをどうぞ!

メールアドレスが公開されることはありません。