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)を必要とします。
また、ホストOS上で動作する仮想化ソフトをハイパーバイザとする場合もありますが、狭義においてのハイパーバイザは以下で記すようにハードウェアに直接乗せるものを指します。
ハイパーバイザ型
ホストOS型に対して、ハイパーバイザ型はハードウェアに直接ハイパーバイザ(仮想化OS)を乗せ、その上で仮想マシンを立ち上げます。
個人ではあまり使わない方式です。
以上が仮想マシンについてです。
コンテナ
コンテナ型の仮想化ソフトの代表的なものがDockerです。
Dockerでは、Docker Engineという仮想化ソフトがホストOS上で動作し、Docker Engine上にコンテナという仮想環境が立ち上がります。
先ほど紹介した仮想マシンとの大きな違いとして、ゲストOSを必要としない点が挙げられます。
ゲストOSを必要としないことで、使用する領域も少なく、コンテナを素速く起動、停止することができます。
軽量、起動や停止が速い、などがDockerのメリットですが、デメリットもあります。
例えば、仮想マシンではMac上でWindowsを起動するといったことができますが、コンテナではできません。
Dockerのインストール
Dockerはdocker storeからダウンロードすることができます。
上記ページのGet started with Dockerから、使用したいエディションを選択します。
Community Edition( CE )は無償で使うことができます。Enterprise Edition(EE)は料金がかかります。
まずは無償で使えるCommunity Edition( CE )を使うのがいいと思います。
では、Community Edition( CE )をクリックします。
ここで自分の環境に合ったDockerをダウンロードします。
私は普段Macを使っているので、ここではDocker Community Edition for Macをダウンロードしていきます。
エディションをクリックすると、下のような画面が表示されます。
このページからダウンロードできるのですが、ダウンロードにはログインが必要です。
今はまだログインしていないので、「Please Login To Download」と表示されています。
では「Please Login To Download」をクリックします。
以下のようなログイン画面が表示されます。
Docker IDを持っている場合、ここからログインできます。
Docker IDを持っていない場合、「Create Account」からアカウントを作ることができます。
以下のように「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から「Please confirm email for your Docker ID」というメールが届きますので、「Confirm Your Email」をクリックします。
すると先ほどのダウンロードページに飛びます。
Please Login To Downloadをクリックします。
今度は先ほど作ったDocker IDとPasswordを入力してLoginをクリックします。
Get Dockerをクリックすると、Dockerのダウンロードが開始されます。
あとはダウンロードしたファイルを開き、インストールしましょう。
Dockerの立ち上げ
ダウンロードしたDockerを開くと、立ち上がりまでに少し時間がかかります。
このように「Docker is Starting」と表示されている場合は、まだDockerが立ち上がっていません。
しばらく待つと「Docker is running」に切り替わります。
これで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: hello-world@sha256: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/にアクセスしてみましょう。
下のような画面が表示されれば成功です。
コンテナの停止
では最後に、先ほど作成したWordPress環境のコンテナを停止してみましょう。
停止するにはdocker stop
コマンドを使用します。後ろには削除したいコンテナのIDか名前を入力します。
$ docker stop wp mysql
まとめ
Dockerを使うことで簡単に開発環境を構築することができます。
今回紹介したのはDockerの機能のほんの一部です。Dockerの機能はまだまだたくさんあります。
これ以外の機能は、後日別の記事で紹介させていただければと思います。
今回はDockerについての基本から、WordPress環境の構築までを紹介でした。